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?

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.


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.


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


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.