MySQL-Anmeldeversuche protokollieren

25

Von Zeit zu Zeit gibt es auf unserem MySQL-Produktionsserver fehlgeschlagene Anmeldeversuche (MySQL-Dashboard warnt uns). Gibt es eine Möglichkeit, jeden erfolgreichen und fehlgeschlagenen Login auf dem MySQL-Server zu protokollieren, ohne dies zu aktivieren general_log?

Wir denken, dies general_logist keine Option, da es sich um einen Produktionsserver mit hoher Auslastung handelt.

CarlosH
quelle
1
Erwägen Sie die Verwendung MariaDB Audit Plugin mariadb.com/resources/blog/... mariadb.com/kb/en/mariadb/about-the-mariadb-audit-plugin
Mersh
Laut mysql official: As of MySQL 5.5.28, MySQL Enterprise Edition includes MySQL Enterprise Audit, implemented using a server plugin named audit_log. Nur die unternehmerische Version hat es.
Tiina

Antworten:

20

nur um die neugierigen zu informieren: grabe in dein fehlerprotokoll und presto!

(1). edit my.cnf (Einstellungsdokumentation hier )

[mysqld]

: # Geben Sie einen Namen für die Fehlerprotokolldatei ein. Andernfalls wird ein Standardname verwendet.

log_error = / var / log / mysql / error

: #defaults to 1. Wenn der Wert> 1 ist, werden abgebrochene Verbindungen und Zugriffsverweigerungsfehler für neue Verbindungsversuche in das Fehlerprotokoll geschrieben

log_warnings = 2

...

(2). auf Befehl ausführen

$ sudo cat /var/log/mysql/error.err | egrep '[aA] ccess denied'

(3). und du hast es!

(4). Wenn Sie den Benutzer einschränken müssen (DOS-Angriff oder Versuch zur Wiederherstellung des MySQL-Benutzerkennworts in einer Datenbank mit mehreren Benutzern), dann ( http://dev.mysql.com/doc/refman/5.5/en/user-resources.html )

mysql> GRANT USAGE ON *. * TO 'attacker' @ 'localhost' WITH MAX_CONNECTIONS_PER_HOUR 100;

auf nur 100 Versuche zur Wiederherstellung von Passwörtern pro Stunde zu beschränken.

Centurian
quelle
2

Ich denke, das allgemeine Protokoll protokolliert unter anderem alle Anmeldeversuche (Erfolg und Misserfolg). Das Hauptproblem besteht darin, dass das allgemeine Protokoll die Leistung Ihrer Datenbank beeinträchtigt. Sie können das allgemeine Protokoll mit der Abfrage aktivieren

SET GLOBAL general_log = 'on'

für neuere Versionen von MySQL.

rmc00
quelle
Dies ist temporär oder permanent? Wenn es temporär ist, bedeutet das, dass ich /etc/mysql/my.cnfvon MySQL ändern muss ?
DarckBlezzer
Es ist vorübergehend. Dieser Ansatz kann funktionieren, oder Sie können --general-logdie Flags erweitern, wenn Sie MySQL starten.
rmc00
1

Hallo, ich denke nicht, dass es möglich ist.

Ab mysql 5.1.29 können Sie die Speicheroption (Tabelle oder Datei) und den Speicherort sowie das gewünschte Protokoll angeben - Fehler-, allgemeine, binäre oder langsame Abfrage. Soweit ich weiß, können Sie das Format des Protokolls oder das Protokollierungsformat nicht angeben. Ich könnte mich irren - aber ich denke, dass alle Anmeldeversuche im allgemeinen Protokoll und nicht im Fehlerprotokoll protokolliert werden.

Vorausgesetzt, Ihr MySQL-Server läuft auf einem anderen Rechner als Ihr Anwendungsserver, und Sie benötigen Port 3306 (oder was auch immer), der geöffnet ist, und Sie können keinen SSH-Tunnel verwenden, sollte Ihr MySQL-Server dennoch für niemanden zugänglich sein. nein. Ich empfehle dringend, es nicht dem Web-Verkehr auszusetzen, und wenn Sie es (wie im Fall, dass es sich nicht hinter Ihrer Firewall befindet) an die IP-Adresse oder den IP-Block Ihres Anwendungsservers und Ihre Administratorzugriffs-IP (wo Sie sich befinden) binden müssen Zugriff von)

Hoffentlich hilft das.

konung
quelle
1

Man kann sich mit dem mysql-audit-plugin anmelden connectund quitbefehlen.

  1. Finden Sie die richtige Version von MySQL-Audit-Plugin Release , ich habe MySQL 5.7 verwendet, also habe ich verwendet audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.zip.
  2. Verschieben Sie die heruntergeladene soDatei an den von angegebenen Ort mysqladmin variables | grep plugin_dir.
  3. mysql>install plugin audit soname 'libaudit_plugin.so'
  4. Einschalten Log - Funktion, mysql>set global audit_json_file=ONwird standardmäßig protokolliert er alle erfolgreichen Operationen. Durch das Setzen von set global audit_record_cmds='quit,connect'Protokollen werden vermutlich nur Verbindungen hergestellt und beendet, je nach Konfiguration des mysql-audit-plugins .

So sieht es in der Datei zum An- und Abmelden aus:

{"msg-type":"activity","date":"1543740612328","thread-id":"1015112","query-id":"3045222","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11575","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Quit","query":"Quit"} 

{"msg-type":"activity","date":"1543740724627","thread-id":"1015113","query-id":"0","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Connect","query":"Connect"}
{"msg-type":"activity","date":"1543740724629","thread-id":"1015113","query-id":"3045223","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"rows":"1","status":"0","cmd":"select","query":"select @@version_comment limit 1"}
Tiina
quelle
0

Wenn der betreffende Server keine externen Verbindungen haben sollte, wie konfiguriert, würde ich mir Sorgen um eine Art Angriff auf Ihren App-Server machen, es sei denn, die fehlgeschlagenen Anmeldungen stammen von neuen Anwendungen, die vor der Konfiguration von Benutzer / Pass ausgerollt wurden.

Wenn der Server auf 3306 in irgendeiner Weise externen Verbindungen ausgesetzt ist, würde ich die Konfiguration wie von Nick angegeben festlegen und auch die Verwendung von iptables in Betracht ziehen, um den Datenverkehr von nur Ihren App-Servern auf 3306 zu beschränken.

cpbills
quelle
MySQL verweigert automatisch Verbindungen von IP-Adressen, die nicht mindestens eine übereinstimmende Zeile in mysql.user haben
David M
0

Unter http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ zeigt der Autor eine Methode zum Erfassen der Pakete mit tcpdump und zum Filtern der Ausgabe basierend auf der Zeichenfolge.

Dies wirkt sich auf Ihre Bedenken hinsichtlich des general_log und der Leistung aus, obwohl tcpdump selbst möglicherweise eine geringfügige Leistungseinbuße nach sich zieht. Diese Lösung protokolliert auch weniger Daten als das allgemeine Abfrageprotokoll.

Ich habe das selbst nicht benutzt, aber es klingt sehr nützlich.

Stefan Lasiewski
quelle
Hört sich gut an, aber der Link funktioniert bei mir nicht.
CarlosH
Der Link funktioniert für mich heute Morgen mit Firefox. mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging
Stefan Lasiewski
Und ich würde gerne Ihre Erfahrungen damit hören.
Stefan Lasiewski