Gerenciando entradas no arquivo known_hosts

Author:Mario Luiz Bernardinelli <mariolb _at_ gmail _dot_ com>
Version:0.1
Date:2017-08-23

O arquivo known_hosts armazena os nomes dos hosts e as chaves dos equipamentos acessados remotamente. Nas versões atuais do openssh, o parâmetro HashKnownHosts vem habilitado por padrão, o que faz com que as entradas do arquivo known_hosts não sejam mais armazenadas em texto em claro, mas sim os hashes dos nomes dos hosts (além, é claro, das chaves dos mesmos).

Para verificar a chave de um host acessado anteriormente, use o comando:

ssh-keygen -F NomeOuIPdoHost

Exemplo:

ssh-keygen   -F 192.168.1.101
# Host 192.168.1.101 found: line 50 type RSA
|1|DJ6YXFhfYFK8ukUkNCOXEc9QF3c=|tg+/RWiLASs/o6
tHRELd2W1G/b8= ssh-rsa AAAAB3NzaC1yc2EAAAABIw
AAAQEAlzmiNUQRcU/HlyRxVER+MJUqpk/ qIqkhzfM9Xr
qWf1BDzwISRjC7781QR5JrFeDxO9r3GSgZOTHCKkAH8m2d
3rWAJQ 6itBAoOPzLTZxX7sEUpTI5XF8+YrFRx+y83oKF
2xMB2pIKuWgeXKYIkb0+WsJTo 0JdNd5z4/RQVB7tQXE9
7MKqTy6ul6tm5oRPkNwTXEzsH+vFmy5XqAfqgsRcM975
l+BKXtath6uWrBaSsumQMvqgaiPZGVvtrIjplMe6Yoyv1A
mFy2o6ggqR9UO+Bu0 HAwxpAsFNGk2fDoFSL7t2MOzKQi
C57U5J+BkXUsvrzrOpfWUZq/oFGYbqg2R/xQ==

Algumas vezes, precisamos remover uma destas entradas em decorrência da troca da chave do equipamento remoto, como é o caso por exemplo, quando o arquivo known_hosts possui uma entrada com o mesmo nome ou endereço IP de um outro servidor. Isto ocorre comigo às vezes: acesso duas redes com o mesmo endereço (são dois clientes diferentes) e alguns servidores possuem o mesmo endereço IP. Nesta situação, quando vou acessar um servidor com o mesmo IP, preciso remover a chave do servidor do arquivo known_hosts.

Nesta situação, eu poderia simplesmente remover o arquivo known_hosts, mas isto chega a ser uma heresia do ponto de vista da segurança, porque sempre que acessamos um servidor via SSH que já tenha sido acessado anteriormente, se a chave (fingerprint) do servidor não conferir com a armazenada no arquivo known_hosts, somos avisados e o acesso é finalizado. Veja o exemplo:

mario@neo $ ssh root@192.168.1.100
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
    c4:21:35:34:9c:c8:5c:dd:bb:99:e6:1b:8b:5c:d8:6c.
Please contact your system administrator.
Add correct host key in /home/mario/.ssh/known_hosts to get rid of this message.
Offending key in /home/mario/.ssh/known_hosts:39
RSA host key for 192.168.1.100 has changed and you have requested strict checking.
Host key verification failed.
 mario@neo $

Isto é importante porque é uma forma de evitar ataques do tipo man-in-the-middle.

Por outro lado, se tivermos certeza de que o servidor é autêntico, por exemplo, devido a uma troca de placa de redes, devemos alterar a chave do servidor no nosso arquivo known_hosts. Uma forma de fazer isso é remover a chave do arquivo known_hosts, pois mo próximo acesso a nova chave será armazenada.

Se observarmos a mensagem do exemplo, veremos que a divergência ocorreu na linha 39 do arquivo. Poderíamos então editar o arquivo known_host e remover apenas a linha 39. Esta é a forma manual.

Há, no entanto, uma maneira mais elegante de fazer isso: basta usar o utilitário ssh-keygen com a opção -R seguida do nome (ou endereço) do host. Por exemplo, para remover a chave do host acessado no exmplo:

mario@neo $ ssh-keygen -R 192.168.1.100
/home/mario/.ssh/known_hosts updated.
Original contents retained as /home/mario/.ssh/known_hosts.old

No próximo acesso ao servidor 192.168.1.100, seremos novamente avisados que o este é o primeiro acesso ao servidor:

mario@neo ~$ ssh root@192.168.1.100
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
RSA key fingerprint is c4:21:35:34:9c:c8:5c:dd:bb:99:e6:1b:8b:5c:d8:6c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.100' (RSA) to the list of known hosts.
root@192.168.1.100's password:

Observe que o SSH nos avisa que o host remoto nunca foi acessado e nos pede a confirmação antes de adicionar a chave no arquivo known_hosts e prosseguir com o acesso.

Por padrão, o ssh-keygen irá acessar o arquivo de chaves armazenado em /home/usuario/.ssh/known_hosts. É possível especificar outro arquivo de chaves utilizando a opção -f nome do arquivo.

É isso!

Até a próxima,

Marião