Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
pratique:informatique:fail2ban [09/10/2023 22:29] – [D'où viennent les attaques ?] Zatalyz | pratique:informatique:fail2ban [23/01/2024 11:48] (Version actuelle) – [Commandes Iptables utiles] Zatalyz | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Fail2ban et Iptables ====== | ====== Fail2ban et Iptables ====== | ||
+ | |||
+ | <WRAP center round important 100%> | ||
+ | Tout ça n'est pas encore au point. | ||
+ | |||
+ | À un moment faudra que tout ça soit revu de fond en comble... J' | ||
+ | |||
+ | En attendant, n' | ||
+ | </ | ||
+ | |||
Fail2ban logiciel me file des boutons mais je n'ai pas vraiment trouvé de remplaçant. Son principal mérite est de délayer les attaques par brute-force ; en principe notre serveur n'y est pas vulnérable, | Fail2ban logiciel me file des boutons mais je n'ai pas vraiment trouvé de remplaçant. Son principal mérite est de délayer les attaques par brute-force ; en principe notre serveur n'y est pas vulnérable, | ||
Ligne 75: | Ligne 84: | ||
#-A INPUT -m set --match-set blocklist_ip src -j DROP | #-A INPUT -m set --match-set blocklist_ip src -j DROP | ||
# Ça, ça ne veut pas... | # Ça, ça ne veut pas... | ||
+ | |||
+ | #rejeter tout le reste | ||
+ | -A INPUT -j REJECT --reject-with icmp-port-unreachable | ||
</ | </ | ||
+ | |||
==== Commandes Iptables utiles ==== | ==== Commandes Iptables utiles ==== | ||
Lister " | Lister " | ||
Ligne 86: | Ligne 99: | ||
iptables -L INPUT --line-numbers | iptables -L INPUT --line-numbers | ||
+ | Sauf que ce n'est pas " | ||
+ | iptables -t nat -S | ||
+ | |||
Enlever une règle d' | Enlever une règle d' | ||
iptables -D INPUT 14 | iptables -D INPUT 14 | ||
Ligne 91: | Ligne 107: | ||
Restaurer des règles | Restaurer des règles | ||
iptables-restore / | iptables-restore / | ||
+ | |||
+ | ==== Quelques explications ==== | ||
+ | === Différence entre -I et -A === | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Bref, quand on a un fichier qui charge les règles, elles sont forcément les unes après les autres, '' | ||
+ | |||
+ | === DROP ou REJECT --reject-with icmp-port-unreachable === | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | |||
+ | === Ordre des règles === | ||
+ | Les règles sont appliquées dans l' | ||
+ | |||
+ | Donc il faut que les commandes d' | ||
+ | - On regarde si l'un de ces logiciels dit qu'il faut bloquer l' | ||
+ | - Si oui, elle dégage | ||
+ | - Si non, on passe à la règle suivante | ||
+ | - La règle suivante étant "on accepte" | ||
+ | |||
+ | Sinon, ça serait : | ||
+ | - On accepte la connexion | ||
+ | - On regarde si fail2ban... ah ben non, forcément, ça ne marche pas, puisque la connexion est acceptée. | ||
===== Ipset ===== | ===== Ipset ===== | ||
- | Créer une entrée pour toutes les ip qui vont être renvoyées dans les limbes (adapter le nom '' | + | Créer une entrée pour toutes les ip qui vont être renvoyées dans les limbes (adapter le nom '' |
ipset create blocklist_ip hash:ip | ipset create blocklist_ip hash:ip | ||
Ligne 205: | Ligne 247: | ||
fail2ban-server -t | fail2ban-server -t | ||
systemctl restart fail2ban | systemctl restart fail2ban | ||
- | ==== À faire ==== | + | |
+ | ==== Commandes fail2ban utilisées régulièrement ==== | ||
+ | * Liste des jails : '' | ||
+ | * Statut d'une jail : '' | ||
+ | * Vérifier la configuration avant de relancer : '' | ||
+ | * Bannir une ip en particulier : '' | ||
+ | * Et la débannir : '' | ||
+ | ==== Faire ses propres règles Fail2ban ==== | ||
+ | Il y a quelques améliorations à faire concernant les filtres. | ||
+ | |||
+ | === Rendre le filtre postfix par défaut plus agressif === | ||
+ | Par défaut, la jail " | ||
+ | |||
+ | Cherchez la ligne | ||
+ | mode = more | ||
+ | |||
+ | Et remplacer par | ||
+ | mode = aggressive | ||
+ | |||
+ | Et voilà, là, des messages comme " | ||
+ | |||
+ | === Ajouter des regex et configurer une jail " | ||
+ | |||
+ | Malgré ça, j'ai encore quelques tentatives des plus douteuses, pas toujours repérées/ | ||
+ | |||
+ | Voici un exemple de certaines lignes que je souhaite filtrer : | ||
+ | < | ||
+ | 2023-10-09T22: | ||
+ | 2023-10-08T18: | ||
+ | 2023-10-15T22: | ||
+ | 2023-07-28T09: | ||
+ | </ | ||
+ | * Envoyer une commande foireuse ? Qui fait ça en dehors de ceux qui testent les fragilités d'une installation ? | ||
+ | * Un hostname mal déclaré ? Sérieusement, | ||
+ | * Notez au passage que tout ce qui contient tiscali.it et censys est toujours bon à bloquer, c'est toujouuuurs des comportements douteux. | ||
+ | * Une commande non SMTP ? Hey, t'as cru que c' | ||
+ | |||
+ | On va donc se créer son propre filtre pour ces cochons, avec un '' | ||
+ | < | ||
+ | # Filtre perso alimenté par les détections de trucs vraiment louches. | ||
+ | [INCLUDES] | ||
+ | before = common.conf | ||
+ | [Definition] | ||
+ | failregex = ^.*\[< | ||
+ | ^.* NOQUEUE: reject: RCPT from unknown\[< | ||
+ | ^.*connect from .*censys.*\[< | ||
+ | ignoreregex = | ||
+ | [Init] | ||
+ | journalmatch = _SYSTEMD_UNIT=postfix.service | ||
+ | |||
+ | </ | ||
+ | |||
+ | Notez que chaque ligne de la partie " | ||
+ | |||
+ | Par ailleurs il faut inclure '' | ||
+ | |||
+ | On peut ensuite lancer cette commande pour voir si ça checke des correspondances : | ||
+ | sudo fail2ban-regex / | ||
+ | |||
+ | Dans le résultat, on doit avoir quelque chose comme ça : | ||
+ | < | ||
+ | |- #) [# of hits] regular expression | ||
+ | | 1) [9] ^.* improper command pipelining after CONNECT from unknown\[< | ||
+ | | 2) [1] ^.*\[< | ||
+ | | 3) [1] ^.* NOQUEUE: reject: RCPT from unknown\[< | ||
+ | | 4) [10] ^.*connect from .*censys.*\[< | ||
+ | `- | ||
+ | </ | ||
+ | Ici j'ai donc 9 correspondances sur la première expression, 1 pour chacune des deux suivants et 10 pour ce sale bot à la fin : c'est bon, ça scanne. | ||
+ | |||
+ | On ajoute ensuite la jail dans notre ''/ | ||
+ | < | ||
+ | [XX_perso_postfix] | ||
+ | #mes propres bidouilles pour virer des chieurs bien repérés | ||
+ | enabled = true | ||
+ | port = pop3, | ||
+ | filter = XX_perso_postfix | ||
+ | maxretry = 1 | ||
+ | findtime = 600 | ||
+ | bantime = 30d | ||
+ | action | ||
+ | </ | ||
+ | * Le nom de la jail doit être celui du filtre, visiblement, | ||
+ | * Il va chercher tout seul le filtre dans ''/ | ||
+ | * Les ports j'ai copié ce qui marchait avec la jail de base de postfix. | ||
+ | * 1 tentative. Une seule. Limite je me demande pourquoi je déclare le findtime. Et ensuite 30 jours de bannissement ! | ||
+ | * l' | ||
+ | |||
+ | Ensuite, on teste si on n'a pas fait de bêtise avec cette commande (ça évitera des agacements) : | ||
+ | sudo fail2ban-server -t | ||
+ | Tout marche ? alors, on charge : | ||
+ | sudo service fail2ban reload | ||
<WRAP center round todo 100%> | <WRAP center round todo 100%> | ||
Il faut améliorer les regexp (avec fail2ban-regex). pour virer plus large : | Il faut améliorer les regexp (avec fail2ban-regex). pour virer plus large : | ||
- toute ip qui tente de se co en ssh avec un user qui n'est pas autorisé => ban définitif | - toute ip qui tente de se co en ssh avec un user qui n'est pas autorisé => ban définitif | ||
- | - toute ip qui passe des commandes à postfix qui ne sont pas " | ||
</ | </ | ||
- | La ligne postfix que j' | ||
- | 2023-07-28T09: | ||
===== Bannir définitivement les IP harcelantes ===== | ===== Bannir définitivement les IP harcelantes ===== | ||
Ligne 373: | Ligne 503: | ||
* https:// | * https:// | ||
* https:// | * https:// | ||
+ | * http:// | ||