====== Sécuriser activement avec fail2ban ======
Les accès "brute force" sont des tentatives répétées d'entrer sur votre serveur, en testant plusieurs logins possibles, ou en testant de nombreuses URL afin de trouver un service mal protégé et rentrer dans votre serveur illégalement.
L'outil fail2ban observer les journaux systèmes afin de déclencher des actions, typiquement un ban via le pare-feu ''iptables''.
===== brute force sur ssh =====
Pour SSH spécifiquement, on recommande systématiquement l'installation de ''apt install fail2ban''.
C'est un système qui observe vos tentatives d'accès à votre serveur et qui bannit automatiquement et temporairement les adresses IP qui tentent de rentrer abusivement. C'est très efficace et ça réduit la taille de ''/var/log/auth.log'' (ce qui le rend plus lisible donc plus efficace).
Par défaut il protège SSH sur son port 22, en analysant les abus et erreurs d'authentification dans son fichier ''/var/log/auth.log''.
:!: si l'on a changé le port du serveur SSH en 12345, il faudra le dire à fail2ban. Créez ou modifiez le fichier ''/etc/fail2ban/jail.local'' (pensez à ''service fail2ban restart'' une fois édité):
[ssh]
enabled = true
port = 12345
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
===== recherche abusive de point d'attaque sur nginx =====
Den ombreux "script-kiddies" font tourner des programmes qui testent toute une série de logiciels pouvant être installé afin d'en trouver une version avec une faille de sécurité connue. On les repère aisément car ils font une série brutales d'accès à l'aveugle, qui résultent pour la plupart en une erreur 404 "not found".
Il est trivial de bloquer les IP source pendant un petit délai, par exemple 300 secondes (5 minutes) si on détecte de 10 essais infructueux en moins de 10 secondes:
[Definition]
failregex = ^.*"(GET|POST).*" (404|444|403|400) .*$
ignoreregex =
# A ajouter à la fin du fichier:
[nginx-4xx]
enabled = true
port = http,https
filter = nginx-4xx
logpath = /var/log/nginx/access.log
bantime = 300
findtime = 10
maxretry = 10
Enfin, on relance et on teste avec:
service fail2ban restart
fail2ban-client status nginx-4xx
===== brute force sur nginx =====
''fail2ban'' peut être facilement utilisé pour déclencher une action de barrage sur la base d'expressions régulières trouvées "trop souvent" dans un ou plusieurs fichiers journaux.
Par exemple, pour protéger d'accès intempestifs sur votre serveur web nginx vous pouvez créer le fichier de détection ''/etc/fail2ban/filter.d/nginx-forbidden.conf'':
[Definition]
failregex = ^ \[error\] \d+#\d+: .*directory index.*forbidden.*, client: , .*$
^ \[error\] \d+#\d+: .*Connection refused.*, client: , .*$
# On cherche à collecter les adresses IP des lignes suivantes:
# 2022/04/16 17:49:16 [error] 16133#16133: *12898 directory index of "/home/www/dl.tecrd.com/" is forbidden, client: 185.59.221.123, server: dl.tecrd.com, request: "GET / HTTP/1.1", host: "dl.tecrd.com"
# 2022/04/16 17:49:14 [error] 16133#16133: *12882 connect() failed (111: Connection refused) while connecting to upstream, client: 185.59.221.123, server: visio.tecrd.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:9900/", host: "visio.tecrd.com"
ignoreregex =
Le fichier d'action qui l'accompagne est ''/etc/fail2ban/jail.d/nginx-forbidden.conf'':
[nginx-forbidden]
enabled = true
filter = nginx-forbidden
port = http,https
logpath = /var/log/nginx/*error*.log
findtime = 60
bantime = 2000
maxretry = 4
:!: Fail2ban permet de tester en amont la validité des règles (voyez ci-dessous), mais aussi d'avoir des statistiques, par exemple ici avec:
fail2ban-client status nginx-forbidden
Status for the jail: nginx-forbidden
|- Filter
| |- Currently failed: 0
| |- Total failed: 15
| `- File list: /var/log/nginx/test-main.error.log /var/log/nginx/bbb.tecrd.com.error.log /var/log/nginx/ccc-gen.error.log /var/log/nginx/error.log
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 176.164.85.123
===== brute force sur postgresql =====
On peut ajouter ces règles:
Dans ''/etc/fail2ban/jail.d/postgres.conf'':
[postgresql]
enabled = true
port = 5432
protocol = tcp
filter = custom-postgresql
logpath = /var/log/postgresql/postgresql-*-main.log
maxretry = 3
Puis le filtre dans ''/etc/fail2ban/filter.d/custom-postgresql.conf'':
[Definition]
failregex = ^.+FATAL: password authentication failed for user.+$
^.+FATAL: no pg_hba.conf entry for host .+$
ignoreregex = duration:#
Enfin, pour que celui-ci marche, on modifie la composition du fichier log de postgresql afin d'y mettre l'IP client en-tête. C'est dans le fichier ''/etc/postgresql/13/main/postgresql.conf'':
(...)
log_line_prefix = '%h %m [%p] %q%u@%d '
(...)
:!: on peut tester avec ''fail2ban-regex /etc/fail2ban/filter.d/custom-postgresql.conf /var/log/postgresql/postgresql-12-main.log''.