Gestion règles Fail2ban
Fail2ban
fonctionne à l'aide de configuration de règles, basées sur des expressions régulières, dans des fichiers chargés au chargement.
Cet article présente l'outil fail2ban-regex
qui permet de tester les configurations, utile avant l'activation de la définition d'un banissement..
Sommaire
Votre avis
Nobody voted on this yet
|
|
Validation expression régulière
Les bannissements sont déclenchés à partir d'expressions régulières appliquées sur les fichiers trace. Il est nécessaire de valider la bonne rédaction de celles-ci avant l'activation d'une configuration pour s'assurer qu'aucune erreur n'est introduite.
Validation sur chaîne caractères
Un premier test possible consiste à appliquer une expression régulière sur une chaîne de caractère. Pour cela, il faut utiliser la commande fail2ban-regex
avec pour premier argument la chaîne de test, et l'expression régulière comme deuxième argument. IL est fortement recommandé d'encadrer les valeurs par le caractères "
pour s'affranchir des problèmes liés aux espaces.
#sudo fail2ban-regex "[Sun Mar 11 18:33:35 2012] [error] [client 219.232.242.157] File does not exist: /var/www/default/phpMyAdmin-2.5.1" "[[]client <HOST>[]] (File does not exist|script not found or unable to stat): \/var\/www\/default\/phpMyAdmin-2.5.1" Running tests ============= Use failregex line : [[]client <HOST>[]] (File does not exist|script no... Use single line : [Sun Mar 11 18:33:35 2012] [error] [client 219.232... Results ======= Failregex: 1 total |- #) [# of hits] regular expression | 1) [1] [[]client <HOST>[]] (File does not exist|script not found or unable to stat): \/var\/www\/default\/phpMyAdmin-2.5.1 `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [1] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)? `- Lines: 1 lines, 0 ignored, 1 matched, 0 missed [processed in 0.00 sec]
Attention, il n'est pas possible d'utiliser toutes les options de configurations, comme les variables, dans les expressions régulières testées. P
Le résultat de la commande va permettre de vérifier si l'expression régulière déclanche une validation sur la chaîne, en consultant la valeur de matched
.
Validation sur fichier
La précédente méthode peut également s'appliquer sur un fichier complet. Il suffit de remplacer le premier argument par l'emplacement du fichier sur lequel l'expression régulière doit être testée.
#sudo fail2ban-regex /var/log/apache2/error.log "[[]client <HOST>[]] (File does not exist|script not found or unable to stat): \/var\/www\/default\/phpMyAdmin-2.5.1" Running tests ============= Use failregex line : [[]client <HOST>[]] (File does not exist|script no... Use log file : /var/log/apache2/error.log Use encoding : UTF-8 Results ======= Failregex: 0 total Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [16013] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)? `- Lines: 16013 lines, 0 ignored, 0 matched, 16013 missed [processed in 1.95 sec]
Dans le cadre de cet exemple, aucune ligne ne déclenche l'expression régulière.
Validation configuration sur fichier
Le précédent paragraphe indique comment diagnostiquer une expression régulière. Il est également possible de contrôler l'impact d'une configuration complète sur un fichier. Le principe est exactement le même, il faut utiliser la commande fail2ban-regex
en fournissant l'emplacement du fichier à contrôler en premier argument, puis l'emplacement de la configuration en second argument.
#sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf Running tests ============= Use failregex filter file : sshd, basedir: /etc/fail2ban Use maxlines : 10 Use log file : /var/log/auth.log Use encoding : UTF-8 Results ======= Failregex: 513 total |- #) [# of hits] regular expression | 3) [222] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?Failed \S+ for (?P<cond_inv>invalid user )?(?P<user>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)) from <HOST>(?: port \d+)?(?: on \S+(?: port \d+)?)?(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$) | 5) [110] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?[iI](?:llegal|nvalid) user .*? from <HOST>(?: port \d+)?(?: on \S+(?: port \d+)?)?\s*$ | 13) [181] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=\S*\s*rhost=<HOST>\s.*(?: \[preauth\])?\s*$ `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [1472] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)? `- Lines: 1472 lines, 0 ignored, 513 matched, 959 missed [processed in 2.05 sec]
Dans cet exemple, 513 lignes du fichier /var/log/auth.log
déclenche la validation dans la configuration /etc/fail2ban/filter.d/sshd.conf
.
Affichage des validations
La commande fail2ban-regexp
dispose de l'argument --print-all-matched
qui va permettre d'afficher les lignes qui déclenche la validation de la configuration ou de l'expression régulière. L'exemple suivant permet d'afficher les lignes, depuis le fichier /var/log/auth.log
, qui déclenche la validation dans la configuration /etc/fail2ban/filter.d/sshd.conf
.
#sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf Running tests ============= Use failregex filter file : sshd, basedir: /etc/fail2ban Use maxlines : 10 Use log file : /var/log/auth.log Use encoding : UTF-8 Results ======= Failregex: 513 total |- #) [# of hits] regular expression | 3) [222] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?Failed \S+ for (?P<cond_inv>invalid user )?(?P<user>(?P<cond_user>\S+)|(?(cond_inv)(?:(?! from ).)*?|[^:]+)) from <HOST>(?: port \d+)?(?: on \S+(?: port \d+)?)?(?: ssh\d*)?(?(cond_user): |(?:(?:(?! from ).)*)$) | 5) [110] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?[iI](?:llegal|nvalid) user .*? from <HOST>(?: port \d+)?(?: on \S+(?: port \d+)?)?\s*$ | 13) [181] ^(?:\[\])?\s*(?:<[^.]+\.[^.]+>\s+)?(?:\S+\s+)?(?:kernel: \[ *\d+\.\d+\]\s+)?(?:@vserver_\S+\s+)?(?:(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)\s+)?(?:\[ID \d+ \S+\]\s+)?(?:(?:error|fatal): (?:PAM: )?)?pam_unix\(sshd:auth\):\s+authentication failure;\s*logname=\S*\s*uid=\d*\s*euid=\d*\s*tty=\S*\s*ruser=\S*\s*rhost=<HOST>\s.*(?: \[preauth\])?\s*$ `- Ignoreregex: 0 total Date template hits: |- [# of hits] date format | [1472] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)? `- Lines: 1472 lines, 0 ignored, 513 matched, 959 missed [processed in 2.05 sec] |- Matched line(s): | Mar 18 00:18:47 server sshd[27335]: Invalid user postgres from 51.254.47.198 port 49296 | Mar 18 00:18:47 server sshd[27335]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=51.254.47.198 | Mar 18 00:18:49 server sshd[27335]: Failed password for invalid user postgres from 51.254.47.198 port 49296 ssh2 | Mar 18 00:23:42 server sshd[27416]: Invalid user ftpuser from 163.172.20.129 port 40433 | Mar 18 00:23:42 server sshd[27416]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=163.172.20.129 | Mar 18 00:23:44 server sshd[27416]: Failed password for invalid user ftpuser from 163.172.20.129 port 40433 ssh2 | Mar 18 00:26:08 server sshd[27453]: Invalid user postgres from 115.146.127.81 port 37892 | Mar 18 00:26:08 server sshd[27453]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=115.146.127.81 | Mar 18 00:26:10 server sshd[27453]: Failed password for invalid user postgres from 115.146.127.81 port 37892 ssh2 | Mar 18 00:35:26 server sshd[27521]: Invalid user ftpuser from 88.26.245.85 port 51740 | Mar 18 00:35:26 server sshd[27521]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=88.26.245.85 | Mar 18 00:35:28 server sshd[27521]: Failed password for invalid user ftpuser from 88.26.245.85 port 51740 ssh2 | Mar 18 00:45:54 server sshd[27957]: Invalid user postgres from 180.100.217.67 port 40003 | Mar 18 00:45:54 server sshd[27957]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=180.100.217.67 | Mar 18 00:45:56 server sshd[27957]: Failed password for invalid user postgres from 180.100.217.67 port 40003 ssh2 | Mar 18 00:51:02 server sshd[28015]: Invalid user zimeip from 94.153.194.22 port 59628 . . . `-