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:parefeu:fail2ban [30/05/2024 08:20] – supprimée - modification externe (Unknown date) 127.0.0.1 | pratique:informatique:parefeu:fail2ban [10/10/2024 10:45] (Version actuelle) – [Fail2ban] Zatalyz | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Fail2ban ====== | ||
| + | |||
| + | <WRAP center round important 100%> | ||
| + | J' | ||
| + | </ | ||
| + | |||
| + | Fail2ban logiciel me file des boutons. Son principal mérite est de délayer les attaques par brute-force ; en principe notre serveur n'y est pas vulnérable, | ||
| + | |||
| + | En principe aussi, il marche bien avec nftables, le nouveau pare-feu par défaut sur debian. Sauf que là aussi le principe se heurte à la pratique et j'ai le droit à des erreurs si je tente de l' | ||
| + | |||
| + | ===== Fail2ban ===== | ||
| + | On crée un fichier dans ''/ | ||
| + | |||
| + | Il faudra aussi les tester, regarder les logs d' | ||
| + | <WRAP center round tip 60%> | ||
| + | Sur ssh : il ne faut pas indiquer ssh et sftp dans les ports, juste les numéros. Et ça va mieux. J'ai galéré un moment pour que ça marche, à cause de ça... | ||
| + | </ | ||
| + | |||
| + | Le principe est simple : on regarde dans ''/ | ||
| + | |||
| + | <WRAP center round help 60%> | ||
| + | Ça pourrait probablement s' | ||
| + | </ | ||
| + | |||
| + | Voici à quoi ressemble mon '' | ||
| + | |||
| + | < | ||
| + | [DEFAULT] | ||
| + | # Envoi un mail pour voir que ça marche... | ||
| + | destemail = monmail@mondomaine.org | ||
| + | sender = root | ||
| + | action = %(action_mwl)s | ||
| + | # Cette " | ||
| + | |||
| + | # Actions par défaut. Peut être surchargé dans les jails. | ||
| + | # Nombre de fois où une ip peut se planter | ||
| + | maxRetry = 4 | ||
| + | # Regarder les logs sur ce temps là pour voir à quel point les ip retentent le coup | ||
| + | # Pas besoin de mettre trop long, ça bouffe de la mémoire et on a autre chose pour virer | ||
| + | # celles qui s' | ||
| + | findtime = 3h | ||
| + | # Durée du bannissement. | ||
| + | bantime | ||
| + | # Si on ban quelque part, c'est partout (en principe) | ||
| + | banaction = iptables-multiport | ||
| + | |||
| + | ## Les services surveillés, | ||
| + | [sshd] | ||
| + | enabled = true | ||
| + | port = 22,226 | ||
| + | bantime | ||
| + | |||
| + | [apache-auth] | ||
| + | enabled = true | ||
| + | [apache-badbots] | ||
| + | enabled = true | ||
| + | [apache-noscript] | ||
| + | enabled = true | ||
| + | [apache-overflows] | ||
| + | enabled = true | ||
| + | [apache-nohome] | ||
| + | enabled = true | ||
| + | [apache-botsearch] | ||
| + | enabled = true | ||
| + | [apache-fakegooglebot] | ||
| + | enabled = true | ||
| + | [apache-modsecurity] | ||
| + | enabled = true | ||
| + | [apache-shellshock] | ||
| + | enabled = true | ||
| + | |||
| + | [dovecot] | ||
| + | enabled = true | ||
| + | port = pop3, | ||
| + | # | ||
| + | |||
| + | [postfix] | ||
| + | enabled = true | ||
| + | port = pop3, | ||
| + | #filter = postfix | ||
| + | |||
| + | [sieve] | ||
| + | enabled = true | ||
| + | </ | ||
| + | |||
| + | Ne pas oublier de redémarrer fail2ban ensuite. | ||
| + | fail2ban-server -t | ||
| + | systemctl restart fail2ban | ||
| + | |||
| + | ==== Mise à jour nftables ==== | ||
| + | Pour utiliser fail2ban avec nftables, et utiliser les logs de journalctl, le début du fichier doit ressemble à ceci : | ||
| + | < | ||
| + | [DEFAULT] | ||
| + | [...] | ||
| + | banaction = nftables-multiport | ||
| + | banaction_allports = nftables-allports | ||
| + | backend = systemd | ||
| + | |||
| + | </ | ||
| + | ==== 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%> | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Sources ===== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * http:// | ||
| + | |||
| + | |||
| + | {{tag> | ||
| + | |||
| + | [[https:// | ||
| + | |||