Kurz und gut – Episode #03 Geschichte schreiben: MySQL Password History
Ich werde in Seminaren, Workshops oder in Kundenprojekten in Sachen MySQL immer mal wieder mit Dingen konfrontiert, auf die ich ad hoc keine Antwort habe bzw. mit denen ich noch keine Erfahrung gesammelt habe.
Das Problem
In dieser Folge geht es um ein Problem eines Kunden, der regulatorische Anforderungen in Sachen Passwort-Richtlinien auch auf seinen MySQL-Systemen umsetzen möchte.
Unser Kunde hat bereits bei anderen Datenbanksystemen aufgrund von regulatorischen Anforderungen (Oracle) eine Passwort-Richtlinie umgesetzt. Unter anderem beinhaltet diese Richtlinie, dass ein Passwort nicht direkt wiederverwendet werden darf. Damit sich die „Gesichte“ des Passworts nicht zu schnell wiederholt, gibt es hier zwei Anforderungen:
- Ein Passwort darf sich frühestens nach 180 Tagen wiederholen.
- Es müssen zwischenzeitlich mindestens 10 unterschiedliche Passwörter verwendet worden sein.
Die Anforderungen müssen beide erfüllt sein, bevor ein Passwort erneut genutzt werden darf. Zusätzlich müssen Passwörter alle dreißig Tage gewechselt werden.
Die Lösung
MySQL verfügt über umfangreiche Passwort-Management-Einstellungen, die im Detail hier zu finden sind [1]. Für die Lösung dieses konkreten Problems werden Einstellungen aus den Bereichen „Expiration Policy“ [2] und „Reuse Policy“ [3] benötigt.
Die Lebensdauer eines Passwortes kann man entweder global (für alle User) oder für dedizierte Accounts regeln:
mysql> show variables like '%lifetim%'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | default_password_lifetime | 0 | +---------------------------+-------+ 1 row in set (0.00 sec) mysql> set persist default_password_lifetime=180; Query OK, 0 rows affected (0.01 sec) mysql> select user, host, password_lifetime from mysql.user where user = 'appX'; +------+------+-------------------+ | user | host | password_lifetime | +------+------+-------------------+ | appX | % | NULL | +------+------+-------------------+ 1 row in set (0.00 sec) mysql> alter user 'appX'@'%' password expire interval 180 day; Query OK, 0 rows affected (0.03 sec) mysql> select user, host, password_lifetime from mysql.user where user = 'appX'; +------+------+-------------------+ | user | host | password_lifetime | +------+------+-------------------+ | appX | % | 180 | +------+------+-------------------+ 1 row in set (0.00 sec)
Nachdem wir geklärt haben, wann ein neues Passwort „fällig“ ist, können wir nun festlegen, wann ein Passwort „recycled“ werden darf. Auch diese Einstellungen können global für den Server oder einzelne User-Konten determiniert werden.
mysql> set persist password_reuse_interval=180, password_history=10; Query OK, 0 rows affected (0.01 sec) mysql> alter user 'appX' password reuse interval 180 day password history 10; Query OK, 0 rows affected (0.02 sec)
Bei einem Verstoß gegen die Regeln wird ein User dementsprechend informiert:
mysql> set password for 'appX' = 'change_on_install'; ERROR 3638 (HY000): Cannot use these credentials for 'appX@%' because they contradict the password history policy
Natürlich gibt es noch weitere Möglichkeiten Passwörter sicherer zu gestalten:
- Komplexitätsregeln für Passwörter
- Sperrlisten einfacher Passwörter
- Ein Plugin gegen Brute-Force-Hacking „Plugin Connection Control“
Sie haben eine Frage und / oder ein Problem mit MySQL? Stellen Sie Ihre Frage gerne in den Kommentaren.
Links
[1]https://dev.mysql.com/doc/refman/8.0/en/password-management.html
[2]https://dev.mysql.com/doc/refman/8.0/en/password-management.html#password-expiration-policy
[3]https://dev.mysql.com/doc/refman/8.0/en/password-management.html#password-reuse-policy
Seminarempfehlung
MYSQL ADMINISTRATION DB-MY-01
Zum SeminarPrincipal Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare