Aller au contenu

Configuration d'un serveur SSH

Mise à jour :

Secure SHell

SSH, ou Secure Shell, est un protocole permettant d’établir une communication chiffrée, donc sécurisée qui permet aux administrateurs d’accéder à distance à des serveurs.

SSH (Secure Shell) opère principalement dans la couche application du modèle OSI (Open Systems Interconnection) et utilise le protocole TCP (Transmission Control Protocol) au niveau de la couche transport pour établir une connexion fiable et sécurisée entre le client et le serveur.

Histoire

L’histoire de SSH (Secure Shell) remonte au milieu des années 1990 et est étroitement liée à l’évolution de la sécurité Internet. Voici un aperçu de son développement :

  1. Origines (1995) : SSH a été créé par Tatu Ylönen, un chercheur en sécurité informatique de l’Université de Technologie d’Helsinki, en réponse à une attaque par écoute (“sniffing attack”) sur le réseau de son université. Cette attaque a mis en évidence les vulnérabilités des protocoles de connexion à distance existants, comme Telnet et Rlogin, qui ne chiffraient pas leurs communications.

  2. SSH-1 (1995) : La première version de SSH (SSH-1) a été développée pour remplacer ces protocoles non sécurisés. Elle offrait un cryptage des communications, empêchant ainsi l’interception des données transmises entre l’hôte et le client. SSH-1 est rapidement devenu populaire dans les communautés universitaires et scientifiques.

  3. SSH-2 (1996) : Une nouvelle version, SSH-2, a été introduite pour corriger des vulnérabilités de sécurité dans SSH-1. SSH-2 n’était pas rétrocompatible avec SSH-1, mais apportait des améliorations significatives, notamment une architecture plus modulaire et un cryptage plus robuste.

  4. Commercialisation (1996) : Tatu Ylönen a fondé SSH Communications Security pour commercialiser le protocole SSH. La société a développé des versions propriétaires de SSH, mais la version originale est restée open-source.

  5. OpenSSH (1999) : Face à la version propriétaire de SSH, la communauté open-source a créé OpenSSH, un fork gratuit et open-source de SSH développé par le projet OpenBSD. OpenSSH est devenu la version la plus utilisée de SSH et est intégré dans de nombreuses distributions Linux et systèmes Unix.

  6. Évolution Continue : SSH continue d’évoluer, avec des améliorations constantes en matière de sécurité et de fonctionnalités. De nouvelles méthodes d’authentification, des algorithmes de cryptage plus robustes et des fonctionnalités avancées comme le tunneling et le port forwarding sont régulièrement ajoutés.

Installation de SSH

L’installation de SSH varie légèrement selon la distribution Linux que vous utilisez. Voici les étapes pour les distributions les plus courantes.

Sur Debian et Ubuntu

Ouvrez votre terminal et exécutez la commande suivante pour installer le serveur SSH :

Terminal window
sudo apt update
sudo apt install openssh-server fail2ban

Une fois l’installation terminée, le service SSH devrait démarrer automatiquement.

Sur Fedora et CentOS

Ouvrez votre terminal et exécutez la commande suivante pour installer le serveur SSH :

Terminal window
sudo dnf install openssh-server fail2ban

Sur OpenSuse

Ouvrez votre terminal et exécutez la commande suivante pour installer le serveur SSH :

Terminal window
sudo zypper update
sudo zypper install openssh-server fail2ban

Gestion du service sshd

  1. Démarrer et Activer le Service SSH : Une fois installé, vous devez démarrer le service SSH et l’activer pour qu’il démarre automatiquement lors du démarrage du système. Utilisez les commandes suivantes :

    Terminal window
    sudo systemctl start sshd
    sudo systemctl enable sshd
  2. Vérifier le Statut du Service : Pour vous assurer que le service SSH fonctionne correctement, vérifiez son statut avec :

    Terminal window
    sudo systemctl status sshd
    ssh.service - OpenBSD Secure Shell server
    Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    Active: active (running) since Sat 2023-12-02 13:52:08 CET; 2 days ago
    Docs: man:sshd(8)
    man:sshd_config(5)
    Process: 656 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
    Main PID: 678 (sshd)
    Tasks: 1 (limit: 21485)
    Memory: 15.7M
    CPU: 12.151s
    CGroup: /system.slice/ssh.service
    └─678 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
    déc. 04 14:25:31 internal sshd[53852]: pam_unix(sshd:session): session opened for user bob(uid=1000) by (uid=0)
    déc. 04 14:25:31 internal sshd[53852]: pam_unix(sshd:session): session closed for user bob
    déc. 04 16:20:17 internal sshd[78083]: Accepted publickey for bob from 172.31.208.1 port 55470 ssh2: RSA SHA256:i/cP6dWYgNI419VoENjOZr0yRuPwXVsDN3/9UEV6yt4
    déc. 04 16:20:17 internal sshd[78083]: pam_unix(sshd:session): session opened for user bob(uid=1000) by (uid=0)
    déc. 04 16:20:22 internal sshd[78157]: Accepted publickey for bob from 172.31.208.1 port 55511 ssh2: RSA SHA256:i/cP6dWYgNI419VoENjOZr0yRuPwXVsDN3/9UEV6yt4
    déc. 04 16:20:22 internal sshd[78157]: pam_unix(sshd:session): session opened for user bob(uid=1000) by (uid=0)
    déc. 05 08:00:02 internal sshd[78345]: Accepted publickey for bob from 172.31.208.1 port 55553 ssh2: RSA SHA256:i/cP6dWYgNI419VoENjOZr0yRuPwXVsDN3/9UEV6yt4
    déc. 05 08:00:02 internal sshd[78345]: pam_unix(sshd:session): session opened for user bob(uid=1000) by (uid=0)
    déc. 05 08:19:24 internal sshd[82354]: Accepted publickey for bob from 172.31.208.1 port 56798 ssh2: RSA SHA256:i/cP6dWYgNI419VoENjOZr0yRuPwXVsDN3/9UEV6yt4
    déc. 05 08:19:24 internal sshd[82354]: pam_unix(sshd:session): session opened for user bob(uid=1000) by (uid=0)
    bob@internal ~/Projects/perso/my-blog dev* 08:31:19

Configuration de ssh

Après avoir installé SSH, il est important de le configurer correctement pour assurer une sécurité optimale, c’est ce qu’on appelle le durcissement. Voici les étapes pour configurer SSH sur votre serveur Linux.

Accès au Fichier de Configuration

Le fichier de configuration principal pour SSH est /etc/ssh/sshd_config.

Par contre, une meilleure pratique est de créer un fichier dans le répertoire /etc/ssh/sshd_config.d.

L’utilisation d’une structure de répertoires *.d pour la configuration de SSHD offre plusieurs avantages, notamment en termes de modularité, de maintenabilité et d’évolutivité :

  1. Modularité :

    • Simplicité de Gestion : Les configurations sont plus faciles à gérer et à comprendre car elles sont réparties en fichiers plus petits et plus ciblés.
    • Personnalisation Facile : Permet d’ajouter, de modifier ou de supprimer des paramètres spécifiques sans avoir à parcourir un long fichier de configuration.
  2. Maintenabilité :

    • Moins de Conflits lors des Mises à Jour : Diminue le risque de conflits lors des mises à jour du package SSH, car le fichier principal sshd_config est moins susceptible d’être modifié directement.
    • Facilité de Suivi : Les changements individuels sont plus faciles à suivre et à documenter lorsqu’ils sont isolés dans des fichiers séparés.
  3. Évolutivité :

    • Déploiement Automatisé : Simplifie le processus de réplication des configurations sur plusieurs systèmes, ce qui est particulièrement utile dans les environnements DevOps et pour la gestion centralisée des configurations.
    • Adaptabilité : Permet une adaptation rapide aux nouvelles exigences ou changements, en ajoutant ou en modifiant simplement un fichier spécifique sans perturber l’ensemble de la configuration.

Pour le créez, ouvrez le avec un éditeur de texte en tant que root, par exemcréer

Terminal window
sudo vi /etc/ssh/sshd_config.d/hardening.conf

Si vous n’êtes pas à l’aise avec l’éditeur vi, remplacez le par nano.

Paramètres Importants à Configurer

Pour des raisons de sécurité, il est recommandé de désactiver l’accès SSH direct pour l’utilisateur root. Ajoutez la ligne PermitRootLogin no.

L’authentification par clé publique est plus sécurisée que l’authentification par mot de passe. Ajoutez la ligne PubKeyAuthentication yes.

Ce qui donne :

Terminal window
PermitRootLogin no
PubkeyAuthentication yes

Après avoir effectué les modifications, sauvegardez le fichier et quittez l’éditeur de texte. Pour que les changements prennent effet, redémarrez le service SSH :

Terminal window
sudo systemctl reload sshd

Vérification de l’application des paramètres

Pour afficher les paramètres actifs, il suffit d’utiliser la commande suivante :

Terminal window
sudo sshd- T
port 22
addressfamily any
listenaddress [::]:22
listenaddress 0.0.0.0:22
usepam yes
logingracetime 120
x11displayoffset 10
maxauthtries 5
maxsessions 10
clientaliveinterval 0
clientalivecountmax 2
...
permitopen any
permitlisten any
permituserenvironment no
pubkeyauthoptions none

Sécurisation Avancée de SSH

Après avoir configuré le service SSH, il est essentiel d’adopter des mesures de sécurité avancées pour renforcer la protection de votre serveur. Voici comment utiliser les pare-feu firewalld ou ufw pour sécuriser votre serveur SSH.

Configuration du Pare-feu avec UFW (Uncomplicated Firewall)

UFW est un outil de gestion de pare-feu convivial pour les systèmes basés sur Debian et Ubuntu.

Activation de UFW

Activez UFW avec la commande suivante :

Terminal window
sudo ufw enable

Configuration des Règles pour SSH

Autorisez les connexions SSH (sur le port 22 par défaut ou un autre si vous avez modifié le port SSH) :

Terminal window
sudo ufw allow 22/tcp

Ou, si vous avez changé le port SSH :

Terminal window
sudo ufw allow [port]/tcp

Ou si vous voulez restreindre l’accès à des adresses IP spécifiques :

Terminal window
sudo ufw allow from [adresse_ip] to any port [port]

Remplacez [adresse_ip] par l’adresse IP spécifique. Répétez cette commande pour chaque adresse IP autorisée.

Application des Règles

Pour appliquer les modifications, redémarrez UFW :

Terminal window
sudo ufw reload

Configuration du Pare-feu avec firewalld

firewalld est un outil de gestion de pare-feu flexible utilisé sur les distributions Linux à base de Red Hat.

Règles de Base pour SSH

Pour autoriser les connexions SSH (sur le port 22 par défaut), utilisez :

Terminal window
sudo firewall-cmd --zone=public --add-service=ssh --permanent

Ou si vous avez changé le port SSH :

Terminal window
sudo firewall-cmd --zone=public --add-port=[port]/tcp --permanent

Pour appliquer cette régle :

Terminal window
sudo firewall-cmd --reload

Configuration de fail2ban

Le service SSH (Secure Shell) est souvent la cible principale des attaques par force brute, où des assaillants tentent de deviner les identifiants de connexion par des essais répétés. Pour contrer ces menaces, une solution de sécurité robuste et proactive est indispensable. C’est ici que Fail2Ban, un outil de prévention des intrusions, entre en jeu.

Fail2Ban est un logiciel de sécurité qui surveille les journaux de votre système à la recherche de signes d’activités suspectes, en particulier des tentatives de connexion SSH répétées et infructueuses. Lorsqu’un schéma d’attaque est détecté, Fail2Ban intervient automatiquement pour “bannir” l’adresse IP de l’attaquant, en la bloquant temporairement de l’accès au service SSH. Cette action réduit considérablement le risque d’une intrusion réussie, décourageant l’attaquant et protégeant le système contre les accès non autorisés.

Configuration de Base de Fail2Ban

Il est recommandé de ne pas modifier directement le fichier de configuration par défaut jail.conf de Fail2Ban, car il peut être écrasé lors des mises à jour. Créez plutôt un fichier jail.local pour vos configurations personnalisées :

Terminal window
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Ajoutez les lignes suivantes en adaptant à vos besoins dans la section [sshd]:

[sshd]
enabled = true
ignoreip = 127.0.0.1 192.168.1.0/24
bantime = 180
maxretry = 3

Où :

  • ignoreip : Adresses IP à ignorer.
  • bantime : Durée du bannissement.
  • findtime : Intervalle de temps pendant lequel les échecs sont comptés.
  • maxretry : Nombre de tentatives de connexion échouées avant bannissement.

Démarrage et Test de Fail2Ban

Après avoir configuré Fail2Ban, redémarrez le service pour appliquer les changements :

Terminal window
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Vérifier le Statut de Fail2Ban :

Utilisez la commande suivante pour vérifier que Fail2Ban fonctionne correctement :

Terminal window
sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd

Pour voir les détails de la prison SSH, utilisez :

Terminal window
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 3
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:

Conclusion

Maîtriser SSH est une compétence précieuse pour tout professionnel de l’informatique ou utilisateur de Linux. Nous espérons que ce guide vous a aidé à comprendre et à appliquer les principes fondamentaux de SSH pour une utilisation sécurisée et efficace.

L’installation et la configuration correctes de SSH sont des étapes importantes pour assurer une gestion sûre et efficace de vos serveurs Linux. En suivant les instructions fournies dans cette documentation, vous avez appris comment installer SSH sur différentes distributions Linux, comment le configurer pour une sécurité minimale et comment établir une connexion sécurisée avec votre serveur.

Dans le prochain guide, je vous propose de voir comment durcir encore plus sa configuration.

Plus loin

Pour ceux qui utilisent Ansible et qui cherche à améliorer les temps d’exécution des playbooks à destination de nombreuses cibles, je vous propose de lire cette documentation.