Empêcher les attaques par force brute sur MySQL?

9

J'ai besoin d'activer la mise en réseau pour MySQLd, mais à chaque fois que je le fais, le serveur est forcé dans l'oubli. Certains scripts de devinette de mot de passe commencent à marteler le serveur, à ouvrir une connexion sur le port 3306 et à essayer des mots de passe aléatoires pour toujours.

Comment puis-je empêcher cela de se produire?

Pour SSH, j'utilise denyhosts, ce qui fonctionne bien. Existe-t-il un moyen de faire fonctionner denyhosts avec MySQLd?

J'ai également envisagé de changer le port sur lequel MySQL fonctionne, mais ce n'est pas idéal et seulement une solution provisoire (et s'ils découvrent le nouveau port?)

Quelqu'un a-t-il d'autres idées?

Si cela change, j'exécute MySQL 5.x sur FreeBSD 6.x.

Keith Palmer Jr.
la source

Réponses:

9

Je ne connais aucun progiciel de type denyhosts pour MySQL, mais j'ai quelques solutions:

  • Limitez la connexion à des adresses IP spécifiques. N'utilisez pas% pour permettre à tous les hôtes de se connecter au serveur.
  • Encore plus sûr, configurez iptables pour n'autoriser l'accès au 3306 qu'à partir des adresses IP autorisées.
  • Tunnelisez votre trafic vers la box avec ssh puis connectez-vous via localhost
  • Modifiez les scripts Denyhosts ou BFD pour analyser les journaux d'accès mysql et bloquer toute tentative de force brute sur le pare-feu

Modifier :

Pour répondre à votre commentaire, essayez ceci :

iptables -A INPUT -p tcp -s 202.54.1.50 --sport 1024:65535 -d 202.54.1.20 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 202.54.1.20 --sport 3306 -d 202.54.1.50 --dport 1024

Où .20 est votre MySQL et .50 est l'adresse IP de connexion à distance.

Dave Drager
la source
Quelques notes: Comment puis-je restreindre l'accès au port 3306 à un seul ensemble d'adresses IP donné? Restreindre les utilisateurs MySQL ne fonctionne pas, car les machines distantes peuvent alors se connecter et utiliser la force brute pour les mots de passe. Les tunnels SSH semblent quelque peu inconvenants à configurer pour l'utilisateur final ... Avez-vous un exemple IPTables de le faire?
Keith Palmer Jr.,
2

1: Changer le port de 3306. Pas pour une meilleure sécurité, mais pour prendre la charge du serveur pour faire face aux fausses attaques de connexion

2: Créez un certificat SSL et activez-le sur votre serveur MySQL (c'est un must-have pour crypter votre connexion client-serveur de toute façon)

3: Créez un ou plusieurs certificats clients (tous les clients doivent avoir le certificat et le logiciel client doit être configuré pour l'utiliser). Si vos clients sont .Net, vous devez convertir le certificat client au format pkcs12, mais cela se fait facilement, consultez ce guide.

4: Définissez les comptes d'utilisateur MySQL pour exiger le certificat client x509, puis un attaquant a besoin des informations d'identification de connexion ET du certificat client (vous pouvez même mettre un mot de passe sur le certificat client, puis l'attaquant doit également l'exiger aussi).

J'ai utilisé ce guide pour créer les certificats et les fichiers de clés, mais il existe de nombreux guides.

Je préfère uniquement utiliser ma connexion SSH pour accéder à ma boîte Linux à des fins d'administration, pas pour l'accès client.

MrCalvin
la source
Merci d'avoir répondu. J'ai utilisé ce guide pour faire # 2, 3 et 4: digitalocean.com/community/tutorials/…
ofri cofri
1

En utilisant MySQL Proxy, vous pouvez écrire un petit script LUA qui prend une combinaison utilisateur / passe mais attend X secondes pour traiter la connexion si la demande de connexion provient d'une plage IP non approuvée.

Vous pouvez en outre ajouter un peu de logique supplémentaire au script LUA pour mettre sur liste noire les plages IP après trois tentatives infructueuses.

Dans l'ensemble, c'est techniquement faisable, mais je vais avec les autres recommandations pour tunneler via SSH ou un VPN vers une plage IP commune, sur liste blanche (via FW ou d'autres moyens).

oscar
la source
+1 encore une autre utilisation de MySQL Proxy :)
Andy
0

pourquoi ne pas autoriser l'accès au port mysqld à partir uniquement d'hôtes sécurisés?

quaie
la source
J'ai considéré cela, mais cela signifie que je devrais surveiller les changements d'adresse IP pour plus de 1000 clients. Ce serait une gigantesque douleur dans le cul ... Comment puis-je faire de toute façon? Cela n'aide pas de les verrouiller dans MySQL, car ils peuvent toujours se connecter au serveur MySQL, tout simplement ne pas choisir de bases de données ...
Keith Palmer Jr.
1
citant dave drager ci-dessus: "Modifiez les scripts Denyhosts ou BFD pour analyser les journaux d'accès mysql et bloquer toute tentative de force brute sur le pare-feu" semble la meilleure idée ou utilisez des mots de passe hiérarchiques :)
quaie
0

Bien que ce ne soit pas une "vraie" réponse - je ne sais pas pourquoi vous devez l'exposer directement au monde extérieur.

Vous ne pouvez pas activer ssh sur cette boîte et utiliser la tunnellisation pour accéder au moteur db?

Ou toute autre solution VPN pour y accéder (openvpn vient à l'esprit).

Ensoleillé
la source
0

Pas une vraie solution au problème, mais cela pourrait aider si vous exécutez simplement le serveur sur un port différent. La plupart de ces robots d'analyse sont probablement programmés pour vérifier 3306. Cela ne résoudra pas le problème, mais vous obtiendrez probablement beaucoup moins d'analyses en changeant simplement le port.

Eric Petroelje
la source
-1 pour la sécurité par obscurité
thepocketwade
@thepocketwade - C'est pourquoi j'ai dit que ce n'était pas une vraie solution au problème. Mais cela pourrait quand même être utile.
Eric Petroelje
0

Je pense que les connexions doivent être pare-feu: rapides et agréables. Il y a beaucoup de tutoriels pour iptables et autres :)

Vous pouvez également installer un cronjob sur les hôtes des clients qui s'exécutera smth sur un serveur pour empêcher le pare-feu de bloquer les hôtes connus.

kolypto
la source
0

utiliser ssh pour les tunnels serait le meilleur mais vous pouvez essayer d'utiliser fail2ban au lieu de denyhosts car je pense que cela vise à surveiller plus d'applications différentes, donc cela ne devrait pas être un problème d'y ajouter le journal mysql.

Jure1873
la source
0

Suggestion à considérer pour votre section my.cnf-ini [mysqld]

max_connect_errors=10  # to limit hacker/cracker attempts to guess a password.

pour éviter les centaines de tentatives en 90 secondes. Coupez-les au bout de 10 tentatives.

Pensez une fois par jour à ROSER LES HÔTES pour effacer les personnes légitimes qui essaient d'utiliser votre système et qui NE PEUVENT PAS se souvenir de leur mot de passe. Peut-être que dans quelques jours, ils s'en sortiront.

Wilson Hauck
la source