Améliorer sa configuration SSH avec fail2ban et SELinux

Tut's Linux mai 25, 2020

Pour administrer un serveur Linux à distance, rien de mieux que d'utiliser le SSH. Attention toutefois lorsque votre serveur est exposé sur le net, vous serez assailli de tentative de connexion... Il existe heureusement des logiciels pour filtrer et bloquer ces tentatives.


Fail2Ban

La procédure ci-dessous vous permettra d'avoir une ébauche de configuration SSH robuste et de bloquer les adresses IP ayant fait trop de tentatives sur votre port SSH. La configuration peut être affinée au fil du temps. J'ai exploité un CentOS 7 pour cet article, il n'y a pas de contre-indication pour CentOS 8. De plus, les commandes sont similaires à des OS type Debian/Ubuntu ou encore Arch...

Dans un premier temps, il est primordial de mettre à jour votre système intégralement - par la suite, nous installerons le paquet fail2ban. SELinux fait partie intégrante de CentOS, il n'est pas nécessaire de l'installer.

yum update -y && yum install fail2ban
nano /etc/ssh/sshd_config

Dans le fichier de configuration sshd_config, naviguez vers le début du fichier et changez le port "22" par tout autre nombre supérieur à 1024 - pour l'exemple, j'utiliserai 6985.

Port 6985

Maintenant que le fichier de configuration SSH est prêt, le pare-feu local et la configuration SELinux de CentOS doivent être modifiés. Le port précédement choisi dans notre exemple (6985) peut être changé à votre convenance.

firewall-cmd --add-port 6985/tcp --permanent
firewall-cmd --reload
semanage port -a -t ssh_port_t -p tcp 6985

Par ces 3 commandes, le pare-feu ouvre une exception sur le port 6985 en TCP de façon persistente (la règle ne sera pas perdue lors du reboot de la machine) ; de plus, SELinux écoutera/protègera l'accès SSH depuis le port 6985.

Editez maintenant le fichier de configuration local de fail2ban : "nano /etc/fail2ban/jail.local" - recherchez la catégorie ci-dessous et changez le port d'écoute :

[sshd]
#port = ssh #Remplacez 'ssh' par le port choisi (ici, 6985)
port = 6985

Maintenant que ces configurations sont faites, vous pouvez redémarrer les services sshd et fail2ban (votre connexion actuelle en SSH ne sera pas coupée)

systemctl restart sshd && systemctl restart fail2ban

Testez dès à présent l'accès à votre serveur via un "ssh user@localhost -p 6985" - la connexion devrait s'initier rapidement et vous demander votre mot de passe.

Si tout est OK, supprimez les règles par défaut :

firewall-cmd --remove-service ssh --permanent
firewall-cmd --reload

Votre pare-feu local n'aura plus le port 22 TCP en écoute (toutes les connexions initiées sur ce port seront donc coupées) - Fail2ban bloquera toute tentative forcée sur votre nouveau port d'écoute SSH.


Quelques configurations nécessaires

Le protocole SSH vous permet beaucoup de choses en terme de connectivité et de services. Pour majorité des cas, le SSH permet de se connecter à distance sur des machines de type serveur. Ainsi, le X11 Forwarding, le TCP forwarding ou encore le tunneling n'est pas nécessaire - pire, ça pourrait service de rebond en cas d'attaque. L'idée, c'est de bloquer ce qui n'est pas utile.

PermitRootLogin no ##Refuser l'authentification de root en direct sur SSH
StrictModes yes
MaxAuthTries 6 ##Accepter jusqu'à 6 erreurs de login sur un même compte
MaxSessions 5 ##Nombre de connexion maximale permis en simultané
AllowTcpForwarding no ##Refuser le TCP Forwarding (bloque les rebonds)
GatewayPorts no
X11Forwarding no ##Refuser l'affichage d'une interface graphique via SSH
X11UseLocalhost no ##Refuser l'affichage d'une interface graphique via SSH même en localhost
PermitTTY no
PermitTunnel no ##Refuser la création de tunnel SSH

Configuration IPv4 et IPv6

Vous n'utilisez pas l'IPv6 ? Alors bloquez-le ! Commentez la ligne "ListenAddress ::" et le daemon SSH n'écoutera plus en IPv6.


Utiliser une paire de clé SSH

Côté client : Générer une paire de clé SSH et l'envoyer vers les serveurs concernés

ssh-keygen -t ed25519
ssh-copy-id -i ./ssh/id_ed25519.pub utilisateur@serveurdistant -p 6985

Côté serveur : modifier le fichier "/etc/ssh/sshd_config" pour y ajouter les options nécessaires à la connexion par clé SSH uniquement. Cette configuration empêchera l'authentification SSH par mot de passe.

nano /etc/ssh/sshd_config

## forcer l'authentification par clé
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys #emplacement du fichier de clé publique, doit être le même pour tous les utilisateurs concernés
PasswordAuthentication no #bloquer l'authentification par mot de passe
PermitEmptyPasswords no #empêcher les mots de passe vide
UsePAM no
ChallengeResponseAuthentication no

Source d'inspiration - marksei.com // ANSSI - "Guide pour une administration sécurisée"
Envie de participer à la rédaction de l'article ? Envoyez vos commentaires !

Mots clés

Julien HOMMET

Bercé par l'informatique depuis mon plus jeune âge, je transforme ma passion en expertise.

Super ! Vous vous êtes inscrit avec succès.
Super ! Effectuez le paiement pour obtenir l'accès complet.
Bon retour parmi nous ! Vous vous êtes connecté avec succès.
Parfait ! Votre compte est entièrement activé, vous avez désormais accès à tout le contenu.