Mach das nie wieder!

mysql_user

MySQL 8.0.19: User-spezifische Kontosperrungen:

Immer wieder kommt es vor, dass Hacker versuchen, sich Zugang zu MySQL-Datenbanken zu verschaffen. Das "Brute-Force-Hacking" erfreut sich dabei einer gewissen "Beliebtheit". Aus Sicht des DBAs ist es daher wichtig, solche Vorgänge zu erkennen und darauf zu reagieren.

Selbsterkenntnis ist der erste Schritt zur Besserung

Bislang gab es mehrere Möglichkeiten, Informationen über solche Angriffe zu erhalten. Bis zur Version MySQL 5.7.2 konnte beispielsweise der Parameter "log-warnings" gesetzt werden (value = 2). Dies sorgte dafür, dass fehlerhafte Logins in das Fehlerprotokoll der Datenbank geschrieben wurden (und natürlich noch werden). Über ein geeignetes Monitoring konnte man über einen solchen Vorfall alarmiert werden. Ab der Version 5.7.2 wurde der Parameter "log-error-verbosity" (value = 3) eingeführt und übernahm genau diese Aufgabe.

Wissen ohne Handeln ist noch kein Wissen

Was tut man denn nun mit der Erkenntnis? Bislang konnte man auf einen solchen Angriff beispielsweise mit dem "Connection Control Plugin" reagieren. Die Aufgabe dieses Plugins besteht darin, ab einem gewissen Schwellwert (Anzahl fehlerhafter Logins; connection_control_failed_connections_threshold) den Verbindungsaufbau des "Angreifers" auszubremsen.

mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
mysql> show variables like '%connection_control%';
+-------------------------------------------------+------------+
| Variable_name                                   | Value      |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3          |
| connection_control_max_connection_delay         | 2147483647 |
| connection_control_min_connection_delay         | 1000       |
+-------------------------------------------------+------------+ 

Ab dem 3. fehlerhaften Login wird jeder weitere Versuch um +1 Sekunde verlangsamt (4. fehlerhafte Login wartet 1 Sek.; 5. Login 2 Sek; 3. Login 3. Sek; ...). Über diesen Mechanismus verleidet man dem Angreifer sein Vorhaben extrem.

Strafe ist Gerechtigkeit für die Ungerechten

Ab MySQL 8.0.19 kann man nun auch bestimmte Accounts zusätzlich oder alternativ individuell schützen. MySQL hat in dieser Version den User-Accounts zwei neue Attribute spendiert:

  • FAILED_LOGIN_ATTEMPTS
  • PASSWORD_LOCK_TIME

Pro User kann nun deklariert werden, dass nach einer bestimmten Anzahl von fehlerhaften Logins der Account blockiert werden soll:

mysql> create user 'blog'@'localhost' identified by 'ordix';
mysql> alter user 'blog'@'localhost' failed_login_attempts 3 password_lock_time 5
mysql> select user, user_attributes, account_locked from user where user = 'blog';
+------+----------------------------------------------------------------------------------+----------------+
| user | user_attributes                                                                  | account_locked |
+------+----------------------------------------------------------------------------------+----------------+
| blog | {"Password_locking": {"failed_login_attempts": 3, "password_lock_time_days": 3}} | N              |
+------+----------------------------------------------------------------------------------+----------------+ 
 
bash> mysql -ublog -PHACKER
ERROR 1045 (28000): Access denied for user 'block'@'localhost' (using password: YES)
...
bash> mysql -ublog -PHACKER
ERROR 3955 (HY000): Access denied for user 'blog'@'localhost'. 
Account is blocked for 5 day(s) (5 day(s) remaining) due to 3 consecutive failed logins. 

Vorsicht ist besser als Nachsicht

Sicherlich ist dies kein "großes" Sicherheits-Feature. Trotzdem kann auch diese Erweiterung der User-Accounts dazu beitragen, MySQL-Datenbanken (gerade die Systeme, die im Internet exponiert laufen) ein klein wenig robuster gegenüber Angriffen zu machen. Im Kontext eines gut durchdachten Sicherheitskonzeptes ist dies aber ein sinnvoller Baustein. Sie möchten Ihre MySQL-Betriebskonzepte sicher gestalten? Dann sprechen Sie uns an!