Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

Sécuriser un serveur SSH

Si vous gérez votre propre serveur, vous possédez forcement une connexion SSH pour y accéder à distance. SSH est indispensable car en plus de fournir un accès en ligne de commande à votre serveur, il permet de se passer complètement de serveur FTP et de déposer vos fichiers en SFTP (SSH File Transfer Protocol).

Je ne suis pas un grand guru de l’admin linux mais je me débrouille, donc si ça vous intéresse, voici un petit tuto ssh pour paramétrer convenablement votre serveur SSH et le sécuriser un minimum. Vous allez voir, ça peut aller assez vite et vous éviter bien des emmerdements. Tous mes tests ont été fait sur une Ubuntu.

Avant de faire toutes ces manips, ouvrez un accès SSH en plus qui vous permettra de corriger vos erreurs au cas où vous vous bloquiez tous les accès. Et au pire du pire, sachez que les serveurs (chez OVH ou Dedibox par exemple), ont un accès console de secours qui vous permettra d’arranger tout ça.

Config de base à changer dans le fichier /etc/ssh/sshd_config

#Changez le port par défaut. Cela évite pas mal d'attaques automatiques sur le port 22 (bots)
Port 1234
#C'est la seconde version du protocole ssh qui sera utilisée
Protocol 2
#Désactiver le login root. Ça c'est super important !!
PermitRootLogin no

Là déjà c’est pas mal… Relancez le serveur ssh :

/etc/init.d/ssh restart

Pour vous connecter sur ce nouveau port, vous devez utiliser le paramètre « p » avec ssh mac ou ssh linux. Pour Windows, utilisez Putty.

ssh -p1234 [email protected]

Vous continuez donc à vous logger en entrant votre login + mot de passe à chaque fois. C’est bien mais n’importe qui peut intercepter dans un mail, dans un snif (keylogger matériel ou qui balance ensuite par le réseau), ou autre, votre login et mot de passe… et ainsi avoir accès à votre serveur. Heureusement, on peut sécuriser tout ça encore un peu plus en interdisant l’authentification par mot de passe. Pour se connecter, on utilise alors des clés SSH (publique/privée). C’est de loin la technique la plus sûre même si pour vous connecter vous devrez être forcement sur un ordinateur qui dispose des bonnes clés…(pas évident donc depuis un cybercafé par exemple)

Voici donc comment faire… cette méthode fonctionne sous Linux / Mac OSX. Pour Windows, je sais que Putty-gen sait faire ça complètement via l’interface graphique.

=A faire sur votre ordinateur ET sur votre serveur=

#On crée un répertoire .ssh dans notre HOME
mkdir ~/.ssh
#Ensuite on lui change ses droits d'accès
chmod 0700 ~/.ssh

=A faire sur votre ordinateur uniquement=

#Puis on génère les clés. Vous pouvez choisir de mettre ou pas un mot de passe sur ces clés. Je vous recommande de le faire.
ssh-keygen -t dsa -f ~/.ssh/id_server

On se retrouve alors avec 2 fichiers dans .ssh :
id_server => clé privée qui ira sur vos machines clients
id_server.pub => clé publique qui ira sur votre serveur

#On transfère alors cette clé via scp vers votre serveur...
scp -P 1234 ~/.ssh/id_server.pub [email protected]:~/.ssh/authorized_keys
#Et on supprime cette clé publique parce qu'on n'en a plus besoin
rm -f ~/.ssh/id_server.pub

=A faire sur votre ordinateur ET sur votre serveur=

#On rechange les droits sur le répertoire qui contient les clés
chmod 0600 ~/.ssh/*

=A faire sur le serveur=
Et ensuite pour améliorer encore plus la sécurité, on va simplement créer un groupe avec uniquement votre / vos users dedans

#On crée le groupe sshusers
groupadd sshusers
#Et on ajouter l'utilisateur à ce groupe
usermod -a -G sshusers korben

Maintenant on retourne jeter un oeil dans le /etc/ssh/sshd_config afin de tout blinder et permettre l’utilisation de la clé que vous avez crée

#Décommentez ou ajouter la ligne suivante. Cela permet que le serveur donne son empreinte DSA en cas de connexion ssh.
HostKey /etc/ssh/ssh_host_dsa_key
#Mettez ensuite le paramètre suivant à 20s (par exemple). C'est la durée pendant laquelle une connexion sans être loggée sera ouverte.
#Si on avait gardé la bonne vieille technique du mot de passe, laisser 2 ou 3 minutes pour le taper, ce n'est pas de trop.
#Mais vu que là, on utilise la clé, on sera loggé immédiatement. Donc on peut vachement réduire le truc et mettre ça a 20 secondes par exemple.
LoginGraceTime 20s
#ça c'est le nombre maximum d'essais avant de se faire jeter par le serveur...
#Vu qu'avec la clé, pas d'erreur possible, vous pouvez le mettre à 1 essai possible sauf si vous avez plusieurs clés (donc un risque que ça échoue).
MaxAuthTries 1
#Ensuite, on va indiquer au serveur SSH où se trouvent les clés et lui dire qu'on va les utiliser comme méthode d'authentification
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#Et bien sûr, on va désactiver toutes les autres méthodes d'authentification
RSAAuthentication no
UsePAM no
KerberosAuthentication no
GSSAPIAuthentication no
PasswordAuthentication no

Note: Attention avec ce dernier paramètre (PasswordAuthentication) car il désactive l’authentification par mot de passe. Donc si vous vous êtes viandé avec les clés, vous n’aurez plus d’autre moyen de vous connecter. Finissez tout le tuto avant de mettre PasswordAuthentication à « no » et testez la connexion avec votre clé en faisant un simple « ssh -p1234 [email protected] ». Dès que c’est bon, passez le paramètre à no et relancez ssh

#Ensuite, on va lui dire qu'on autorise uniquement les utilisateurs du groupe sshusers (pour plus de sécurité)
AllowGroups sshusers
#Le paramètre MaxStartups indique le nombre de connexions ssh non authentifiées que vous pouvez lancer en même temps.
#2 c'est largement suffisant sachant qu'avec les clés, c'est instantané.
MaxStartups 2

Maintenant que tout est paramétré, on va redémarrer le serveur ssh

sudo /etc/init.d/ssh restart

Faisons ensuite une connexion ssh pour tester

ssh -p1234 [email protected]

Normalement, ça devrait se connecter directement. Bravo, votre clé fonctionne ! (Si vous ne l’avez pas encore fait, vous pouvez alors mettre le paramètre PasswordAuthentication à « no »)

On va maintenant hasher le fichier known_hosts qui contient en clair les infos de connexions déjà établies afin que justement, cela ne soit plus en clair.

ssh-keygen -H -f ~/.ssh/known_hosts

Supprimez ensuite le fichier known_hosts.old

rm ~/.ssh/known_hosts.old

Et voilà, je pense que là on est bon. Si vous souhaitez changer le mot de passe sur votre clé, voici la commande :

ssh-keygen -p -f ~/.ssh/id_server

Là, vous avez donc la clé « id_server » qui vous permet de vous connecter dans le répertoire .ssh. Vous pouvez la copier dans tous les .ssh de vos profils linux ou mac sur vos ordis (enfin, là où vous en avez besoin).

Un cas de figure un peu particulier se présente si vous utilisez Putty. En effet, celui-ci utilise des clés particulières .ppk. Il faudra donc importer votre clé avec un outil qui s’appelle Putty-gen. Sous Windows, c’est simple, c’est une interface graphique.

Clé publique SSH

Sous linux par contre, il faut utiliser la ligne de commande pour convertir votre clé SSH en clé PPK

puttygen id_server -o macleputty.ppk

Dès que c’est ok, il suffit de configurer Putty pour lui indiquer sa clé ppk :

Configuration du fichier de configuration SSH

Et voilà ! Un SSH iPhone ou un SSH Android doit pouvoir se configurer sensiblement de la même manière mais je n’ai pas fait de tests encore.

Bon, maintenant, si vous voulez sécuriser un peu plus, je vous recommande de mettre en place fail2ban qui permettra de bloquer les ip un peu trop insistantes.

Si vous avez des suggestions / améliorations / corrections à apporter à ce modeste tuto, n’hésitez pas !!!


Les articles du moment