Introduction

Depuis la version 5.4 d'OpenSSH, il est possible de signer les clés utilisateur ou serveur.

Création d'une paire de clés sur le client

Sur notre machine cliente, nous générons une paire de clé RSA de 2048 bits :

ssh-keygen -t rsa -b 2048

Cette commande crée une paire de clés jumelées (privée/publique) sur notre machine cliente, stockées dans le répertoire $HOME/.ssh/.

  • $HOME/.ssh/id_rsa

Contient l'identité d'authentification RSA de l'utilisateur pour la version 2 du protocole. Ce fichier ne doit être lisible que par l'utilisateur. On peut préciser un mot de passe (passphrase) lors de la génération de la clef. Ce mot de passe est utilisé pour crypter la partie privée de ce fichier à l'aide de 3DES. ssh-keygen n'accède pas automatiquement à ce fichier, mais c'est le fichier par défaut pour la clef privée. ssh(1) lit ce fichier lors d'une tentative de connexion.

  • $HOME/.ssh/id_rsa.pub

Contient la clef publique RSA pour la version 2 du protocole utilisée pour l'authentification. Il faut ajouter le contenu de ce fichier à $HOME/.ssh/authorized_keys sur toutes les machines sur lesquelles l'utilisateur souhaite se connecter avec une authentification RSA. Il n'est pas nécessaire de garder secret le contenu de ce fichier.

Options utilisées :

  • -t type Précise le type de clef à créer. Les valeurs possibles sont « rsa1 » pour la version 1 du protocole et « rsa » ou « dsa » pour la version 2 du protocole.

  • -b bits Spécifie le nombre de bits de la clef à créer. Le minimum est 512 bits. En général, on considère qu'une longueur de 1024 bits est suffisante, et des longueurs de clefs supérieures n'améliorent pas la sécurité mais ralentissent le tout. Par défaut 1024.

Génération de l'autorité de certification SSH sur le serveur

Sur notre machine serveur, nous générons une paire de clé RSA de 2048 bits :

ssh-keygen -t rsa -b 2048

Cette commande crée une paire de clés jumelées (privée/publique) qui serviront à créer les certificats serveurs et clients, en signant respectivement les clés publiques du serveur et du client.

Création du certificat SSH sur le serveur

ssh-keygen -s id_rsa -I SSH-SERVER-CERT -h -z 1234 -n localhost,server,ip-server /etc/ssh/ssh_host_rsa_key.pub

Options utilisées :

  • -s ca_key Certify (sign) a public key using the specified CA key.

  • -I certificate_identity Specify the key identity when signing a public key.

  • -h When signing a key, create a host certificate instead of a user certificate.

  • -z serial_number Specifies a serial number to be embedded in the certificate to distinguish this certificate from others from the same CA. If the serial_number is prefixed with a ‘+’ character, then the serial number will be incremented for each certificate signed on a single command-line. The default serial number is zero. When generating a KRL, the -z flag is used to specify a KRL version number.

  • -n principals Specify one or more principals (user or host names) to be included in a certificate when signing a key. Multiple principals may be specified, separated by commas. Please see the CERTIFICATES section for details.

Une fois le certificat créé, il est nécessaire de le déclarer dans le fichier /etc/ssh/sshd_config grace à la directive HostCertificate :

...
HostKey /etc/ssh/ssh_host_rsa_key
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
...

Déclaration de la clé publique utilisée pour signer les certificats côté client

Dans le fichier ~/.ssh/known_hosts , on ajoute la directive suivante :

@cert-authority server,ip-server ssh-rsa OOOEF....E90SSDR4= CA key

Il convient de faire apparaître ici le contenu du fichier id_rsa.pub correspondant à la clé publique de l’autorité de certification. On peut vérifier que le client valide le certificat du serveur en lançant le client ssh en mode verbeux (ssh -v) :

debug1: Server host key: RSA-CERT xx:xx:xx:xx:...
debug1: Host 'server' is known and matches the RSA-CERT host certificate.
debug1: Found CA key in /home/user/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct

Vérification d'un certificat client côté serveur

On commence par copier la clé publique de l'autorité de certification dans le répertoire /etc/ssh/, de la manière suivante :

cp id_rsa.pub /etc/ssh/ca_key

Grâce à la directive TrustedUserCAKeys, que l'on va ajouter au fichier de configuration du serveur SSH, on va indiquer à celui-ci que tous les certificats clients signés par l'autorité de certification sont autorisés à se connecter. Voici la ligne à ajouter au fichier sshd_config :

TrustedUserCAKeys /etc/ssh/ca_key

Ensuite, nous allons signer la clé publique générée sur le client à l'aide de notre autorité de certification. Ici, il faut bien veiller à préciser un ou plusieurs principals (ce qui correspond aux comptes locaux - i.e. du serveur - auxquels le certificat client ainsi généré aura accès).

ssh-keygen -s id_rsa -I CLIENT-CERT -z 1234 -n user id_rsa.pub

Le certificat ainsi généré permettra de se connecter au compte user du serveur.

Proudly powered by Pelican, which takes great advantage of Python.