Treten fehlerhafte Verbindungen zu MySQL auf, kann das verschiedene Gründe und Auswirkungen auf die Anwendungen haben. Im folgenden Artikel wird aufgezeigt, wie man die Informationen zu fehlerhaften Verbindungen auswertet und entsprechende Gegenmassnahmen einleitet.

Fehlerhafte Verbindungen zu MySQL kann man am einfachsten feststellen, wenn man ein Monitoring Tool wie z.B. Zabbix einsetzt. MySQL liefert dazu die beiden Status-Variablen Aborted_clients und Aborted_connects. Die Variable Aborted_clients wird erhöht, wenn der Client erfolgreich eine Verbindung zum Server aufbauen konnte, die Verbindung dann aber unterbrochen ist.

Ursachen dafür können sein:

  • ein Client hat nicht mysql_close() vor Beendigung ausgeführt.
  • ein Client hat für eine Anfrage mehr als wait_timeout oder interactive_timeout Sekunden benötigt.
  • das Client Programm wurde plötzlich während einer Transaktion beendet.

Die Variable Aborted_connections wird erhöht, wenn der Client eine Verbindung nicht erfolgreich herstellen konnte. Dafür kommen folgende Ursachen in Frage:

  • Ein Client besitzt nicht die Berechtigung, um eine Datenbankverbindung aufzubauen.
  • Ein Client benutz ein fehlerhaftes Kennwort.
  • Ein Verbindungspaket beinhaltet nicht die erwarteten Informationen.
  • Es dauert länger als connect_timeout Sekunden, um ein Verbindungspaket zu erhalten.

Beispiel aus der Praxis

Soweit die Theorie. Was bedeutet das aber konkret, wenn die Anzahl der Aborted_connections überhöht ansteigen wie auf dem folgendem Diagramm zu sehen ist?

MySQL Verbindungen aufgezeichnet für Fehlererkennung

  • Versuch eines Verbindungsaufbaus ohne Berechtigung

Das kann bedeuten, dass dies durch falsche Konfiguration eines benötigten Clients ausgelöst wird, oder es wird von einem unberechtigten Client ausgelöst. Ein unberechtigter Client kann versuchen über einen offenen Port zum Datenbankserver eine Verbindung herzustellen - oder anders ausgedrückt, es könnte auch ein sogenannter “Hacker” am Werk sein.

Folgende Möglichkeiten für den Zugriff auf MySQL stehen zur Verfügung:

  • offen für alle Zugriffe über bind-address in der MySQL Konfiguration festlegen, indem eine IP Adresse vergeben wird, über die der Server von extern erreichbar ist. Oder 0.0.0.0, wenn keine Einschränkung auf ein bestimmtes Interface verwendet werden soll. Wird ein externer Zugriff auf die MySQL Datenbank zugelassen, empfehle ich den Einsatz einer Firewall, die den Zugriffskreis einschränkt (z.B. nur von bestimmten IP Adressen). Dies kann z.B. durch IPTables erfolgen. Info: bei IPTables handelt es sich um ein Userspace-Programm zur Konfiguration der Tabellen (tables), die durch die Firewall im Linux-Kernel bereitgestellt werden. Nur aus Debugging Gründen (z.B. mit MySQL Workbench) sollte aus Sicherheitsgründen kein externer Zugriff aktiviert werden, sondern anstelle dessen ein SSH Tunnel verwendet werden.
  • wird kein externer Zugriff auf die Datenbank benötigt, sollte über bind-address die IP Adresse 127.0.0.1 gesetzt werden. Dadurch werden nur Zugriff lokale Zugriff erlaubt. Alternativ kann auch skip-networking gesetzt werden, wenn keine TCP/IP Verbindung benötigt wird und der Zugriff nur über einen Socket erfolgt.

Vorsicht bei nicht gesetzter bind-address

Wird in der my.cnf bind-address nicht gesetzt, wird auf die Default-Einstellung zurück gegriffen. Bei den MySQL Paketen, Debian oder Dotdeb Paketen ist dies 0.0.0.0 - also jeder hat Zugriff über das Netzwerk. bind-address wird zwar in der my.cnf mittlerweile standardmässig auf 127.0.0.1 gesetzt, dies ist allerdings nur auf 127.0.0.1 begrenzt, wenn der Eintrag in der Eintrag in my.cnf gesetzt ist.

Analyse zu den fehlgeschlagenen Zugriffen auf MySQL

Um fehlgeschlagene Zugriffe auf MySQL zu analysieren, kann man folgende Maßnahmen ergreifen:

  • log-warnings in my.cnf aktivieren, damit die fehlgeschlagenen Zugriffe im Error Log geschrieben werden
  • Mit Hilfe von tcpdump den Netzwerkverkehr auf Port 3306 verfolgen (falls der Port zu MySQL nicht den Standard-Port entspricht, muss der angepasste Port natürlich verwendet werden).

Zusammenfassung

Das Monitoring der MySQL Verbindung macht also nicht nur für die High-Performance Optimierung Sinn. Die gesammelten Informationen sind auch für die sicherheitsrelevanten Überprüfungen von Vorteil. Idealerweise werden bei der Einrichtung des Monitoring Systems automatische Auslöser eingerichtet, welche bei Performance oder sicherheitsrelevanten veränderten Werten Alarm geben.

Ressourcen

Aktualisiert: