Gestion règles Fail2ban

De EjnTricks

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..


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Icon-Configuration-Settings.png 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.

Html-Editor-icon.png 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.


File-find-icon.png 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.


Folder inspection icon.png 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.


Icon-log.png 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
.
.
.
`-