Brute-Force-Angriffe auf MySQL verhindern?


9

Ich muss das Netzwerk für MySQLd aktivieren, aber jedes Mal wird der Server brutal in Vergessenheit geraten. Ein gemeines Skript zum Erraten von Passwörtern beginnt, auf den Server zu hämmern, eine Verbindung über Port 3306 herzustellen und für immer zufällige Passwörter zu versuchen.

Wie kann ich das verhindern?

Für SSH verwende ich Denyhosts, was gut funktioniert. Gibt es eine Möglichkeit, Denyhosts mit MySQLd zum Laufen zu bringen?

Ich habe auch darüber nachgedacht, den Port zu ändern, auf dem MySQL ausgeführt wird, aber dies ist nicht ideal und nur eine Stop-Gap-Lösung (was ist, wenn sie den neuen Port entdecken?)

Hat jemand andere Ideen?

Wenn es anders ist, führe ich MySQL 5.x unter FreeBSD 6.x aus.

Antworten:


9

Ich kenne keine Denyhosts-ähnlichen Softwarepakete für MySQL, aber ich habe einige Lösungen:

  • Beschränken Sie die Anmeldung auf bestimmte IP-Adressen. Verwenden Sie nicht%, damit alle Hosts eine Verbindung zum Server herstellen können.
  • Richten Sie iptables noch sicherer ein, um den Zugriff auf 3306 nur von autorisierten IP-Adressen aus zu ermöglichen.
  • Tunneln Sie Ihren Datenverkehr mit ssh zur Box und stellen Sie dann eine Verbindung über localhost her
  • Ändern Sie die Denyhosts- oder BFD-Skripte, um MySQL-Zugriffsprotokolle zu analysieren und Brute-Force-Versuche an der Firewall zu blockieren

Bearbeiten :

Versuchen Sie Folgendes, um Ihren Kommentar zu beantworten :

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

Wobei .20 Ihre MySQL und .50 die IP-Adresse für die Remoteverbindung ist.


Einige Hinweise: Wie kann ich den Zugriff auf Port 3306 nur auf einen bestimmten Satz von IP-Adressen beschränken? Nur die MySQL-Benutzer einzuschränken, funktioniert nicht, da Remotecomputer weiterhin eine Verbindung herstellen und Kennwörter brutal erzwingen können. Die Einrichtung von SSH-Tunneln scheint für den Endbenutzer etwas unpraktisch zu sein ... Haben Sie ein IPTables-Beispiel dafür?
Keith Palmer Jr.

1

Mit MySQL Proxy können Sie ein kleines LUA-Skript schreiben, das eine Benutzer- / Pass-Kombination benötigt, aber X Sekunden wartet, um die Anmeldung zu verarbeiten, wenn die Verbindungsanforderung aus einem nicht genehmigten IP-Bereich stammt.

Sie können dem LUA-Skript außerdem nach drei fehlgeschlagenen Versuchen eine zusätzliche Logik hinzufügen, um IP-Bereiche auf die schwarze Liste zu setzen.

Alles in allem ist es technisch machbar, aber ich gehe mit den anderen Empfehlungen zum Tunneln über SSH oder ein VPN zu einem gemeinsamen IP-Bereich auf der Whitelist (über FW oder andere Mittel) über.


+1 noch eine Verwendung für MySQL Proxy :)
Andy

1

1: Ändern Sie den Port von 3306. Nicht aus Gründen der besseren Sicherheit, sondern um die Last des Servers für falsche Anmeldeangriffe zu übernehmen

2: Erstellen Sie ein SSL-Zertifikat und aktivieren Sie es auf Ihrem MySQL-Server (es ist ohnehin ein Muss, Ihre Client-Server-Verbindung zu verschlüsseln).

3: Erstellen Sie ein oder mehrere Client-Zertifikate (alle Clients müssen über das Zertifikat verfügen und die Client-Software muss für die Verwendung konfiguriert sein). Wenn Ihre Clients .Net sind , müssen Sie das Clientzertifikat in das Format pkcs12 konvertieren. Dies ist jedoch problemlos möglich. Weitere Informationen finden Sie in diesem Handbuch.

