mitago.net

Página web de Celso González

ssh fingerprints en el dns

A raíz de este artículo en Debian Administration me dediqué a asegurar que mi dns propaga la información del fingerprint del dns. Pero para el que no sepa de que va la historia y le de pereza leer el artículo en inglés un resumen rápido

La primera vez que te conectas desde un cliente a un servidor ssh te presenta la típica pantalla de:

$ssh mitago.net
The authenticity of host 'mitago.net (64.251.27.197)' can't be established.
RSA key fingerprint is ee:ef:dc:f4:a5:ca:f2:12:9d:b3:94:af:3c:88:4f:4d.
Are you sure you want to continue connecting (yes/no)?

Al menos la mayoría de gente que conozco contesta aquí que sí sin mirar, como mucho algunos recuerdan los primeros bytes del fingerprint, pero creo que ni el paranoico de guillem comprueba el fingerprint con algún método confiable como una hoja de papel. Pues bien, omitiendo métodos mucho más seguros como los que describen en el artículo (uso de known_hosts o de llaves usb con los fingerprints) podemos hacer que el cliente compruebe si la información del fingerprint coincide con la que tenemos guardada en el dns, concretamente en el registro SSHFP.

Configuración del dns

Para Bind tenemos dos opciones usando el programa sshfp o bien con la instrucción ssh-keygen de la siguiente forma

ssh-keygen -r $(hostname --fqdn) -f /etc/ssh/ssh_host_rsa_key.pub

lo que nos genera un registro compatible con bind que tendremos que meter en el fichero de configuración

Como yo utilizo tinydns tengo que recurrir a este otro programa que me genera una línea de texto con el formato necesario para el fichero data

#!/usr/bin/gawk -f
# taken from: http://msgs.securepoint.com/cgi-bin/get/djbdns-0702/5.html
# modified by Daniel Kahn Gillmor <dkg-debian.org@fifthhorseman.net>

# example: ssh_host_key_to_sshfp $(hostname --fqdn) </etc/ssh/ssh_host_rsa_key.pub
BEGIN {
   hostname=ARGV[1]
   keygen="ssh-keygen -gr " hostname " -f /dev/stdin"
   while(keygen | getline) {
      if($8) {
         rr=sprintf(":%s:44:\\%03.3o\\%03.3o", hostname, $6, $7)
         for(i=1; i<length($8); i+=2) {
            rr=sprintf("%s\\%03.3o", rr, strtonum("0x" substr($8, i, 2)))
         }
         print "# " $0
         print rr ":::"
      }
   }
}

Configuración del cliente ssh

Aunque podemos especificar a mano la opción -o "VerifyHostKeyDNS=yes" cada vez que abrimos una sesión lo más cómodo es meterlo dentro del archivo de configuración, para esto abrimos el fichero /etc/shh/ssh_config y añadimos una línea con el parámetro VerifyHostKeyDNS yes.

Pruebas de funcionamiento

Lo primero tenemos que asegurarnos que el servidor al que nos conectamos no está en el fichero de known_hosts ya que entonces no nos pedirá la información y si la cosa va bien veremos un mensaje como este:

$ssh mitago.net
The authenticity of host 'mitago.net (64.251.27.197)' can't be established.
RSA key fingerprint is ee:ef:dc:f4:a5:ca:f2:12:9d:b3:94:af:3c:88:4f:4d.
Matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

La diferencia importante es esta nueva línea Matching host key fingerprint found in DNS. que nos indica que el fingerprint coincide con el almacenado en el dns.

lun 12 marzo 2007 22:080 comentarios