Configuration clés SSH

SSH peut permettre une connexion sans mot de passe en utilisant l’authentification par clé privée/publique.

La clé privée est utilisée comme identifiant d’authentification et comme mot de passe, elle doit être tenue secrète et sécurisée.
La clé publique est copiée sur les systèmes auxquels l’utilisateur souhaite se connecter et sert à vérifier la clé privée. La clé publique n’a pas besoin d’être secrète.

Configuration de l’authentification par clé SSH

Une copie de la clé publique sera associée à votre compte sur le serveur. Lors de la connexion, le serveur SSH utilisera la clé publique pour lancer un défi qui sera résolu en utilisant la clé privée.

Génération de clés SSH

Pour créer une clé privée et une clé publique on utilise la commande ssh-keygen.

Par défaut les :

  • clés privées sont dans ~/.ssh/id_rsa
  • clés publiques sont dans ~/.ssh/id_rsa.pub

Génération des clés :

$ ssh-keygen

Dans un autre fichier de clé, l’option -f détermine les fichiers dans lesquels les clés sont enregistrées :

$ ssh-keygen -f .ssh/key-number-two

Passphrase

Sans passphrase, la clé privée générée n’est pas protégée et une personne tierce pourrait l’utiliser pour l’authentification.

Avec une passphrase, il faudra la saisir lorsque la clé privée sera utilisée (donc entrer la passphrase de la clé privée au lieu du mot de passe).

Le programme ssh-agent peut temporairement mettre en cache la passphrase de la clé privée.

Démmarer ssh-agent :

$ eval $(ssh-agent)

Ajouter les clés au processus, la passphrase sera demandée une 1ère fois :

$ ssh-add

Connexion :

$ ssh user@remotehost

Partage de la clé publique

Avant de pouvoir utiliser l’authentification par clé, il faut copier la clé publique sur le système cible via la commande ssh-copy-id.

Sans préciser de chemin, elle utilise le fichier /home/user/.ssh/id_rsa.pub par défaut :

$ ssh-copy-id user@remotehost

En précisant le chemin :

$ ssh-copy-id -i .ssh/my_key_2.pub user@remotehost

Connexion au système distant

Connexion au système distant :

$ ssh user@remotehost

Connexion au système distant en précisant un autre emplacement pour la clé :

$ ssh -i .ssh/my_key.pub user@remotehost

Fichiers de configuration

Il est possible de directement modifier/créer les fichiers ~/.ssh/config et /etc/ssh/ssh_config pour préconfigurer les connexions SSH à des hôtes distants.

Configuration générale

La configuration génerale pour l’hôte se trouve dans :

  • /etc/ssh/ssh_config

Si l’on souhaite ajouter des bouts de configuration, il faut les placer dans le répertoire :

  • /etc/ssh/ssh_config.d

À noter que le fichier /etc/ssh/ssh_config inclu les fichiers contenus dans répertoire ssh_config.d à la fin :

$ cat /etc/ssh/ssh_config
[...]
Include /etc/ssh/ssh_config.d/*.conf

Exemple de contenu du répertoire /etc/ssh/ssh_config.d/ :

$ ll /etc/ssh/ssh_config.d/
total 8
-rw-r--r--. 1 root root 21 Sep 01 2023 cluster.conf
-rw-r--r--. 1 root root 125 Sep 04 2023 backup.conf

Configuration utilisateur

La configuration pour un utilisateur se trouve dans son répertoire personnel :

  • ~/.ssh/config
  • /home/user/.ssh/config

Exemple de contenu :

$ cat ~/.ssh/config
host cluster
HostName cluster.mondomaine.com
User johnripper
IdentityFile ~/.ssh/id_rsa_cluster

host backup
HostName backup.mondomaine.com
User johnripper
IdentityFile ~/.ssh/id_rsa_backup

Problèmes et debug

La commande ssh permet de visualiser les logs sur 3 niveaux de détail avec les options -v, -vv et -vvv

$ ssh -vvv user@remotehost

/!\ Résumé des commandes

Avec l’emplacement par défaut des clés (dans ~/.ssh/id_rsa et ~/.ssh/id_rsa.pub) :

$ ssh-keygen                  // Génération des clés
$ ssh-copy-id user@remotehost // Partage de la clé publique
$ ssh user@remotehost // Connexion au système distant

Avec un autre emplacement des clés (option -f) :

$ ssh-keygen -f .ssh/keyP			// Génération des clés
$ ssh-copy-id -i .ssh/keyP.pub user@remotehost // Partage de la clé publique
$ ssh -i .ssh/keyP.pub user@remotehost // Connexion au système distant

Si la clé est protégée par une passphrase et que vous voulez temporairement la mettre en cache :

$ eval $(ssh-agent) 		// Démarrage de l'agent
$ ssh-add // Ajoute des clés à l'agent
$ ssh-add .ssh/keyP.pub // Ajoute des clés à l'agent situées ailleurs
$ ssh user@remotehost // Connexion au système distant

Commande pour debug (il est possible de ne mettre que le host) :

$ ssh -v user@host
$ ssh -vv user@host
$ ssh -vvv user@host

Fichiers et dossiers de configuration :

#-- Configuration serveur
/etc/ssh/ // Contient les *key.pub
/etc/ssh/ssh_config // Fichier de configuration génerale
/etc/ssh/ssh_config.d // Dossier pour ajouter des fichiers de configuration en .conf

#-- configuration utilisateur
~/.ssh/ // Contient les *key.pub
~/.ssh/config // Fichier de configuration pour l'utilisateur

Cas pratique

Génération de clé :

[aline@SERVER01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aline/.ssh/id_rsa):
Created directory '/home/aline/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/aline/.ssh/id_rsa
Your public key has been saved in /home/aline/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:NwKuAN3AUZkvNER99GIJQ3d7S+FvT+9MUR+nUSa0LH0 aline@SERVER01
The key's randomart image is:
+---[RSA 3072]----+
| .o=+=+.o . ..o o|
| ..o= .+.+ o + = |
|. ...o..+ o = =.E|
| . ...o . o + +=|
| . .. S o . +.o|
| . . o . . oo|
| . +|
| + |
| o|
+----[SHA256]-----+

Copy de la clé publique :

[aline@SERVER01 ~]$ ssh-copy-id aline@SERVER02
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/aline/.ssh/id_rsa.pub"
The authenticity of host 'SERVER02 (192.168.1.10)' can't be established.
ED25519 key fingerprint is SHA256:h/JPpl/4sdfgSDFGdsf465erdGDfsr5sdfgRdfg55reafdFF.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
aline@SERVER02's password:
Number of key(s) added: 1
Now try logging in to the machine, with: "ssh 'aline@SERVER02'" and check to make sure that only the key(s) you wanted were added.

Commande à distance :

[aline@SERVER01 ~]$ ssh aline@SERVER02 hostname
aline@SERVER02's password:

SERVER02

Liste des fichiers:

[aline@SERVER01 ~]$ ls -l /home/aline/.ssh
total 12
-rw-------. 1 aline aline 2610 Aug 28 10:15 id_rsa
-rw-r--r--. 1 aline aline 573 Aug 28 10:15 id_rsa.pub
-rw-r--r--. 1 aline aline 95 Aug 28 10:18 known_hosts

Documentation

MAN ssh-keygen(1)
MAN ssh-copy-id(1)
MAN ssh-agent(1)
MAN ssh-add(1)

> Partager <