Comment paramétrer SSH pour un accès par clé

🚪 Pourquoi ?

D’un point de vue sécurité, accéder à une machine distante via SSH à l’aide d’un mot de passe n’est pas recommandé.

Que fail2ban soit en place ou non, il est possible de se rendre compte à quel point ladite machine peut être ciblée par des utilisateurs peu scrupuleux :

☁️ Serveur
lastb | head
service ssh status

# Si fail2ban est installé et activé
fail2ban-client status sshd
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT COUNT(*) from bips WHERE jail = 'sshd'"

Autre point intéressant pour les personnes fainéantes : l’utilisation d’une clé fait gagner du temps, car plus besoin de se souvenir et taper de mot de passe.


🔑 Générer la clé locale

Depuis l’ordinateur d’où l’on souhaite se connecter :

🖥️ Ordinateur
ssh-keygen -t ed25519
chmod 0600 ~/.ssh/id_ed25519

Les fichiers ~/.ssh/id_ed25519 (la clé privée) et ~/.ssh/id_ed25519.pub (la clé publique) seront créés.

Note

Si vous avez plusieurs clé SSH, vous pouvez spécifier laquelle utiliser dans le fichier ~/.ssh/config.

Adapter les lignes surlignées, ou, en cas de configuration existante, le nouveau contenu important se situe lignes 5 et 6 :

🖥️ Ordinateur ✍️
1cat << EOF >> ~/.ssh/config
2Host machine
3    User alice
4    HostName example.org|example.local|IP
5    PreferredAuthentications publickey
6    IdentityFile ~/.ssh/id_ed25519
7EOF

🔒 Importer la clé sur la machine distante

Depuis la machine sur laquelle la connexion par clé est souhaitée (remplacer, à la seconde ligne, <id_ed25519.pub> par le contenu du fichier local ~/.ssh/id_ed25519.pub) :

☁️ Serveur
mkdir -p ~/.ssh && chmod 0700 ~/.ssh
echo '<id_ed25519.pub>' >> ~/.ssh/authorized_keys
chmod 0644 ~/.ssh/authorized_keys

Important

Vérifier maintenant que l’accès par clé fonctionne avant d’aller plus loin : si vous arrivez à vous connecter à la machine distante depuis l’ordinateur local sans entrer votre mot de passe, alors c’est gagné ! 🥳

Dernière étape, désactiver l’accès par mot de passe :

☁️ Serveur
find /etc/ssh -type f -print0 | xargs -0 \
    sed -i 's/#*[[:space:]]*PasswordAuthentication[[:space:]]*yes/PasswordAuthentication no/'
service ssh restart

Indication

Bien que cet article ne traite pas de la sécurité de SSH, il est fortement recommandé d’installer fail2ban sur la machine distante, une fois la mise en place de la connexion par clé effectuée avec succès.

À titre d’exemple, voici une configuration agressive que j’utilise :

☁️ Serveur (contenu du fichier /etc/fail2ban/jail.local)
[DEFAULT]

# Banni pendant 24h...
bantime = 24h
# ... Suite à la première tentative.
maxretry = 1

[sshd]

mode    = aggressive
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
EOF

🍰 Bonus

Pour que ça en jette plus (et/ou pour s’y retrouver plus facilement lorsqu’il y a plusieurs machines distantes), générer un super MOTD grâce à Text to ASCII Art Generator (TAAG). Copier le résultat dans le fichier /etc/motd.


📜 Historique

2024-12-16

Ajout de l’indication pour recommander l’installation de fail2ban.

2024-12-15

Premier jet.