Fail2ban et Mysql

Re,
Ça fonctionne…

[quote]Results

Failregex
|- Regular expressions:
| [1] Access denied for user ‘.*’@’’
|
`- Number of matches:
[1] 1 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary

Addresses found:
[1]
10.9.8.2 (Sun Aug 12 17:11:52 2012)

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>
17 hit(s): YearMonthDay Hour:Minute:Second

Success, the total number of match is 1

However, look at the above section ‘Running tests’ which could contain important
information.[/quote]

Re,
Les logs de mysql ressemblent à ça:

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

Et bien sur…

J’ai peut être compris d’où viens l’erreur.

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.

As of 5.1 you can enable the log at runtime!

general_log_file = /var/log/mysql/mysql.log
general_log = 1

Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.

Here you can see queries with especially long duration

#log_slow_queries = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes

The following can be used as easy to replay backup logs or for replication.

note: if you are setting up a replication slave, see README.Debian about

other settings you may need to change.

#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
[…][/code]

EDIT : Ma config Apache

[code][…]

The following directives define some format nicknames for use with

a CustomLog directive (see below).

If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i

LogFormat “%v:%p %h %l %u %t “%r” %>s %O “%{Referer}i” “%{User-Agent}i”” vhost_combined
LogFormat “%h %l %u %t “%r” %>s %O “%{Referer}i” “%{User-Agent}i”” combined
LogFormat “%h %l %u %t “%r” %>s %O” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent

##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]

Oui, c’est pour ça que j’ai mis mes logs.

Tu as bien ça dans /etc/mysql/my.cnf ?

general_log_file = /var/log/mysql/mysql.log general_log = 1

Quelle version de mysql ?

Oui j’ai ces 2 lignes

Ma version de MySQL

~# apt-cache policy mysql-server mysql-server: Install��: 5.1.61-0+squeeze1 Candidat�: 5.1.63-0+squeeze1 Table de version�: 5.1.63-0+squeeze1 0 500 http://security.debian.org/ squeeze/updates/main amd64 Packages *** 5.1.61-0+squeeze1 0 100 /var/lib/dpkg/status 5.1.49-3 0 500 http://mirror.ovh.net/debian/ squeeze/main amd64 Packages

Re,
Je ne suis pas sur que ça aide, mais tu devrais faire la mise à jour de sécurité…

J’ai fait la mise à jour de sécu, merci !

Je farfouille dans la doc de mySQL mais rien n’indique comment modifier des logs…

J’ai pensé à changer l’epression régulière dans Fail2ban mais je n’y arrive pas :confused:
Je ne suis pas encore à l’aise avec…

Ca serait posible avec cette solution ? Changer mon expresion régulière ?

Re,

La dite fail-regex fonctionne très bien, tout au moins chez nous!

Alors delà à la modifiée … :think:

C’était une alternative…
EDIT : L’expression régulière n’est pas adaptée à mes logs, donc la changer peut être une solution

Sinon je cherche mais je ne comprend toujours pas pourquoi mes logs sont sur 5 étages… :confused: :think:

Petite avancée :

Regardez bien mes logs :

[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…

Salut,

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”… :108

Bonjour,

Pour que fail2ban puisse lire les logs de MySQL, il faut patcher Fail2ban.
Une solution est expliquée ici http://www.fail2ban.org/wiki/index.php/Fail2ban:Community_Portal#Add_support_for_MySQL_general_log_timestamps
Puis créer le filtre Fail2ban approprié.

Addition (17:22): Désolé, je n’avais pas lu le début du thread et la solution déjà donnée.

Salut,

Il semblerait donc qu’il n’y est pas de solutions… dumoins pas pour l’instant…

Merci à vous tous pour votre aide !

Bonsoir,

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.

Il s’agit de simples orientations … :slightly_smiling:

Re,

Peut-être une solution intéressante Apahe 2 - mod_evasive à investiguer ?

Merci pour cette suggestions.
Je la regarderais plus tard car j’ai peut être trouvé quelque chose…

Jai trouvé ça :http://www.bouthors.fr/wiki/doku.php?id=linux:fail2ban ( Partie “Protéger phpmyadmin”)

Extrait :

[quote]Loguer les actions phpmyadmin

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

Une idée ?

Salut,

Peut être que ce lien… Apache Module mod_log_config te lancera sur une piste nouvelle. :083

Salut,
Pas besoin de modifier les logs:

A ajouter à jail.local

[apache-phpmyadmin] enabled = true port = http,https filter = apache-phpmyadmin logpath = /var/log/apache*/*error.log maxretry = 3

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 =

Regarde sur notre wiki…
isalo.org/wiki.debian-fr/in … e=Fail2ban

Salut,

Rhôoo …

[quote=“lol”]Salut,
Pas besoin de modifier les logs:

A ajouter à jail.local

[apache-phpmyadmin] enabled = true port = http,https filter = apache-phpmyadmin logpath = /var/log/apache*/*error.log maxretry = 3

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 =

Regarde sur notre wiki…
isalo.org/wiki.debian-fr/in … e=Fail2ban[/quote]
Je l’avais zappé celui là, navré! :blush:
Merci lol! :wink:

Bonjour,

Pour obtenir les logs des access denied sur 1 seule ligne afin de pouvoir gérer avec une REGEX, il y à une solution simple :

je cite : “https://dev.mysql.com/doc/refman/5.5/en/error-log.html” :

1)Dans /etc/mysql/my.cnf

# * 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:

  1. patch de fail2ban :
    Dans le fichier /usr/share/fail2ban/server/datedetector.py ajoutez ceci (ligne 144)

Attention, les espaces sont des tabulations

                        # AAMMJJ HH:MM:SS
                        template = DateStrptime()
                        template.setName("YearMonthDay Hour:Minute:Second")
                        template.setRegex("\d{2}\d{2}\d{2} \d{2}:\d{2}:\d{2}")
                        template.setPattern("%y%m%d %H:%M:%S")
                        self.__templates.append(template)

================================================================
PS: THX TO :

FOR fail2ban REGEX timestamp
(addition line 144 of /usr/share/fail2ban/server/datedetector.py)

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

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

nbanba