¿Cómo genero registros SSHFP?

39

Necesito configurar registros SSHFP en el DNS para mi host. He hecho algunas búsquedas pero no he encontrado ningún buen ejemplo.

  • ¿Qué son los registros SSHFP?
  • ¿Cómo son los registros SSHFP?
  • ¿Cómo creo registros SSHFP?
Mikael Dúi Bolinder
fuente

Respuestas:

49

¿Qué son los registros SSHFP?

Los registros RR SSHFP son registros DNS que contienen huellas digitales para claves públicas utilizadas para SSH. Se utilizan principalmente con dominios habilitados para DNSSEC. Cuando un cliente SSH se conecta a un servidor, verifica el registro SSHFP correspondiente. Si la huella digital de los registros coincide con los servidores, el servidor es legítimo y es seguro conectarse.

¿Cómo son los registros SSHFP?

Los registros SSHFP constan de tres cosas:

  1. Algoritmo
  2. Tipo de huella digital
  3. Huella digital (en hexadecimal)

Algoritmo

Hay cuatro algoritmos diferentes definidos en SSHFP a partir de 2015 . Cada algoritmo está representado por un número entero. Los algoritmos son:

  • 1 - RSA
  • 2 - DSA
  • 3 - ECDSA
  • 4 - Ed25519

Tipo de huella digital

Dos tipos de huellas digitales se definen en SSHFP a partir de 2012 . Cada tipo de huella digital está representado por un número entero. Estos son:

  • 1 - SHA-1
  • 2 - SHA-256

¿Cómo genero registros SSHFP?

Puede usar ssh-keygenpara generar los registros usando el -rparámetro, seguido del nombre de host (que no afecta las huellas digitales para que pueda especificar lo que quiera)

Ejemplo

Usando ssh-keygeny CentOS:

[root@localhost ~]# ssh-keygen -r my.domain.com
my.domain.com IN SSHFP 1 1 450c7d19d5da9a3a5b7c19992d1fbde15d8dad34
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

Nota

A veces se ssh-keygenle pedirá la ubicación del certificado público. Si se le solicita, deberá ejecutar ssh-keygenvarias veces y cada vez especificar un certificado diferente para asegurarse de generar todos los registros SSHFP necesarios. Sus claves públicas generalmente se encuentran en /etc/ssh.


Autenticación basada en DNS de entidades nombradas

La autenticación basada en DNS de entidades nombradas (DANE) ( RFC 6698 ) es un posible sucesor de SSHFP RR. DANE es muy similar a SSHFP RR pero no se limita a SSH. Utiliza TLSA RR en su lugar con un formato muy similar.

Mikael Dúi Bolinder
fuente
ssh-keygen -rtambién maneja registros de tipo ed25519 (usando el número experimental 4 de iana iana.org/assignments/dns-sshfp-rr-parameters/… )
Brian Minton
3
El servidor es legítimo o el servidor DNS está comprometido.
Michael Mior
7

No estoy seguro si ssh-keygenfunciona con claves existentes. Si no, aún puede ensamblarlos fácilmente en su shell (que prefiero), y sin sofisticados softwares o interfaces remotas.

A registros como los mencionados ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... existen de 6 partes:

part 1: hostname
part 2: Usually "IN" for internet
part 3: "SSHFP", the RR name for type 44
part 4: RSA keys     = "1"
        DSA keys     = "2"
        ECDSA keys   = "3"
        ED25519 keys = "4"
part 5: The algorithm type:
        SHA-1        = "1"
        SHA-256      = "2"
part 6: You can generate, for example:

        $ awk '{print $2}' /etc/ssh/ssh_host_dsa_key.pub | \
            openssl base64 -d -A | openssl sha1

Para usarlo, VerifyHostKeyDNS askingrese la configuración de su cliente SSH, por lo general ~/.ssh/config.

León
fuente
55
Para el registro, ssh-keygen -r no generar registros SSHFP para llaves existentes a pesar del hecho de que el nombre del comando indica que es sólo para la generación.
Celada
5

Las versiones anteriores de ssh-keygen no generan todas las claves disponibles (por ejemplo, no hay soporte para ecdsa y sha256). Este script crea todos los registros para todas las claves disponibles en /etc/ssh/:

#!/bin/bash
#
# Creates SSHFP Records for all available keys
#

HOST="${1-$(hostname -f)}"

if [[ "$1" == "-h" || "$1" == "--help" ]]
then
  echo "Usage: sshfpgen <hostname>"
fi

if which openssl >/dev/null 2>&1
then
  if ! which sha1sum >/dev/null 2>&1
  then
    sha1sum() {
      openssl dgst -sha1 | grep -E -o "[0-9a-f]{40}"
    }
  fi
  if ! which sha256sum >/dev/null 2>&1
  then
    sha256sum() {
      openssl dgst -sha256 | grep -E -o "[0-9a-f]{64}"
    }
  fi
fi

for pubkey in /etc/ssh/ssh_host_*_key.pub /etc/ssh_host_*_key.pub
do
  case "$(cut -d _ -f3 <<< "$pubkey")"
  in
    rsa)
      echo "$HOST IN SSHFP 1 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 1 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    dsa)
      echo "$HOST IN SSHFP 2 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 2 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ecdsa)
      echo "$HOST IN SSHFP 3 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 3 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
    ed25519)
      echo "$HOST IN SSHFP 4 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum  | cut -f 1 -d ' ')"
      echo "$HOST IN SSHFP 4 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum  | cut -f 1 -d ' ')"
    ;;
  esac
done

Editar: Nueva versión con PR de alex-dupuy con * soporte BSD.

https://github.com/mindfuckup/Scripts/blob/master/sshfpgen

usuario4814732
fuente
3

Si usa Puppet, facterha incorporado soporte para sshfp. Además, si está utilizando PuppetDB, puede extraer fácilmente esta información para todos sus hosts.

facter | grep -i sshfp
  sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
  SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
  sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
  SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc

Fuente

Drew Michel
fuente
3

Así es como obtengo mis registros SSHFP a través de Ansible :

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
Mike Schroll
fuente