Protéger un accès SSH avec fail2ban sous CentOS 7

Se prémunir de tentatives d’intrusion serveur en protégeant l’accès SSH avec fail2ban sous CentOS 7

Une connexion SSH sur un serveur est une opération plutôt sécurisée, mais cela ne veut pas dire que le serveur en question est protégé d’une quelconque tentative d’intrusion, notamment par force brute. D’ailleurs en analysant les logs système, même sur un petit serveur anodin, on peut en général voir des dizaines, voir des centaines de connexions avec des utilisateurs connus (root) ou inconnus qui échouent. Ce ne sont pas des attaques à proprement parler, mais des tentatives de connexion en essayant des combinaisons de nom d’utilisateur et de mot de passe. C’est sur ce genre de terrain que fail2ban peut aider à mieux protéger un serveur de connexions non voulues en créant des règles de pare-feu automatiquement suivant certaines conditions.

Installation de fail2ban

Pour une installation sous CentOS 7 comme c’est le cas ici, fail2ban n’est pas disponible dans le dépôt officiel, par contre il existe dans EPEL (Extra Packages for Enterprise Linux), il faut donc l’avoir installé au préalable.

sudo yum install epel-release

Maintenant le paquet est disponible, il peut être installé et démarré dans la foulée :

sudo yum install fail2ban
sudo systemctl enable fail2ban


Configuration d’un jail SSH

Cet article n’a pas pour but d’être une documentation pour fail2ban mais simplement de rapidement sécuriser l’accès SSH d’une machine. Pour faire vite, fail2ban fonctionne par jail, un jail est une combinaison d’un filtre et d’actions à faire lorsque la ou les conditions sont remplies.

La configuration de fail2ban se trouve sous /etc/fail2ban, il y a d’ailleurs un fichier jail.conf par défaut. Il est bon de ne pas toucher à ce fichier, mais d’ajouter les modifications dans un fichier jail.local qui sera toujours lu en priorité par rapport à jail.conf.

On peut créer notre fichier jail.local avec une configuration de base :

$ sudo vim /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600

findtime = 600
maxretry = 3

ignoreip = 127.0.0.1/8 98.221.20.124

destemail = votre@email.net
sender = postmaster@email.net
sendername = Fail2Ban
mta = sendmail

action = %(action_mwl)s

[sshd]
enabled = true

Certains paramètres de la section [DEFAULT] ont été modifiés, en commençant par la durée de bannissement (bantime) qui est seulement de 10 minutes par défaut, elle est ici augmentée à 1 heure. C’est à dire que lorsqu’une IP se fait bannir, celle-ci ne pourra plus tenter de se connecter durant 1 heure.

Les deux paramètres suivant vont de pair. Il s’agit du nombre de fois (maxretry) qu’un utilisateur peut réessayer de se connecter pendant une durée définie (findtime) avant d’être banni pour la durée bantime. Par défaut, un utilisateur peut réessayer 5 fois, il est réduit à 3.

ignoreip permet d’ajouter des adresses IP qui seront exclues des jails. Si vous vous connectez souvent depuis un même poste en IP fixe, il est intéressant de pouvoir s’exclure.

Ensuite vient la partie de paramétrage des notifications par email. Mettre sendmail pour Postfix.

La ligne action détermine le type d’action à entreprendre lors d’un bannissement. Par défaut elle est renseignée à %(action_)s qui signifie que l’IP est bannie sans notification. %(action_mw)s envoie un email avec l’IP et le résultat du WHOIS, alors que %(action_mwl)s envoie un email avec l’IP, le résultat du WHOIS et les lignes correspondantes dans les logs. C’est cette dernière action que je choisis pour avoir le plus d’informations.

Ensuite on peut ajouter des sections pour les jails, ici uniquement [sshd] que l’on active avec enabled = true.

On peut redémarrer fail2ban :

sudo systemctl restart fail2ban

Et voir son état avec la commande fail2ban-client qui retourne des informations sur :

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

Pour avoir des informations sur le jail sshd, ajouter son nom comme ceci :

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 163
| `- File list: /var/log/secure
`- Actions
 |- Currently banned: 1
 |- Total banned: 38
 `- Banned IP list: 78.13.139.14

Je vois ici qu’une IP (78.13.139.14) est bloquée en ce moment, qu’il y en a eu 38 en tout et que 163 échecs de connexion ont eu lieu.

Sinon le fichier de log de fail2ban se trouve logiquement sous /var/log/fail2ban.log.

La petite astuce de fin d’article pour rapidement dé-bannir une IP (cela peut arriver lors de tests) :

fail2ban-client set NOM_DU_JAIL unbanip ADRESSE_IP

Ceci est une petit introduction à fail2ban centrée sur le SSH, mais celui-ci permet de faire beaucoup plus, n’hésitez pas à lire la documentation officielle et les nombreux tutoriels disponibles en ligne.

2 thoughts on “Protéger un accès SSH avec fail2ban sous CentOS 7”

  1. Bonjour,

    j’ai mis en place fail2ban comme vous l’expliquez. J’ai fait un test et l’IP avec laquelle j’ai tenté de me connecter se retrouver bien « BAN » dans les log de fail2ban, MAIS je peux toujours ensuite tenter de me connecter avec cette même ip indéfiniment.
    Il semblerait que fail2ban essaie de ban l’IP mais que la « connexion » entre fail2ban et firewalld ne se fait pas.

    Avez-vous une idée de pourquoi ?

    Kevin

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *