Eu tenho vários laptops sysadmin e um cluster de servidores. Estou administrando / girando chaves ssh nos servidores de um script (chame-o rotate_keys.sh
) que será executado em qualquer um dos laptops sysadmin.
Estabeleci a regra de que cada servidor reterá no máximo 1 (a mais recente) chave ssh de um determinado laptop sysadmin.
As chaves ssh são armazenadas no arquivo authorized_keys
que assume o formato:
key1 user@device1-hostname
key2 user@device2-hostname
key3 user@device3-hostname
Cada servidor tem um script (chame-o de update_keys.sh
) que, após a execução via ssh, removerá todas as chaves associadas à máquina atualmente conectada a ele. Eu (tento) fazer isso removendo todas as linhas que contêm o nome do host de um determinado cliente.
sed -i "/$client_hostname/d" authorized_keys
No servidor, eu pego o nome do host do cliente fazendo uma pesquisa reversa do DNS no endereço IP da variável de ambiente $SSH_CONNECTION
(que está configurada no início da sessão ssh).
client_ip=$(echo $SSH_CONNECTION | awk '{print $1}')
client_hostname=$(nslookup $client_ip \
| tail -2 \
| head -1 \
| awk '{print $4}')
Isso retorna um nome de host no formato:
device-hostname.router-hostname.
Por falta de um termo melhor, ele me fornece um "nome completo do host".
No entanto, os nomes de host no authorized_keys
omitem o nome do host do roteador (sub-rede) ao qual esses dispositivos estão conectados. Eles simplesmente aparecem como:
device-hostname
Então, quando executo o seguinte comando delete, nada corresponde.
sed -i "/$client_hostname/d" authorized_keys
Existe uma maneira de forçar o daemon ssh a registrar nomes de host "totalmente qualificados". Ou existe uma ferramenta para pesquisa de DNS que só me dará o nome do dispositivo, menos os nomes de host dos roteadores aos quais ele está conectado?
Eu prefiro uma das duas abordagens acima do que desativar o dns reverso no daemon ssh (nos servidores) porque isso exigiria que meus laptops sysadmin tivessem ips estáticos.