Passer au contenu principal

Connexion par SSH avec PKI

Cette documentation est basée sur cette page

Principe de fonctionnement

La mise en place d'une connextion par PKI (Public Key Infrastructure) sur openssh permet d'enlever le besoin de téléverser chaque clef de chaque administrateur sur l'ensemble des serveurs. Comment cela fonctionne-t-il ?

Autorité de certification

Une authorité de certification Rhizome est mise en place. Il s'agit d'une clef ssh, comme les autres, mais que l'on utilisera d'une manière différente. Cette clef est composée d'une clef publique et d'une clef privée.

Déploiement sur les machines

Afin de permettre la connexion par PKI, il faut mettre la clef publique de l'autorité de certification dans les machines. On la copie-colle dans un fichier que l'on nomera /etc/ssh/user_ca.pub :

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF9o4QA3vCBx53mQZq2Wg3FBzAuDYCP1AgfwbAZaq3zy User Certificate Authority for rhizome-fai.net

et dans le fichier /etc/ssh/sshd_config, on ajoute la ligne suivante :

TrustedUserCAKeys /etc/ssh/user_ca.pub

Et voilà, c'est tout !

Signature d'une nouvelle clef

Pour qu'un administrateur puisse avoir accès au machine, il doit avoir un certificat associé à sa clef SSH. En gros, c'est un fichier signé par l'autorité de certification qui indique que la clef privée de l'utilisateur est autorisée sur les machines !

Ainsi, au lieu d'avoir à pousser la clef publique sur toutes les machines, il suffit que l'administrateur ait le certificat sur sa machine ! Une fois celui-ci présent, il suffit "d'envoyer" le certificat lors de la connexion pour que le serveur l'accepte ! (voir ci-après).

Génération d'un certificat

Pour générer un certificat, il faut être en possession de la clef privée de l'autorité de certification. Cette clef privée doit restée très sécurisée: faire fuiter la clef, c'est permettre l'accès à toutes les machines qui font confiance à cette autorité de certification.

La commande à utiliser pour signer la clef est ssh-keygen avec l'option -s (comme "sign"). Il est possible (et recommandé) d'associer une limite de validité à ce certificat avec l'option -V.

Par exemple, pour créer un certificat valide 1 an (52 semaines), permettant de se connecter avec l'utilisateur huetremy, on utilise la commande :

ssh-keygen -s user_ca -V ":+52w" -I "rhizome-fai.net CAv1 huetremy" -n huetremy id_ed25519.pub

si la clef de certification est user_ca et la clef publique à signer id_ed25519.pub.

C'est bien la clef publique que l'on signe !!! De manière générale, ne donnez JAMAIS votre clef privée à QUI QUE CE SOIT.

L'option -I permet d'ajouter "l'identité" du certificat. Il n'y a pas de format requis, mais c'est une bonne idée d'essayer de tous les faire de la même façon, afin que l'on puisse savoir facilement via les logs de sshd quel a été le certificat utilisé pour une connexion.

Une fois le certificat généré, il faut l'envoyer à l'administrateur concerné.

Connexion avec certificat

En admettant être en possetion d'un certificat nommé huetremy-rhz-cert.pub, il est possible de se connecter en ssh aux machines (par exemple, mercure.rhizome-fai.net) avec la commande suivante :

ssh -o CertificateFile=huetremy-rhz-cert.pub mercure.rhizome-fai.net

Pour ne pas avoir besoin du paramètre -o ... il suffit d'ajouter Mercure dans son fichier .ssh/config, ce qui est une bonne pratique dans tout les cas :

Host mercure mercure.rhizome-fai.net
  HostName mercure.rhizome-fai.net
  Certificate /home/huetremy/.ssh/huetremy-rhz-cert.pub

Machines configurées

  • ns01
  • g1.garage
  • g2.garage