[MySQL] Sécurité anti brute force ?

Bonjour,

J’ai un serveur sur lequel j’ai installé et paramétré une base MySQL.

Cette base doit être accessible à distance.
J’ai donc modifié la config, et ajouté des utilisateur pour se connecter à distance.

Pour le moment j’ai mis des rêgles dans mon pare-feu pour accepter les connexion sur le port 3306 seulement depuis certaine adresses IP.
Actuellement c’est jouable, seulement quelques IP pour la phase de dévellopement de l’application cliente.
Par contre, quand elle sera en production, je ne pourrais plus utiliser cette protection. Sans parler de son éfficacité limité.

Je voudrais donc savoir si vous connaissez un moyen pour bloquer une IP après n tentative de connexion infructueuse avec MySQL.
Un peu comme Fail2Ban avec vsftpd… Mais pour MySQL.

Dans mes logs MySQL, quand j’ai une tentative de connexion infructueuse, j’ai une ligne comme celle-ci :

J’ai regardé dans la doc de Fail2Ban pour me faire une regex perso, car le format de la date n’est pas valide pour lui, et je ne sais pas trop non plus comment exploiter ‘xxx-xxx-xxx-xxx.rev.numericable.fr’ (sachant de xxx-xxx-xxx-xxx est mon adresse IP).

J’ai regardé sur Google, je trouve plein de chose pour attaquer mon serveur, mais pas grand chose pour le protéger :’( !
J’ai aussi regardé du coté du portknocking, mais ça ne correspond pas à mon utilisation. Idem pour le changement de port, qui est a mon goût une méthode douteuse pour de la production.

Donc voilà, si vous avez une astuce quelconque pour éviter les attaque brute force sur MySQL, ou alors si vous avez une petite idée de comment tourner le filtre de Fail2Ban à partir des infos que j’ai dans les logs…

Merci d’avance.

Plusieurs pistes :

  • Tu as l’option skip-name-resolve du my.cnf pour ne pas utiliser les DNS (et donc obtenir des adresses IP “brutes” dans le log).
  • Tu peux éventuellement sécuriser ta connexion soit avec du port forwarding SSH ou bien par VPN, dans ces deux cas la sécurisation de MySQL est beaucoup plus simple puisque tu utilises l’authentification et le cryptage de la connexion SSH ou VPN. Mais vu ce que tu disais à propos du port knocking qui te convient pas, c’est pas sûr que ces méthodes te conviennent mieux.

Oui, j’ai déjà un VPN en place sur ce serveur, qui lui est surveillé par Fail2Ban.
C’est une des IP autorisée pour le moment dans mon pare-feu, pour pouvoir faire mes tests depuis n’importe où quand je suis en déplacements.

Malheureusement, chez le client final il faut que l’application soit la plus simple possible a déployer.
Si je commence à leurs parler de VPN et de tunel SSH, je vois déjà leurs têtes :laughing: !

Merci en tout cas pour le skip-name-resolve, reste plus que l’histoire du format de la date :023 !

Vous avez regarder du côté de GreenSQL ?

Non, je ne connaissais pas.
Je vais regarder.

Mais de rien, c’est avec plaisir

Non, je ne connaissais pas.
Je vais regarder.[/quote]

Apparemment, c’est pour les injections SQL.
Rien à voir avec le brute force.

lit bien, réfléchit bien, admin bien :114 et tout ira bien.

C’est bon !
Je viens de trouver comment configurer Fail2Ban pour MySQL.

  1. Activer les logs de MySQL
    /etc/mysql/my.cnf

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

  1. Ajouter le support des date présentes dans les logs de MySQL
    /usr/share/fail2ban/server/datedetector.py

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

  1. Créer le filtre dans Fail2Ban
    /etc/fail2ban/filter.d/mysqld.conf

[code]# Fail2Ban configuration file

Author: Darel

[Definition]
failregex = Access denied for user ‘.*’@’’[/code]

  1. Dernière étape, l’ajouter au fichier de conf de Fail2Ban
    /etc/fail2ban/jail.conf

[mysql] enabled = true port = 3306 filter = mysqld logpath = /var/log/mysql/mysql.log maxretry = 3

Reste plus qu’à relancer les différents service et le tour est joué :smiley: !
Notification par email, plus ban de 30 minutes si quelqu’un essaye de forcer ma base MySQL.

Merci à toutes les personne qui m’ont aidé :023 !

Salut,
Merci pour le retour. Ça devrait aller dans le wiki…
Quand j’aurais le temps… :wink:

Pas de soucis.
Si seulement j’avais trouvé ça dans un Wiki, je me serais fait moins c***r :laughing: !

Re,
Tu n’a pas remarqué de baisse de performance de mysql à cause de l’activation des logs ? (ils disent que c’est “perf killer” les logs…)

Non, pas plus que ça.
En même temps c’est encore en phase de développement, donc seulement 2 ou 3 personnes sur cette base pour le moment.
Il faudrait voir avec un grand nombre de requêtes pour pouvoir comparer je pense.

Sinon il y a pas moyen de régler le “log level” de MySQL ?
J’avoue que je n’ai pas encore regardé :blush: !

Salut,

Déjà pour commencer il faut utiliser la commande suivante :

Après pour lutter contre le brutforce le plus simple est déjà de ne pas utiliser des noms courant ou simple pour les BD, les tables, et les utilisateurs.
Ne pas rendre accessible phpmyadmin et utiliser les filtres php et mysql pour fail2ban.

[quote=“lol”]Salut,
Merci pour le retour. Ça devrait aller dans le wiki…
Quand j’aurais le temps… :wink:[/quote]

Fait: isalo.org/wiki.debian-fr/in … r_de_mysql

Génial !
Merci à toi d’avoir pris le temps de mettre ça dans le Wiki :023 !