
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?
Antwort1
Was sind SSHFP-Einträge?
SSHFP-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 bei Domänen mit aktiviertem DNSSEC verwendet. Wenn ein SSH-Client eine Verbindung zu einem Server herstellt, prüft er den entsprechenden SSHFP-Eintrag. Wenn der Fingerabdruck des Eintrags mit dem Server übereinstimmt, ist der Server legitim und die Verbindung ist sicher.
Wie sehen SSHFP-Datensätze aus?
SSHFP-Datensätze bestehen aus drei Dingen:
- Public-Key-Algorithmus
- Fingerabdrucktyp
- Fingerabdruck (in Hex)
Public-Key-Algorithmus
In SSHFP sind fünf verschiedene Algorithmen definiertStand 2021. Jeder Algorithmus wird durch eine Ganzzahl dargestellt.Die Algorithmen sind:
- 1 - RSA
- 2 - DSA
- 3 - Die ECDSA
- 4 - Ed25519
- 6 - Ed448
Fingerabdrucktyp
In SSHFP sind zwei Fingerabdrucktypen definiertwie 2012. Jeder Fingerabdrucktyp wird durch eine Ganzzahl dargestellt.Diese sind:
- 1 - SHA-1
- 2 - SHA-256
Wie erstelle ich SSHFP-Datensätze?
Sie könnenssh-keygenlokal, um die Datensätze mit dem -r
Parameter zu generieren, gefolgt vom Hostnamen (der die Fingerabdrücke nicht beeinflusst, Sie können also stattdessen angeben, was Sie möchten).
Sie können ssh-keyscan verwenden, um Datensätze für einen Remote-Server zu generieren -D
, indem Sie den Parameter gefolgt vom Hostnamen verwenden.
Beispiel
Verwenden ssh-keygen
von 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
Notiz
Manchmal ssh-keygen
wird nach dem Speicherort des öffentlichen Zertifikats gefragt. Wenn Sie danach gefragt werden, müssen Sie es ssh-keygen
mehrere Male ausführen und jedes Mal ein anderes Zertifikat angeben, um sicherzustellen, dass Sie alle erforderlichen SSHFP-Einträge generieren. Ihre öffentlichen Schlüssel befinden sich normalerweise in /etc/ssh
.
Antwort2
Ich bin nicht sicher, ob ssh-keygen
es mit vorhandenen Schlüsseln funktioniert. Wenn nicht, können Sie sie trotzdem problemlos in Ihrer Shell zusammenstellen (was ich bevorzuge) und zwar ohne ausgefallene Software oder Remote-Schnittstellen.
Ein Datensatz wie der erwähnte...
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
...besteht 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"
Ed448 keys = "6"
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 es zu nutzen, geben Sie VerifyHostKeyDNS ask
normalerweise die Konfiguration Ihres SSH-Clients ein ~/.ssh/config
.
Antwort3
Ältere Versionen von ssh-keygen generieren nicht alle verfügbaren Schlüssel (z. B. 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 ' ')"
;;
ed448)
echo "$HOST IN SSHFP 6 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 6 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
esac
done
Bearbeiten: Neue Version mit PR von alex-dupuy mit *BSD-Unterstützung.
Antwort4
Wenn Sie Puppet verwenden, facter
verfügt es über integrierte Unterstützung fürsshfp
. Wenn Sie PuppetDB verwenden, können Sie diese Informationen außerdem problemlos 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