4: Stellen Sie die MySQL-Benutzerkonten so ein, dass ein x509-Clientzertifikat erforderlich ist. Dann benötigt ein Angreifer sowohl die Anmeldeinformationen als auch das Clientzertifikat (Sie können sogar ein Kennwort für das Clientzertifikat eingeben, dann muss der Angreifer dies auch benötigen).

Ich habe dieses Handbuch verwendet, um die Zertifikate und Schlüsseldateien zu erstellen, aber es gibt viele Anleitungen.

Ich bevorzuge es, meine SSH-Verbindung nur für Verwaltungszwecke auf meine Linux-Box zu verwenden, nicht für den Clientzugriff.


0

Warum nicht nur von sicheren Hosts aus auf den mysqld-Port zugreifen?


Ich habe darüber nachgedacht, aber das bedeutet, dass ich IP-Adressänderungen für mehr als 1.000 Clients überwachen muss. Das wäre ein gigantischer Schmerz im Hintern ... Wie kann ich das überhaupt tun? Es hilft nicht, sie in MySQL zu sperren, da sie immer noch eine Verbindung zum MySQL-Server herstellen können, nur keine Datenbanken auswählen ...
Keith Palmer Jr.

1
Das Zitieren von Dave Drager oben: "Ändern Sie die Denyhosts- oder BFD-Skripte, um MySQL-Zugriffsprotokolle zu analysieren und alle Brute-Force-Versuche an der Firewall zu blockieren" scheint die beste Idee zu sein oder verwenden Sie einige hierogliphische Passwörter :)
Quaie

0

Dies ist zwar keine "echte" Antwort, aber ich weiß nicht, warum Sie sie direkt der Außenwelt aussetzen müssen.

Können Sie ssh nicht auf dieser Box aktivieren und Tunneling verwenden, um auf die DB-Engine zuzugreifen?

Oder eine andere VPN-Lösung, um darauf zuzugreifen (openvpn fällt mir ein).


0

Keine echte Lösung für das Problem, aber es könnte hilfreich sein, wenn Sie den Server nur an einem anderen Port ausführen. Die meisten dieser Scan-Bots sind wahrscheinlich so programmiert, dass sie nur 3306 überprüfen. Das Problem wird dadurch nicht behoben, aber Sie erhalten wahrscheinlich viel weniger Scans, wenn Sie nur den Port ändern.


-1 für Sicherheit durch Dunkelheit
thepocketwade

@thepocketwade - Deshalb habe ich gesagt, es ist keine echte Lösung für das Problem. Aber es könnte trotzdem hilfreich sein.
Eric Petroelje

0

Ich glaube, Verbindungen sollten durch eine Firewall geschützt werden: schnell und nett. Es gibt viele Tutorials für iptables und was auch immer :)

Sie können auch einen Cronjob auf den Hosts der Clients installieren, der etw auf einem Server ausführt, um zu verhindern, dass die Firewall bekannte Hosts blockiert.


0

Die Verwendung von ssh für Tunnel wäre das Beste, aber Sie könnten versuchen, fail2ban anstelle von Denyhosts zu verwenden, da es meiner Meinung nach darauf abzielt, mehr verschiedene Anwendungen zu überwachen, sodass es kein Problem sein sollte, das MySQL-Protokoll hinzuzufügen.


0

Vorschlag, den Sie für Ihren Abschnitt my.cnf-ini [mysqld] berücksichtigen sollten

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

um die Hunderte von Versuchen in 90 Sekunden zu vermeiden. Hacken Sie sie bei 10 Versuchen ab.

Betrachten Sie einmal am Tag FLUSH HOSTS, um die legitimen Personen zu löschen, die versuchen, Ihr System zu verwenden, die sich einfach NICHT an ihr Passwort erinnern können. Vielleicht werden sie in ein paar Tagen damit fertig.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.