Falha na configuração de impressões digitais ssh no DNS para substituir o known_hosts


13

Os registros SSHFP foram gerados no servidor ssh da seguinte forma e adicionados à zona na ligação:

$ ssh-keygen -r www.test.us.
www.test.us. IN SSHFP 1 1 ad04dfaf343a93beeb939eed1612168f7eadbed7
www.test.us. IN SSHFP 2 1 432209c72c4f0e99546d601dd96c04ce804191f9

Os registros necessários podem ser obtidos do cliente ssh via DNS, como mostrado:

$ dig www.test.us any
;; QUESTION SECTION:
;www.test.us.           IN  ANY

;; ANSWER SECTION:
www.test.us.        120 IN  SSHFP   1 1 AD04DFAF343A93BEEB939EED1612168F7EADBED7
www.test.us.        120 IN  SSHFP   2 1 432209C72C4F0E99546D601DD96C04CE804191F9
www.test.us.        120 IN  A   192.168.1.50

No entanto, o ssh no cliente falha ao encontrá-los ao conectar:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes www
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /Users/test/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 53: Applying options for *
debug1: Connecting to www [192.168.1.50] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p2_hpn13v11
debug1: match: OpenSSH_5.8p2_hpn13v11 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c
DNS lookup error: name does not exist
The authenticity of host 'www (192.168.1.50)' can't be established.
RSA key fingerprint is 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Alguma idéia de por que isso está falhando? Sei que o DNSSEC é necessário para torná-lo seguro e que devo receber um aviso, pois o DNSSEC não está ativado no momento. Espero que isso funcione sem o DNSSEC antes de começar a abordar isso como um problema adicional.

O servidor ssh é o FreeBSD 9.1 com OpenSSH_5.8p2_hpn13v11 e também hospeda DNS usando o BIND 9.8.3-P4. Eu tentei me conectar do OS X 10.8.2 com o OpenSSH_5.9p1, bem como do Arch Linux 3.6.10-1-ARCH com o OpenSSH_6.1p1.

Atualizar

Em uma tentativa adicional de solucionar isso, levantei uma nova VM do OpenBSD 5.2 que possui o OpenSSH_6.1 embutido como um servidor ssh. Como todas as outras implementações do servidor OpenSSH são apenas portas do OpenBSD, certamente isso deve funcionar. No servidor, eu giro os registros SSHFP:

# ssh-keygen -r vm1.test.us.  
vm1.test.us. IN SSHFP 1 1 419c5338920e11183380d81f002fc998389b944f
vm1.test.us. IN SSHFP 1 2 cb5bbbf5aef231f57a1a4dcf1e790f1be032b124d0d591023f33cfd5f91ec556
vm1.test.us. IN SSHFP 2 1 0fdf92ce946b5cfee5f96a3e1ef710edc50280ff
vm1.test.us. IN SSHFP 2 2 f2ee7334ee9f9a426f51f20af8f4bc7155d567c9d38a6bffaa6c643af405711e
vm1.test.us. IN SSHFP 3 1 b5e94320f0bc0b46cc6627ca7221679a65c79962
vm1.test.us. IN SSHFP 3 2 60704213a0bbd8dae813d113bfe4ae190a780b89836e6e1c567b7cfde89805f8

Eu os adiciono ao servidor de ligação do FreeBSD e recarrego o nome. Em seguida, teste para ver se consigo acessar os registros:

$ host -t any vm1
vm1.test.us has SSHFP record 1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us has SSHFP record 1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us has SSHFP record 2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us has SSHFP record 2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us has SSHFP record 3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us has SSHFP record 3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us has address 192.168.1.60


$ dig -t any vm1.test.us
;; QUESTION SECTION:
;vm1.test.us.           IN  ANY

;; ANSWER SECTION:
vm1.test.us.        120 IN  SSHFP   1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us.        120 IN  SSHFP   2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us.        120 IN  SSHFP   2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us.        120 IN  SSHFP   3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us.        120 IN  SSHFP   3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us.        120 IN  SSHFP   1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us.        120 IN  A   192.168.1.60

