120812 17:11:52 141 Connect Access denied for user 'root'@'sidlol.zehome.org' (using password: YES)
141 Connect root@sidlol.zehome.org as on
120812 17:22:47 142 Connect Access denied for user 'root'@'sidlol.zehome.org' (using password: YES)
142 Connect root@sidlol.zehome.org as on
120812 17:22:49 143 Connect Access denied for user 'root'@'sidlol.zehome.org' (using password: YES)
143 Connect root@sidlol.zehome.org as on
120812 17:22:51 144 Connect Access denied for user 'root'@'sidlol.zehome.org' (using password: YES)
144 Connect root@sidlol.zehome.org as on
Regarde mes logs : Ils sont sur 5 lignes - et - sur la ligne qui nous interesse ( la 4ème : Access denied for user…) la date n’y est pas…
120812 16:35:15 66 Connect phpmyadmin@localhost on
66 Query SET CHARACTER SET 'utf8'
66 Query SET collation_connection = 'utf8_general_ci'
67 Connect Access denied for user 'zorgf'@'localhost' (using password: YES)
66 Quit
Sur tes logs par contre tout est sur la même ligne et je pense que c’est pour celà que ça fonctionne
120812 17:11:52 141 Connect Access denied for user 'root'@'sidlol.zehome.org' (using password: YES)
141 Connect root@sidlol.zehome.org as on
Comment puis-je faire pour avoir des logs identiques aux tiens ?
EDIT : Ma config MySQL
[code][…]
* Logging and Replication
Both location gets rotated by the cronjob.
Be aware that this log type is a performance killer.
##AJOUT POUR FAIL2BAN -----* ### Ne change rien au niveau de MySQL apparemment…******* #LogFormat “%h %l %u %t “%r” %>s %b
#”%{Referer}i" “%{User-Agent}i” %{userID}n %{userStatus}n" pma_combined #-------------------------------------------------
[…][/code]
[code]120812 19:16:45 110 Connect Access denied for user ‘root’@‘localhost’ (using password: YES)
120812 19:16:52 111 Connect phpmyadmin@localhost on
111 Query SET CHARACTER SET 'utf8’
111 Query SET collation_connection = 'utf8_general_ci’
112 Connect Access denied for user ‘gnouless’@‘localhost’ (using password: YES)
111 Quit[/code]
La 1ère ligne est une connexion directe via le terminal à mySQL
Les autres dernières lignes sont les logs générés à partir de phpMyAdmin.
Donc le problème se resserre… C’est la façon dont se connecte phpMyAdmin à la BDD qui génère des logs différents…
J’avais pensé à modifier l’expression régulière… ou modifier les requêtes de connexion phpMyAdmin ? mais je vois pas comment…
Impossible de bloquer les accès foirés depuis phpmyadmin…
Les requêtes sont plus complexes, génèrent plus de code, ne sont pas détectées par fail2ban, [size=150]et elles sont faites depuis localhost[/size].
fail2ban ne peux pas décemment bloquer localhost, sinon, c’est ton serveur qui tombe…
La seule solution est de bloquer les tentatives sur phpmyadmin, mais pas depuis phpmyadmin…
De plus si un intrus est déjà dans phpmyadmin “t’es mort”…
Peut-on revenir au besoin initial ?
Est-ce la protection des connections de type brute force à PhpMyAdmin ?
Si oui, pourquoi ne pas rendre PhpMyAdmin invisible de l’extérieur et limiter son accès au réseau local ?
Si ce n’est pas possible, pourquoi ne pas changer le port de connection vers un autre moins connu ?
Si ce n’est pas toujours possible, patcher PhpMyAdmin pour loguer dans un fichier spécifique les tentatives infructueuses qui sera analysé par fail2ban et par suite, l’adresse IP sera bloquée.
phpmyadmin offre des variables personnalisées disponibles pour les logs, en particulier le nom et le status de l’utilisateur. Nous allons les utiliser pour détecter les tentatives de connexion.
Pour cela, modifier le format des logs ainsi :
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i” %{userID}n %{userStatus}n” pma_combined
CustomLog ${APACHE_LOG_DIR}/access.log pma_combined[/quote]
Les variables %{userID}n %{userStatus}n peuvent prendre par exemple comme valeur : root et mysql-denied
Devinez quoi ? Ca marche pas !
Il semblerais qu’Apache n’arrive pas à récupérer ces 2 variables car mes logs ressemblent à ça :
Les 2 tirets à la fin aurait du correspondre à la valeur de %{userID}n et %{userStatus}n…
Je précise qu’il s’agit du fichier monsiteweb_access.log, donc ce n’est pas une erreur en tant que tel mais ça permet déjà de récupérer ladresse publique (xx.xx.xx.xx)
… mais faudrait déjà que ça marche… lol
Le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf
[Definition]
failregex = [[]client <HOST>[]] File does not exist: .*admin
[[]client <HOST>[]] File does not exist: .*myadmin
[[]client <HOST>[]] File does not exist: .*mysql
[[]client <HOST>[]] File does not exist: .*mysqladmin
[[]client <HOST>[]] File does not exist: .*mysqldb
ignoreregex =
Le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf
[Definition]
failregex = [[]client <HOST>[]] File does not exist: .*admin
[[]client <HOST>[]] File does not exist: .*myadmin
[[]client <HOST>[]] File does not exist: .*mysql
[[]client <HOST>[]] File does not exist: .*mysqladmin
[[]client <HOST>[]] File does not exist: .*mysqldb
ignoreregex =
# * Logging and Replication
log_error = /var/log/mysql/mysql.err
#valeur superieur à 1 --> log access-denied dans mysql.err
#permet d avoir 1 ligne d access denied avec la date pour creer une regle fail2ban
log_warnings = 2
#next line is in 5.7 dont work in 5.5 !
#log_error_verbosity = 3
general_log_file = /var/log/mysql/mysql.log
general_log = 1
...
puis:
patch de fail2ban :
Dans le fichier /usr/share/fail2ban/server/datedetector.py ajoutez ceci (ligne 144)
================================================================
PS: THX TO :
FOR fail2ban REGEX timestamp
(addition line 144 of /usr/share/fail2ban/server/datedetector.py)
ajouter un filter fail2ban :
###########################################
#
# MYSQLD FAIL2BAN PLUGIN
# BY NBA 20160110
#
# WARNING: Using log entry in mysql.err
#
###########################################
#
#
# mysql5.5 : add in /etc/my.cnf :
# #log_error = /var/log/mysql/mysql.err
# #log_warnings = 2
# ==> it will generate 1 unique line in /var/log/mysql/mysql.err for access-denied:
# ex:
# 160110 4:58:38 [Warning] Access denied for user 'root'@'170.178.171.224' (using password: YES)
#
# Writing a REGEX for handling this log line
[Definition]
failregex = (.*) Access denied for user '.*'@'<HOST>'
##########################################
ajouter une jail dans fail2ban :
ATTENTION: on utilise mysql.err et pas mysql.log
#
# MYSQL SERVER PORT 3306 (pas phpmyadmin !! sinon on bannit localhost dans phpmyadmin@localhost !!)
# phpmyadmin se gère plus facilement avec apache !
#
[mysql]
enabled = true
port = 3306
filter = mysqld
logpath = /var/log/mysql/mysql.err
maxretry = 6
Voilà, un petit :
et ça marche du tonerre !
cd /var/log/mysql
# le logrotate vient de passé (on est dimanche matin tôt)
# ==> gunzip mysql.err.1.gz pour avoir des logs à tester !
gunzip mysql.err.1.gz
puis :
Running tests
=============
Use regex file : /etc/fail2ban/filter.d/mysqld.conf
Use log file : mysql.err.1
##### NBA #####
## Le logrotate viens de passé j'utilise donc le fichier de log précédent mysql.err.1 pour les tests
##### /NBA #####
Found a match for '160109 8:32:47 [Warning] Access denied for user 'root'@'localhost' (using password: YES)
' but no valid date/time found for '160109 8:32:47 [Warning] Access denied for user 'root'@'localhost' (using password: YES)
'. Please contact the author in order to get support for this format
Found a match for '160109 8:33:26 [Warning] Access denied for user 'root'@'home.soartist.net' (using password: NO)
.....
##### NBA #####
## On ignore ces erreurs car on se moque de la première valeur de la ligne de log (160109)
## Elle n'empeche pas la REGEX de fonctionner !
Results
=======
Failregex
|- Regular expressions:
| [1] Access denied for user '.*'@'<HOST>'
|
`- Number of matches:
[1] 406 match(es)
Ignoreregex
|- Regular expressions:
|
`- Number of matches:
Summary
=======
Addresses found:
[1]
115.239.231.77 (Sat Jan 09 10:00:05 2016)
61.160.247.231 (Sat Jan 09 10:34:08 2016)
61.160.247.231 (Sat Jan 09 10:34:11 2016)
61.160.247.34 (Sat Jan 09 11:20:11 2016)
....
Date template hits:
0 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Year.Month.Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>
984 hit(s): YearMonthDay Hour:Minute:Second
Success, the total number of match is 406
Merci à tous pour votre aide
PS: Généralement les REGEX ne s’appliquent qu’à une ligne unique sous UNIX ==> Dès que vous voyez des logs sur plusieurs lignes, pour faire fonctionner fail2ban, la bonne question est :
Comment faire pour que le service ne log que sur une ligne ? afin que je puisse appréhender FACILEMENT la ligne de log avec une REGEX pour fail2ban
Une fois ce problème résolue, il devient FACILE de faire fonctionner fail2ban avec n’importe quel service
PS2: Déployé sur 3 serveurs ce matin; Fonctionne IMPECCABLEMENT :
Exemple :
Mail envoyé par FAIL2BAN à l’instant (voir next section code)
Remarque:
Pour avoir les lignes de logs dans le mail fail2ban, je n’utilise pas la variable $action_mwl (ça ne fonctionne pas) mais la variable $action_mwn crée sur mesure qui utilise la variable $MATCH (matching loglines).
PS: Je ferais un autre sujet pour expliquer comment inclure les lignes de log dans le mail de fail2ban si ça intéresse quelqu’un …
Objet [Fail2Ban] mysql: banned 114.37.179.92 from host db3
De Fail2Ban
À <root@localhost>
Date Aujourd'hui 10:11
======================================
HOST: db3
======================================
Hi,
The IP 114.37.179.92 has just been banned by Fail2Ban after
7 attempts against mysql.
======================================
Matching loglines:
======================================
160110 10:11:00 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: NO\)160110 10:11:01 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)160110 10:11:02 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)160110 10:11:03 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)160110 10:11:03 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)160110 10:11:04 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)160110 10:11:05 \[Warning\] Access denied for user 'root'@'114-37-179-92.dynamic.hinet.net' \(using password: YES\)
======================================
REVERSE & DNS OF 114.37.179.92:
======================================
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> -x 114.37.179.92
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64153
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 6, ADDITIONAL: 12
;; QUESTION SECTION:
;92.179.37.114.in-addr.arpa. IN PTR
;; ANSWER SECTION:
92.179.37.114.in-addr.arpa. 85846 IN PTR 114-37-179-92.dynamic.hinet.net.
;; AUTHORITY SECTION:
in-addr.arpa. 135997 IN NS a.in-addr-servers.arpa.
in-addr.arpa. 135997 IN NS b.in-addr-servers.arpa.
in-addr.arpa. 135997 IN NS c.in-addr-servers.arpa.
in-addr.arpa. 135997 IN NS f.in-addr-servers.arpa.
in-addr.arpa. 135997 IN NS d.in-addr-servers.arpa.
in-addr.arpa. 135997 IN NS e.in-addr-servers.arpa.
;; ADDITIONAL SECTION:
a.in-addr-servers.arpa. 135997 IN A 199.212.0.73
a.in-addr-servers.arpa. 135997 IN AAAA 2001:500:13::73
b.in-addr-servers.arpa. 22976 IN A 199.253.183.183
b.in-addr-servers.arpa. 4186 IN AAAA 2001:500:87::87
c.in-addr-servers.arpa. 32172 IN A 196.216.169.10
c.in-addr-servers.arpa. 135997 IN AAAA 2001:43f8:110::10
d.in-addr-servers.arpa. 135997 IN A 200.10.60.53
d.in-addr-servers.arpa. 61136 IN AAAA 2001:13c7:7010::53
e.in-addr-servers.arpa. 8943 IN A 203.119.86.101
e.in-addr-servers.arpa. 16501 IN AAAA 2001:dd8:6::101
f.in-addr-servers.arpa. 65816 IN A 193.0.9.1
f.in-addr-servers.arpa. 80010 IN AAAA 2001:67c:e0::1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Jan 10 10:11:06 2016
;; MSG SIZE rcvd: 465
======================================
WHOIS 114.37.179.92:
======================================
% [whois.apnic.net]
% Whois data copyright terms http://www.apnic.net/db/dbcopyright.html
% Information related to '114.32.0.0 - 114.47.255.255'
inetnum: 114.32.0.0 - 114.47.255.255
netname: HINET-NET
descr: Data Communication Business Group,
descr: Chunghwa Telecom Co.,Ltd.
descr: No.21, Sec.1, Xinyi Rd., Taipei City
descr: 10048, Taiwan
country: TW
admin-c: HN27-AP
tech-c: HN27-AP
mnt-by: MAINT-TW-TWNIC
.....
En espérant que cela puisse aider certain, j’ai vu sur la première page que certains avaient pas mal galèrer pour faire fonctionner fail2ban avec mysql.