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:// | ||
+ | |||