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.