Come posso generare record SSHFP?


39

Devo configurare i record SSHFP nel DNS per il mio host. Ho fatto qualche ricerca ma non ho trovato nessun buon esempio.

  • Cosa sono i record SSHFP?
  • Che aspetto hanno i record SSHFP?
  • Come posso creare record SSHFP?

Risposte:


49

Cosa sono i record SSHFP?

I record RR SSHFP sono record DNS che contengono le impronte digitali per le chiavi pubbliche utilizzate per SSH. Sono utilizzati principalmente con domini abilitati DNSSEC. Quando un client SSH si connette a un server, controlla il record SSHFP corrispondente. Se l'impronta digitale dei record corrisponde ai server, il server è legittimo ed è sicuro connettersi.

Che aspetto hanno i record SSHFP?

I record SSHFP consistono di tre cose:

  1. Algoritmo
  2. Tipo di impronta digitale
  3. Impronta digitale (in esadecimale)

Algoritmo

Esistono quattro diversi algoritmi definiti in SSHFP a partire dal 2015 . Ogni algoritmo è rappresentato da un numero intero. Gli algoritmi sono:

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

Tipo di impronta digitale

A partire dal 2012, in SSHFP sono definiti due tipi di impronte digitali . Ogni tipo di impronta digitale è rappresentato da un numero intero. Questi sono:

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

Come posso generare record SSHFP?

È possibile utilizzare ssh-keygenper generare i record utilizzando il -rparametro, seguito dal nome host (che non influisce sulle impronte digitali, quindi è possibile specificare quello che preferisci)

Esempio

Utilizzando ssh-keygene 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 volte ssh-keygenchiederà l'ubicazione del certificato pubblico. Se richiesto, dovrai eseguire ssh-keygenpiù volte e ogni volta specificare un certificato diverso per assicurarti di generare tutti i record SSHFP necessari. Le tue chiavi pubbliche si trovano di solito in /etc/ssh.


Autenticazione basata su DNS di entità denominate

L'autenticazione basata su DNS di entità denominate (DANE) ( RFC 6698 ) è un potenziale successore di SSHFP RR. DANE è molto simile a RR SSHFP ma non è limitato a SSH. Utilizza TLSA RR invece con un formato molto simile.


ssh-keygen -rgestisce anche i record di tipo ed25519 (usando il numero sperimentale 4 di iana iana.org/assignments/dns-sshfp-rr-parameters/… )
Brian Minton,

3
Il server è legittimo o il server DNS è compromesso.
Michael Mior,

7

Non sono sicuro che ssh-keygenfunzioni con le chiavi esistenti. Altrimenti puoi ancora facilmente assemblarli nella tua shell (che preferisco) e senza software fantasioso o interfacce remote.

Un record come menzionato ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... esistono 6 parti:

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

Per usarlo, inserisci VerifyHostKeyDNS askla configurazione del tuo client SSH, di solito ~/.ssh/config.


5
Per la cronaca, ssh-keygen -r non genera record SSHFP per chiavi esistenti, nonostante il fatto che il nome del comando suggerisce è solo per la generazione.
Celada,

5

Le versioni precedenti di ssh-keygen non generano tutte le chiavi disponibili (es. Nessun supporto per ecdsa e sha256). Questo script crea tutti i record per tutte le chiavi disponibili in /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

Modifica: nuova versione con PR di alex-dupuy con supporto * BSD.

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


3

Se usi Puppet, facterha il supporto integrato per sshfp. Inoltre, se stai usando PuppetDB puoi estrarre facilmente queste informazioni per tutti i tuoi host.

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

fonte


3

Ecco come ottengo i miei record SSHFP tramite Ansible :

- name: Capture the SSHFP entries
  shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
  register: sshfp_entries
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.