Ceci est une ancienne révision du document !
Signer des clés ssh par un certificat
Création des autorités
Clé que l'on utilisera pour signer la clé du serveur sshd :
ssh-keygen -t ed25519 -f host_ca -C "Host Certificate Authority"
Clé qui signera les clés des users autorisé·es à se connecter au serveur :
ssh-keygen -t ed25519 -f user_ca -C "User Certificate Authority"
Génération des clés
Clé du serveur sshd :
ssh-keygen -f ssh_host_ed25519_key -N '' -t ed25519
Clé d'un user :
ssh-keygen -t ed25519
Signature des clés
Signature de la clé du serveur sshd :
ssh-keygen -s host_ca -I <hostservername> -h -n <hostservername> -V '+52w' -z 0001 ssh_host_ed25519_key.pub
- -s host_ca : on signe avec cette clé.
- -h : on signe la clé d'un hostname et non d'un user.
- -I <hostservername> : c'est le nom que l'on verra dans les logs, je préfère que l'on voit le nom du hostname mais on peut mettre n'importe quoi.
- -n <hostservername> : ce sont les noms autorisés pour se connecter au serveur, on peut mettre plusieurs noms séparés par une virgule. Exemple : “
myhost.example.org,myhost
”. - -V '+52w' : le certificat sera valide 52 semaines. Si vide, il n'expire jamais.
- -z 0001 : numéro de série du certificat (facultatif). Il permet de vérifier si un certificat obsolète est utilisé.
Signature de la clé d'un user :
ssh-keygen -s user_ca -I <user@hostname> -n user1,user2,user3 -V '+52w' -z 0001 id_ed25519.pub
- -s user_ca : on signe avec cette clé.
- -I <user@hostname> : c'est le nom que l'on verra dans les logs, je préfère que l'on voit le nom complet de l'user mais on peut mettre n'importe quoi.
- -n user1,user2,user3 : c'est la liste des users autorisés auxquels on peut se connecter sur le serveur.
Il est possible d'ajouter des options :
-O no-agent-forwarding -O no-port-forwarding -O no-pty -O no-user-rc -O no-X11-forwarding
Vérifier le certificat
ssh-keygen -Lf id_ed25519-cert.pub
Intégrer les autorités sur les serveurs
Sur chaque serveur, copiez la clé publique du certificat user :
# install -m 644 user_ca.pub /etc/ssh/ssh_user_ca.pub
Peuplez le fichier known_hosts
:
# echo "@cert-authority * <contenu de host_ca.pub du serveur>" > /etc/ssh/ssh_known_hosts
J'aurais pu mettre *.domain.tld
pour dire que cette clé n'est utile que pour ces domaines.
Ajoutez ces lignes dans /etc/ssh/sshd_config
:
#HostKey /etc/ssh/ssh_host_ed25519_key # Si besoin uniquement HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub TrustedUserCAKeys /etc/ssh/ssh_user_ca.pub
Puis redémarrez le serveur sshd.
Ajoutez ces lignes dans /etc/ssh/ssh_config
:
Host * IdentityFile ~/.ssh/id_ed25519 CertificateFile ~/.ssh/id_ed25519-cert.pub
Dorénavant vous n'aurez plus jamais besoin des fichiers ~/.ssh/known_hosts
et ~/.ssh/authorized_keys
. En effet, le fichier /etc/ssh/ssh_known_hosts
contient la clé publique du certificat qui signe les clés des serveurs sshd. Lors d'une 1ère connexion à un serveur, il ne vous sera plus demandée d'accepter (aveuglément) la clé du serveur.
Le fichier /etc/ssh/ssh_user_ca.pub
vérifie que le certificat envoyé est bien valide avec les options et les users autorisés, ce qui rend osbolète ~/.ssh/authorized_keys
.
Merci aux auteurs de ces articles :