Pesquisa reversa de DNS para corresponder o nome do host em authorized_keys

0

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.

    
por Jabari Dash 16.02.2018 / 15:09

1 resposta

0

Tente o seguinte comando awk:

nslookup $client_ip | awk '/name =/ { split($4,add,".") } END { print add[1]}'

Isso executará o comando nslookup, procurará todas as linhas com nomes = e, em seguida, dividirá o campo de espaço delimitado por espaço 4 com. colocando os resultados na matriz adicionar. Em seguida, imprimimos o primeiro elemento da matriz para revelar o nome do host da última entrada encontrada.

    
por 16.02.2018 / 15:26

Tags