Wie erstelle ich SSHFP-Datensätze?

39

Ich muss SSHFP-Einträge im DNS für meinen Host einrichten. Ich habe ein bisschen gesucht, aber kein gutes Beispiel gefunden.

  • Was sind SSHFP-Einträge?
  • Wie sehen SSHFP-Datensätze aus?
  • Wie erstelle ich SSHFP-Einträge?
Mikael Dúi Bolinder
quelle

Antworten:

49

Was sind SSHFP-Einträge?

SSHFP-RR-Einträge sind DNS-Einträge, die Fingerabdrücke für öffentliche Schlüssel enthalten, die für SSH verwendet werden. Sie werden hauptsächlich mit DNSSEC-fähigen Domänen verwendet. Wenn ein SSH-Client eine Verbindung zu einem Server herstellt, überprüft er den entsprechenden SSHFP-Datensatz. Wenn der Fingerabdruck der Datensätze mit den Servern übereinstimmt, ist der Server legitim und es ist sicher, eine Verbindung herzustellen.

Wie sehen SSHFP-Datensätze aus?

SSHFP-Datensätze bestehen aus drei Dingen:

  1. Algorithmus
  2. Fingerabdrucktyp
  3. Fingerabdruck (in hex)

Algorithmus

Ab 2015 sind in SSHFP vier verschiedene Algorithmen definiert . Jeder Algorithmus wird durch eine ganze Zahl dargestellt. Die Algorithmen sind:

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

Fingerabdrucktyp

In SSHFP sind ab 2012 zwei Fingerabdrucktypen definiert . Jeder Fingerabdrucktyp wird durch eine ganze Zahl dargestellt. Diese sind:

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

Wie erstelle ich SSHFP-Datensätze?

Sie können verwenden ssh-keygen, um die Datensätze mit dem -rParameter gefolgt vom Hostnamen zu generieren (der sich nicht auf die Fingerabdrücke auswirkt, sodass Sie angeben können, was Sie möchten).

Beispiel

Verwenden ssh-keygenund 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

Hinweis

Manchmal ssh-keygenwerden Sie nach dem Speicherort des öffentlichen Zertifikats gefragt. Wenn Sie dazu aufgefordert werden, müssen Sie ssh-keygenmehrmals ausführen und jedes Mal ein anderes Zertifikat angeben, um sicherzustellen, dass Sie alle erforderlichen SSHFP-Datensätze generieren. Ihre öffentlichen Schlüssel befinden sich normalerweise in /etc/ssh.


DNS-basierte Authentifizierung benannter Entitäten

Die DNS-basierte Authentifizierung von benannten Entitäten (DANE) ( RFC 6698 ) ist ein potenzieller Nachfolger von SSHFP RR. DANE ist SSHFP RR sehr ähnlich, ist aber nicht auf SSH beschränkt. Stattdessenwird TLSA RR mit einem sehr ähnlichen Format verwendet.

Mikael Dúi Bolinder
quelle
ssh-keygen -rVerarbeitet auch Datensätze vom Typ ed25519 (unter Verwendung der experimentellen Nummer 4 von iana iana.org/assignments/dns-sshfp-rr-parameters/… )
Brian Minton
3
Der Server ist legitim oder der DNS-Server ist kompromittiert.
Michael Mior
7

Ich bin nicht sicher, ob es ssh-keygenmit vorhandenen Schlüsseln funktioniert. Wenn nicht, können Sie sie immer noch einfach in Ihrer Shell (die ich bevorzuge) und ohne ausgefallene Software oder Remote-Schnittstellen zusammenbauen.

Ein Rekord wie erwähnt ...

my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4

... bestehen aus 6 Teilen:

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

Um davon Gebrauch zu machen VerifyHostKeyDNS ask, geben Sie normalerweise die Konfiguration Ihres SSH-Clients ein ~/.ssh/config.

Löwe
quelle
5
Für die Aufzeichnung ssh-keygen -r nicht erzeugen SSHFP Datensätze für vorhandene Schlüssel trotz der Tatsache , dass der Name des Befehls zur Erzeugung es nur vermuten läßt.
Celada
5

Ältere Versionen von ssh-keygen generieren nicht alle verfügbaren Schlüssel (zB keine Unterstützung für ecdsa und sha256). Dieses Skript erstellt alle Datensätze für alle verfügbaren Schlüssel 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

Edit: Neue Version mit PR von alex-dupuy mit * BSD-Unterstützung.

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

user4814732
quelle
3

Wenn Sie Marionette verwenden, facterhat Unterstützung für eingebaut sshfp. Wenn Sie PuppetDB verwenden, können Sie diese Informationen ganz einfach für alle Ihre Hosts extrahieren.

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

Quelle

Drew Michel
quelle
3

So erhalte ich meine SSHFP-Einträge über Ansible :

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