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?
Ich muss SSHFP-Einträge im DNS für meinen Host einrichten. Ich habe ein bisschen gesucht, aber kein gutes Beispiel gefunden.
Antworten:
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.
SSHFP-Datensätze bestehen aus drei Dingen:
Ab 2015 sind in SSHFP vier verschiedene Algorithmen definiert . Jeder Algorithmus wird durch eine ganze Zahl dargestellt. Die Algorithmen sind:
In SSHFP sind ab 2012 zwei Fingerabdrucktypen definiert . Jeder Fingerabdrucktyp wird durch eine ganze Zahl dargestellt. Diese sind:
Sie können verwenden ssh-keygen
, um die Datensätze mit dem -r
Parameter gefolgt vom Hostnamen zu generieren (der sich nicht auf die Fingerabdrücke auswirkt, sodass Sie angeben können, was Sie möchten).
Verwenden ssh-keygen
und 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
Manchmal ssh-keygen
werden Sie nach dem Speicherort des öffentlichen Zertifikats gefragt. Wenn Sie dazu aufgefordert werden, müssen Sie ssh-keygen
mehrmals 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
.
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.
Ich bin nicht sicher, ob es ssh-keygen
mit 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
.
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.
Ä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.
Wenn Sie Marionette verwenden, facter
hat 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
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
ssh-keygen -r
Verarbeitet auch Datensätze vom Typ ed25519 (unter Verwendung der experimentellen Nummer 4 von iana iana.org/assignments/dns-sshfp-rr-parameters/… )