Por que o SSH adiciona uma entrada known_host para um endereço IP?

18

Eu tenho um host chamado nms.example.org. No meu /etc/ssh/ssh_known_hostseu tenho uma entrada para o host com a chave RSA. Esta entrada e todas as outras entradas são gerenciadas pelo meu sistema de gerenciamento de configuração.

nms.example.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZqfmVPs/XqTS...

Também tenho uma entrada no meu /etc/ssh/ssh_configpara o host específico, definindo o alias da chave do host. Que, se eu entender tudo corretamente, isso significa que apenas o nms.example.orgque importa.

Host nms.example.org nms.example nms
    HostKeyAlias nms.example.org
    HostName nms.example.org

Por que, então, quando eu me conecto de um cliente, o ssh ainda parece achar necessário adicionar uma chave aos meus conhecimentos_hosts por usuário com o IP do host?

$ ssh nms -v
OpenSSH_6.0p1 Debian-4+deb7u4, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /home/zoredache/.ssh/config
debug1: /home/zoredache/.ssh/config line 61: Applying options for *
debug1: /home/zoredache/.ssh/config line 71: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 84: Applying options for nms
debug1: /etc/ssh/ssh_config line 363: Applying options for *
debug1: Connecting to nms.example.org [104.236.190.144] port 22.
debug1: Connection established.
debug1: identity file /home/zoredache/.ssh/zoredache-20140204.id_rsa type 1
...
debug1: Server host key: RSA 6b:5f:b6:e9:13:c3:b7:39:1e:ec:74:05:33:64:4d:5e
debug1: using hostkeyalias: nms.example.org
debug1: Host 'nms.example.org' is known and matches the RSA host key.
debug1: Found key in /etc/ssh/ssh_known_hosts:104
Warning: Permanently added the RSA host key for IP address '192.0.2.144' to the list of known hosts.
debug1: ssh_rsa_verify: signature correct
...

O SSH sabe que meu host é válido (consulte Host 'nms.example.org' is known and matches the RSA host key:). Por que ele adiciona a chave do IP a um perfil de usuário?

Isso é extremamente irritante, porque quando eu reinstalo uma máquina, meu sistema de gerenciamento de configurações gerencia a coleta e distribuição das chaves do host para todo o sistema. Porém, haverá essas chaves conflitantes associadas aos IPs nos arquivos conhecido_host por uso que causam avisos em uma tentativa de conexão que impedem a conexão de scripts.

$ ssh nms -v
OpenSSH_6.0p1 Debian-4+deb7u4, OpenSSL 1.0.1e 11 Feb 2013
...
debug1: Local version string SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u4
debug1: using hostkeyalias: nms.example.org
...
debug1: Server host key: RSA 6b:5f:b6:e9:13:c3:b7:39:1e:ec:74:05:33:64:4d:5e
debug1: using hostkeyalias: nms.example.org
debug1: Host 'nms.example.org' is known and matches the RSA host key.
debug1: Found key in /etc/ssh/ssh_known_hosts:104
Warning: the RSA host key for 'nms.example.org' differs from the key for the IP address '192.0.2.144'
Offending key for IP in /home/zoredache/.ssh/known_hosts:25
Matching host key in /etc/ssh/ssh_known_hosts:104
Are you sure you want to continue connecting (yes/no)?

Como posso impedir que o ssh armazene em cache esse valor por IP em cada usuário known_hosts? Ou há algum motivo de segurança pelo qual eu apenas tenho que viver com esse comportamento irritante? Isso também me frustra porque alguns servidores têm endereços IP um tanto dinâmicos. Meu gerenciamento de configuração lida com as atualizações de DNS. Mas eu deixo essas chaves de host por IP preenchendo meus arquivos known_host por usuário.

Zoredache
fonte

Respostas:

22

Eu acho que é para fazer o CheckHostIPtrabalho.

Se esse sinalizador estiver definido como "yes", o ssh (1) verificará adicionalmente o endereço IP do host no known_hostsarquivo. Isso permite que o ssh detecte se uma chave de host foi alterada devido à falsificação de DNS. Se a opção estiver definida como "não", a verificação não será executada. O padrão é "yes".

Você obtém diagnósticos um pouco melhores em caso de configuração incorreta ou ataque com essa opção, mas na verdade não melhora a segurança de nenhuma maneira que eu possa pensar.

Se você desativar CheckHostIP, o SSH (a partir do OpenSSH 6.7p1) não registrará o endereço IP quando você se conectar a um novo host por nome. Então adicione isso ao seu .ssh/config:

CheckHostIP no

Você pode adicioná-lo a uma Hostseção se desejar desativá-lo apenas para um host específico (especialmente um com um endereço IP dinâmico).

Gilles 'SO- parar de ser mau'
fonte
Sim, esta é a configuração que eu preciso.
Zoredache 25/05
Embora eu concorde com tudo o que você disse no @Gilles, tecnicamente eu diria (por uma boa discussão) que CheckHostIP yes isso melhora a segurança ... SE o usuário souber exatamente o que está fazendo, como o sistema usa esse parâmetro e os conceitos de confiança implícita. Então, eu realmente seria dividir os cabelos, que eu não vou fazer ... Eu vou guardá-lo para a segurança-se;)
0xSheepdog