J'ai besoin de configurer des enregistrements SSHFP dans le DNS pour mon hôte. J'ai fait des recherches mais je n'ai trouvé aucun bon exemple.
Les enregistrements SSHFP sont des enregistrements DNS contenant des empreintes digitales pour les clés publiques utilisées pour SSH. Ils sont principalement utilisés avec les domaines compatibles DNSSEC. Lorsqu'un client SSH se connecte à un serveur, il vérifie l'enregistrement SSHFP correspondant. Si l'empreinte digitale correspond aux serveurs, le serveur est légitime et il est prudent de se connecter.
Les enregistrements SSHFP comprennent trois choses:
Il existe quatre algorithmes différents définis dans le SSHFP à compter de 2015. Chaque algorithme est représenté par un entier. Les algorithmes sont:
Deux types d'empreintes digitales sont définis dans SSHFP à compter de 2012. Chaque type d'empreinte digitale est représenté par un entier. Ceux-ci sont:
Vous pouvez utiliser ssh-keygen
Pour générer les enregistrements à l'aide de -r
Paramètre, suivi du nom d'hôte (qui n'affecte pas les empreintes digitales afin que vous puissiez spécifier ce que vous préférez à la place)
À l'aide de ssh-keygen
et 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
Parfois ssh-keygen
demandera l'emplacement du certificat public. Si cela le demande, vous devrez courir ssh-keygen
Plusieurs fois et chaque fois Spécifiez un certificat différent pour vous assurer de générer tous les enregistrements SSHFP nécessaires. Vos clés publiques sont généralement situées dans /etc/ssh
.
authentification basée sur DNS des entités nommées (Dane) ( RFC 6698 ) est un successeur potentiel de SSHFP RR. Dane est très similaire à SSHFP RR mais n'est pas limité à SSH. Il utilise TLSA RR au lieu d'un format très similaire.
Je ne suis pas sûr si ssh-keygen
fonctionne avec les clés existantes. Sinon, vous ne pouvez toujours pas les assembler facilement dans votre coquille (que je préfère) et sans logiciel de fantaisie ou interfaces distantes.
Un enregistrement tel que mentionné ...
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
... existent de 6 parties:
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
Pour en utiliser, mettez VerifyHostKeyDNS ask
Dans votre configuration de votre client SSH, généralement ~/.ssh/config
.
Les anciennes versions de SSH-Keygen ne génèrent pas toutes les clés disponibles (par exemple, aucun support pour ECDSA et SHA256). Ce script crée tous les enregistrements de toutes les clés disponibles dans /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
Modifier: nouvelle version avec PR d'Alex-Dupuy avec * BSD Support.
Voici comment je reçois mes disques SSHFP à travers ansibles :
- name: Capture the SSHFP entries
Shell: "ssh-keygen -r {{ ansible_nodename }}|awk '{print $4, $5, $6}'"
register: sshfp_entries
Si vous utilisez la marionnette, facter
a pris en charge le support sshfp
. De plus, si vous utilisez PUPPETDB, vous pouvez facilement extraire ces informations pour tous vos hôtes.
facter | grep -i sshfp
sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc