SSH, ou Secure Socket Shell, est un protocole réseau qui permet d’accéder à distance à un ordinateur, en toute sécurité.
SSH désigne également l’ensemble des utilitaires qui mettent en œuvre le protocole. Il assure une authentification forte et des communications de données chiffrées sécurisées entre deux ordinateurs connectés sur un réseau.


Le protocole SSH existe en deux versions majeures : la version 1.0 et la version 2.0 (2006) et le port utilisé couramment est TCP 22.

Il existe une multitude de client : PuTTY (le plus connu), Kitty, MobaXterm ou WinSCP (pour le transfert de fichiers).

Coté serveur, openssh reste le plus utilisé. Sur un serveur linux, il s’installe avec une simple commande.

Sur Debian par exemple :
apt install openssh-server

Dans cet article, nous allons sécuriser l’accès ssh d’un serveur linux, pour qu’un administrateur puisse se connecter en toute sécurité en tant que root. Mais il est tout à fait possible d’utiliser la même méthode pour les transactions entre 2 serveurs Linux par exemple.

Tout se passe dans le fichier /etc/ssh/sshd_config

N’oubliez pas de redémarrer le serveur openssh une fois que vous avez fini de modifier le fichier.

systemctl restart ssh

Port d’écoute

Par défaut, le port d’écoute est 22, mais il est possible de le changer pour tromper un peu plus les scans de port

port 2024

Empêcher utilisateur root de se connecter

Même si la connexion de l’utilisateur root est désactivée par défaut dans la configuration SSH, il veut mieux s’en assurer

PermitRootLogin No

Timeout des sessions ssh

Nous allons définir un temps maximal d’inactivité pour une session SSH, afin d’éviter que certaines connexions SSH restent actives indéfiniment.

  • ClientAliveInterval : indique le délai d’attente en secondes. Après x secondes, le serveur SSH enverra un message au client demandant une réponse.
  • ClientAliveCountMax : ceci indique le nombre total de messages de vérification envoyés par le serveur SSH sans obtenir de réponse du client SSH.

ClientAliveInterval 600
ClientAliveCountMax 0

Authentification par clés publique/privée

L’authentification par clés publique/privée est préférable à l’accès par simple mot de passe, qui est déconseillée car trop sensible aux attaques par brute force si le service SSH est mal configuré ou exposé sur sur internet.

Nous allons donc générer une clé publique que nous mettrons sur le serveur, et une clé publique, que nous garderons pour initier la connexion. Et nous sécuriserons le tout grâce à une paraphrase.

Il est tout à fait possible de générer les clés à partir du serveur avec la commande ssh-keygen

Mais pour générer les clés, nous allons utiliser PuttyGen.

Pour la taille de la clé, il est recommandé de faire au moins du 2048 bits pour le RSA.

Il suffit de cliquer changer la cryptage de la clé, et de cliquer sur « Generate« , puis de bouger sa souris dans l’espace gris pour générer la fonction aléatoire de la clé.

Il ne reste plus qu’a insérer la paraphrase, et exporter les deux clés.

Putty génère également ce que l’on doit coller dans le serveur Linux. Je vous conseille de le sauvegarder dans un fichier, que nous modifierons plus tard pour facilité l’insertion dans le serveur Linux.

On obtient donc

  • Clé publique
  • Clé privé (fichier avec une extension ppk)

Insérer la clé sur le serveur linux

Nous allons modifier le texte que nous avons récupéré et ajouté « echo » au début de la séquence et «  >> /root/.ssh/authorized_keys » à la fin de la clé

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCow+UWuh1jOPKknyBpu1X7Bo95UnhB9ZuYI0V8YPsYpjKO1ZvAAoK0Oq67dwEAPc8G33Arnko4FUNPozA1RYWjN
OFgJ56b9OMnucN4vk1DgzHPVWJ/lxfaFnSzDW/uscW8FNm0jdGC/GJWZBtjHMJCaY9myDdo3yK5q6ZDXg0bp1xqUF3jZnAzUAdL86bWkCJeM+55n1n5UOcUYaBENcG15SWlURQJ31NYGizQ+KvpDaGM7zcUb3oX0o29ZevN2S
8LkZjGqkVq3m1VZjXR08KH4e6KDL5LOB5LmLhd22o0y286rHcRc0AjHKnpW2ht3dxs29WjqSaRZmDwQHBR7aB9oDGHL07H2nRgde7WLtE2NVF2TrSpcDo
PML2WLLCeg0PR2YZoBkfa1h146Xf9OmY9XlnwnbdnYxrNhioa2bV+QDJ2V5H9bGCgyozC5SS4mc9+7kaKOW4gfWi/m8qpJxv0tKPGA2VPuwDy5BiXTVOJcfx/HttedwoT/30RegfQBQHGDMz037lmNuybXGrJD4OxprsFKVxVLqIQLvcwuAPkd6dFJMJ2oRf6Zo6nBow2jqxzMTBt/iCxGEdDKeBrlamDoiDqHiXBzZFjdcbuoG5TeNCP2wAxRDshTtMyeWitig1bxQL2zjjnvRbMsDxi7FtY779XQJr8wvIkjpOPX8Rytw== rsa-key-20240203" >> /root/.ssh/authorized_keys

Créez dans le répertoire root, le répertoire .ssh

mkdir /root/.ssh

Sur le serveur, il ne reste plus qu’a copier l’ensemble de la séquence ci dessus.

Cela va créer dans le répertoire root/.ssh et le fichier authorized_keys, nous retrouvons la clé que nous venons de créer.


Vous pouvez également créer une clé par administrateur en ajoutant plusieurs clés dans le répertoire authorized_key

Si l’authentification doit se faire pour un utilisateur, faire la même chose dans le répertoire de utilisateur
/home/utilisateur/.ssh/authorized_keys.

Paramétrage du client ssh

Inserer le fichier contenant la clé privé (celui avec l’extension ppk) dans « Connection / SSH / Auth / Credentials« 

Puis lancez la connexion et rentrez la paraphrase pour « déverrouiller » la clé privée.

Désactivez l’authentification par mot de passe classique

Comme nous venons de mettre une authentification par clé publique/privée, nous pouvons désactiver l’authentification par mot de place classique dans le fichier /ssh/sshd_config

PasswordAuthentication no

Ainsi, lorsque vous essayer de vous connecter avec un utilisateur, le message suivant apparait.

Authentification par MFA

En complément, nous pouvons également utiliser un code de vérification à usage unique qui devra être saisi pour s’authentifier sur le serveur.

Attention, cette méthode doit être déployée sur chaque serveur. Ce qui va générer un code différent pour chaque serveur.

Le MFA est compatible avec l’authentification par identifiants (utilisateur / mot de passe), mais aussi avec l’authentification par clés.

Sur le serveur Linux, nous allons devoir installer et configurer Google PAM Authenticator, correspondant au paquet « libpam-google-authenticator« . Du côté de votre smartphone, vous pouvez utiliser l’application de génération de code de votre choix : Microsoft Authenticator, Google Authenticator, etc…

Sur Debian, il faut saisir la commande

apt install libpam-google-authenticator

Une fois installé, nous allons activer l’authentification

google-authenticator

Avec votre smartphone, ouvrez l’application que vous avez choisi, et photographiez le qrcode ou tapez le « secret key »

Copiez le numéro qui se regénère tous les 30 secondes dans la fenêtre pour valider la synchronisation entre votre serveur et votre smartphone

Récupérez les emergency scratch codes en cas de problème, et gardez les précieusement.

Ensuite, il faut répondre à 4 questions pour affiner la configuration. Pour que la configuration soit sécurisée (protection contre certaines attaques), il est nécessaire de répondre « y » donc « oui » à l’ensemble de ces questions. Par exemple, cela va imposer une limite pour les tentatives de connexion : 3 tentatives toutes les 30 secondes.

Activer le MFA sur la connexion SSH

Configurons le module d’authentification de Linux et SSH pour qu’ils s’appuient sur Google PAM afin d’activer le MFA. Commencez par modifiez ce fichier /etc/pam.d/sshd

#MFA
auth required pam_google_authenticator.so

Il faut ensuite modifier le fichier /etc/ssh/ssd_config

UsePAM yes
ChallengeResponseAuthentication yes

Si vous utilisez la configuration par clé publique/privée, il faut ajouter également les lignes suivantes.

Inutile si vous utilisez le classique login / mot de passe

AuthenticationMethods publickey,keyboard-interactive
PubkeyAuthentication yes
PasswordAuthentication no