Os registros estão sendo claramente exibidos no DNS, então tento usar o ssh:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes root@vm1
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to vm1 [192.168.1.60] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.1
debug1: match: OpenSSH_6.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f
DNS lookup error: name does not exist
The authenticity of host 'vm1 (192.168.1.60)' can't be established.
RSA key fingerprint is d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? 

Neste ponto, acho que é seguro eliminar os clientes e servidores ssh como o ponto de falha. Em vez disso, vou focar no servidor DNS. A menos que alguém tenha uma sugestão de onde procurar, acho que estou preso em capturar pacotes e vasculhá-los para encontrar pistas.

Update2

Ok, aqui estão os resultados das minhas capturas de pacotes. ssh www; falha com o padrão

No matching host key fingerprint found in DNS.

e a captura de pacotes mostra que o DNS falha ao retornar um registro para a pesquisa.

mbp13.test.us   www.test.us DNS Standard query 0x1c5e  SSHFP www
www.test.us   mbp13.test.us DNS Standard query response 0x1c5e No such name

Compare com ssh www.test.us; que também falha com a mensagem

No matching host key fingerprint found in DNS.

no entanto, a captura de pacotes mostra que o DNS realmente retorna o registro.

mbp13.test.us   www.test.us DNS Standard query 0x0ebd  SSHFP www.test.us
www.test.us   mbp13.test.us DNS Standard query response 0x0ebd  SSHFP SSHFP`

Primeiro, é um pouco desconcertante que a mensagem de erro seja a mesma nos dois casos. Posso adicionar alguns registros para corrigir o caso 1, onde nenhum registro é retornado, mas o grande problema é o caso 2. O DNS funciona e os registros SSHFP estão sendo retornados ao cliente ssh. Nenhum pacote é enviado após a resposta da consulta DNS e o cliente ssh exibe imediatamente a mensagem de impressão digital sem correspondência. Isso significa que todos os clientes ssh com os quais estou testando estão com problemas ou a impressão digital armazenada no DNS está errada e não corresponde. Duvido que sejam os clientes, por que a impressão digital no DNS está errada? As impressões digitais foram geradas a partir do ssh tools ssh-keygen, conforme descrito no início deste post. Além disso, o problema não é ajudado pelo fato de as impressões digitais serem exibidas em diferentes formatos, dependendo do contexto.

DNS record format:      ad04dfaf343a93beeb939eed1612168f7eadbed7
ssh client mesg format: 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c

Alguém tem alguma sugestão de por que as impressões digitais geradas pelo ssh-keygen -r não correspondem às chaves públicas retornadas pelo mesmo servidor ssh?

Update3

Estou na minha última opção. A menos que alguém me aponte na direção certa antes do final de semana, passarei meu sábado criando um ambiente duplicado usando VMs totalmente baseadas em OpenBSD. Como o OpenBSD possui o OpenSSH, isso teria que ser condições ideais para o SSHFP sobre DNS funcionar. Se um servidor OpenBSD OpenSSH com bind atendendo a um cliente OpenBSD OpenSSH não funcionar, o SSHFP será quebrado conforme implementado e eu moverei as coisas para os fóruns do OpenBSD e, possivelmente, apresentarei um relatório de erro. Ainda espero que esteja perdendo algo óbvio e que uma resposta útil salve meu fim de semana.


Você tentou se conectar para se conectar explicitamente www.test.us?
— Ulrich Dangel

Sim. Desculpe, eu deveria ter mencionado que tentei todas as variações: ssh www; ssh www.test.us; ssh www.test.us .; Todos eles resultam na mesma resposta.
— Michael Yasumoto

Pode ser interessante ver no Wireshark / tcpdump o que está sendo consultado no servidor DNS e qual resposta é enviada. Conhecer as perguntas e respostas exatas deve ajudar a encontrar o problema.
— Gert van den Berg

Gert, respondi em uma atualização acima porque não consegui encaixar a resposta nesta caixa de comentários.
— Michael Yasumoto

Tente conectar-se diretamente pelo endereço IP - para mim parece sshconfuso com os registros DNS que não correspondem ao nome do host que você está tentando acessar.
— Peterph

Respostas:


5

Aparentemente, meus problemas foram causados ​​por dois problemas diferentes.

Problema nº 1 O SSHFP não oferece suporte ao uso de caminhos de pesquisa. Portanto, se você adicionar "domain example.com" ao /etc/resolv.conf, esperaria que o ssh myhost funcionasse com o SSHFP, já que o ssh regular resolverá corretamente o nome para myhost.example.com. Aparentemente, os desenvolvedores do OpenBSD estão cientes do problema desde que um patch foi lançado há 2 anos, mas nunca foi aplicado. Em vez disso, foi sugerido um hack ssh_config, mas isso também não parece funcionar. Portanto, a solução para o primeiro problema é que o FQDN sempre deve ser usado com o SSHFP.

Edição 2 Usando FQDNs para resolver o problema anterior, tudo funcionará se eu usar a versão atual do cliente OpenSSH, que é o OpenSSH_6.1. O cliente OpenSSH_5.8p2 no meu sistema FreeBSD pode encontrar os registros SSHFP para um novo servidor OpenSSH_6.1, mas não consegue corresponder a impressão digital que recebe do DNS com a que recebe do servidor. O cliente OpenSSH_5.9p1 na minha máquina OS X 10.8.2 não consegue recuperar os registros SSHFP para um novo servidor OpenSSH_6.1, apesar de nunca ser uma versão do cliente que a máquina FreeBSD. Obviamente, é incapaz de corresponder os registros SSHFP inexistentes com a impressão digital retornada pelo servidor OpenSSH. Por fim, o ssh-keygen na caixa do FreeBSD produz registros SSHFP ruins, de acordo com os clientes OpenSSH_6.1, que reclamam de um ataque MITM, pois não t corresponde à impressão digital retornada pelo servidor. A solução parece ser que você deve executar a versão atual do cliente e servidor OpenSSH para que o SSHFP funcione. O uso de uma versão mais antiga do cliente ou do servidor está causando problemas.

Considerações finais O uso do SSHFP com DNS é aparentemente muito avançado para ser usado em um ambiente de sistema operacional misto e ter tudo "simplesmente funcionado", pois os sistemas operacionais não-OpenBSD precisam portar o OpenSSH portable, que está desatualizado no momento em que é portado. Talvez em 3 a 5 anos, o SSHFP seja estável o suficiente para que mesmo as versões mais antigas portadas para outros sistemas operacionais também sejam estáveis ​​e compatíveis com a versão mais recente.


2
Apesar do fato de o OS X (10.9) agora incluir uma versão 6.X do OpenSSH, o SSHFP ainda não funciona devido a uma implementação quebrada do OS X, conforme relatado pelo GitHub. A substituição por um cliente OpenSSH diferente, como o MacPorts, é a única solução atualmente.
— Michael Yasumoto

0

O nome do host do servidor ao qual o SSH está se conectando deve corresponder exatamente ao nome do host no registro SSHFP. Ou seja, não é suficiente apenas para os dois nomes de host resolverem o mesmo endereço IP. Portanto, ssh wwwnão funcionará para SSHFP's que são para www.test.us., a menos que www esteja na sua configuração SSH como esta:

Host www
    Hostname www.test.us

Tente ssh www.test.us.


1
Desculpe, mas parece que você não leu minha postagem completa acima. Testei usando nomes de domínio totalmente qualificados (FQDN) e esse não foi o problema.
— Michael Yasumoto

0

Você precisa fornecer o nome do arquivo da chave pública do serviço para o qual está criando registros DNS. Caso contrário, ele usará seu (s) arquivo (s) de chave pública pessoal de .ssh / *. Pub como fallback padrão.

ssh-keygen -r vm1.test.us -f /etc/ssh/ssh_host_rsa_key.pub
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.