MLB"Os analfabetos do próximo século não são aqueles que não sabem ler ou escrever, mas aqueles que se recusam a aprender, reaprender e voltar a aprender. "
Alvin Toffler, futurologista

Gerenciando entradas no arquivo known_hosts

02/04/2010 - 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_hosts 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