Benutzerverwaltung und Passwort-Policies in MySQL sauber umsetzen
AI generated
InnoDB
SQL
MySQL / Sicherheit
Benutzerverwaltung und Passwort-Policies in MySQL
sauber umgesetzt statt historisch gewachsen

In vielen gewachsenen Magento-Datenbanken verbindet sich die gesamte Anwendung, jeder Cron-Job und jedes Reporting-Tool über denselben, oft Jahre alten Datenbanknutzer mit vollen Rechten. Dieser Artikel zeigt, wie man mit der validate_password-Komponente belastbare Passwort-Policies durchsetzt, Passwort-Ablauf und -Historie sauber konfiguriert und das Prinzip der geringsten Rechte mit klar getrennten Nutzern für Read-Only-Reporting, Migrationen und den eigentlichen Anwendungsbetrieb umsetzt.

15 Min. Lesezeit Benutzerverwaltung Passwort-Policies

1. Warum granulare Benutzerverwaltung in Magento-Datenbankumgebungen wichtig ist

Ein einzelner Datenbanknutzer mit vollen Rechten, den Anwendung, Cron-Jobs, Reporting-Tools und gelegentliche manuelle Eingriffe gemeinsam nutzen, ist bequem einzurichten, aber im Betrieb ein erhebliches Risiko: Wird das Passwort dieses einen Kontos kompromittiert, etwa über eine ungenügend abgesicherte env.php in einem alten Backup, hat der Angreifer sofort vollen Zugriff auf Lese-, Schreib- und Schema-Operationen gleichzeitig.

Granulare Benutzerverwaltung begrenzt den Schaden im Fall einer Kompromittierung auf den Umfang, den das jeweilige Konto tatsächlich benötigt, und macht darüber hinaus jede Aktion einem konkreten Zweck zuordenbar, was sowohl die Fehlersuche als auch spätere Audit-Auswertungen erheblich erleichtert. In Kombination mit Audit-Logging, wie es in einem separaten Artikel dieser Reihe behandelt wird, entsteht so ein Nachvollziehbarkeits-Fundament, das ein einzelnes Sammelkonto grundsätzlich nicht bieten kann.

2. Die validate_password-Komponente installieren und konfigurieren

Seit MySQL 8.0 wird Passwortstärke nicht mehr über das ältere Plugin-System, sondern über eine Komponente namens validate_password durchgesetzt, die als serverseitiges Komponentenframework tiefer in den Server integriert ist als klassische Plugins. Nach der Installation stehen drei vordefinierte Policy-Stufen zur Verfügung: LOW prüft nur die Mindestlänge, MEDIUM verlangt zusätzlich eine Mischung aus Groß- und Kleinbuchstaben, Ziffern und Sonderzeichen, und STRONG vergleicht zusätzlich gegen eine konfigurierbare Wörterbuchdatei häufig verwendeter, unsicherer Passwörter.

Für produktive Magento-Umgebungen ist die Stufe STRONG in Kombination mit einer unternehmensspezifischen Wörterbuchdatei empfehlenswert, wobei die Einzelparameter wie Mindestlänge und Anzahl geforderter Sonderzeichen über eigene Systemvariablen zusätzlich verschärft werden können, unabhängig von der gewählten Policy-Stufe.


-- Komponente installieren (kein Neustart erforderlich)
INSTALL COMPONENT 'file://component_validate_password';

-- Strenge Policy-Stufe aktivieren und Mindestlänge erhöhen
SET GLOBAL validate_password.policy = 'STRONG';
SET GLOBAL validate_password.length = 14;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

-- Verhindert, dass das Passwort den Nutzernamen enthaelt
SET GLOBAL validate_password.check_user_name = ON;

3. Passwort-Ablauf und -Historie: erzwungene Rotation ohne Wiederverwendung

Über die globale Variable default_password_lifetime lässt sich eine serverweite Standard-Gültigkeitsdauer für Passwörter festlegen, die sich pro Nutzer mit ALTER USER ... PASSWORD EXPIRE INTERVAL n DAY gezielt überschreiben lässt, etwa um für hochprivilegierte Konten eine kürzere Frist als für den regulären Anwendungsnutzer zu erzwingen. Läuft ein Passwort ab, verweigert MySQL nach der nächsten Anmeldung sämtliche Anweisungen außer dem Setzen eines neuen Passworts, bis dieses erneuert wurde.

Damit ein abgelaufenes Passwort nicht einfach durch dasselbe alte Passwort ersetzt wird, sorgen password_history und password_reuse_interval dafür, dass eine bestimmte Anzahl vorheriger Passwörter beziehungsweise ein bestimmter Zeitraum lang keine Wiederverwendung möglich ist. Für Konten mit direktem menschlichem Zugriff, etwa DBA-Accounts, ist eine Kombination aus beiden Mechanismen sinnvoll, während rein technische Anwendungskonten meist über andere Mechanismen wie ein Secrets-Management-System rotiert werden.


-- Passwort läuft nach 90 Tagen ab, bei DBA-Konto strenger
ALTER USER 'dba_maria'@'localhost' PASSWORD EXPIRE INTERVAL 60 DAY;

-- Keine Wiederverwendung der letzten 5 Passwoerter innerhalb von 365 Tagen
ALTER USER 'dba_maria'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;

4. Das Prinzip der geringsten Rechte: Rollen statt Einzelrechten

Seit MySQL 8.0 lassen sich Rechte über CREATE ROLE zu benannten Rollen bündeln, die anschließend einzelnen Nutzern zugewiesen werden, statt bei jedem neuen Konto die vollständige Liste einzelner Rechte erneut zu vergeben. Dieser Ansatz reduziert nicht nur den administrativen Aufwand, sondern macht auch nachträgliche Rechteänderungen zentral steuerbar: Eine Anpassung an einer Rolle wirkt sich automatisch auf alle zugewiesenen Nutzer aus, ohne dass jeder Account einzeln angefasst werden muss.

Für ein typisches Magento-Datenbank-Setup bewährt sich eine Aufteilung in mindestens drei Rollen mit klar unterschiedlichem Rechteumfang, die im Folgenden im Detail behandelt werden: eine reine Lese-Rolle für Reporting, eine Rolle mit erweiterten Schema-Rechten für Migrationen, und eine auf Datenmanipulation beschränkte Rolle für den laufenden Anwendungsbetrieb.


-- Rollen anlegen
CREATE ROLE 'role_reporting', 'role_migration', 'role_app_runtime';

-- Rechte den Rollen zuweisen (Beispiel Reporting)
GRANT SELECT ON magento.* TO 'role_reporting';

-- Rolle einem konkreten Nutzer zuweisen und als Standardrolle setzen
GRANT 'role_reporting' TO 'bi_readonly'@'10.0.4.%';
SET DEFAULT ROLE 'role_reporting' TO 'bi_readonly'@'10.0.4.%';

5. Getrennte User: Read-Only-Reporting-Nutzer ohne Schreibrechte

Business-Intelligence-Werkzeuge, individuelle Reporting-Skripte und Analyse-Dashboards benötigen für ihre Arbeit ausschließlich lesenden Zugriff, oft sogar nur auf einen Teil der Tabellen, etwa Bestellungen und Produktkataloge, nicht jedoch auf sensible Kernbereiche wie Admin-Zugangsdaten. Ein dedizierter Reporting-Nutzer mit ausschließlich SELECT-Rechten stellt sicher, dass ein fehlerhaftes oder kompromittiertes Reporting-Skript niemals versehentlich Produktionsdaten verändert.

Wo verfügbar, sollte dieser Nutzer zusätzlich ausschließlich gegen eine Read-Replica statt gegen die primäre Datenbank verbinden, sodass selbst rechenintensive, schlecht optimierte Reporting-Abfragen keine Auswirkung auf die Performance der eigentlichen Shop-Transaktionen haben können.

6. Migrations-User mit erweiterten DDL-Rechten, zeitlich begrenzt

Schema-Migrationen, wie sie bei jedem Magento-Setup-Upgrade über setup:upgrade ausgeführt werden, benötigen deutlich weitreichendere Rechte als der laufende Anwendungsbetrieb, insbesondere CREATE, ALTER, DROP und INDEX. Diese Rechte sollten niemals dauerhaft dem regulären Anwendungsnutzer zugewiesen werden, sondern einem eigenen, ausschließlich für Deployments genutzten Konto vorbehalten bleiben, das in der Regel nur von der CI/CD-Pipeline verwendet wird.

In besonders sicherheitssensiblen Umgebungen lässt sich dieses Konto sogar zeitlich begrenzt aktivieren, indem es außerhalb eines aktiven Deployment-Fensters über ALTER USER ... ACCOUNT LOCK gesperrt und unmittelbar vor einem geplanten Deployment automatisiert wieder entsperrt wird, wodurch das Zeitfenster für einen möglichen Missbrauch dieses hochprivilegierten Kontos minimiert wird.


-- Migrationsnutzer außerhalb von Deployments sperren
ALTER USER 'ci_migration'@'10.0.3.%' ACCOUNT LOCK;

-- Kurz vor einem geplanten Deployment automatisiert entsperren
ALTER USER 'ci_migration'@'10.0.3.%' ACCOUNT UNLOCK;

7. Der App-Betriebs-User: minimale Rechte für den laufenden Magento-Betrieb

Der Nutzer, mit dem sich Magento im Normalbetrieb über app/etc/env.php verbindet, benötigt für den überwiegenden Teil seiner Arbeit lediglich SELECT, INSERT, UPDATE und DELETE, jedoch keinerlei Schema-Rechte wie CREATE, ALTER, DROP oder GRANT. Diese bewusste Einschränkung hat einen konkreten Sicherheitsnutzen: Selbst eine SQL-Injection-Schwachstelle in einer Drittanbieter-Extension kann bei einem derart eingeschränkten Konto keine Tabellen löschen oder neue Admin-Konten über eine manipulierte Schema-Änderung anlegen.

In der Praxis zeigt sich, dass viele historisch gewachsene Magento-Installationen dem Anwendungsnutzer aus Bequemlichkeit weitreichende Rechte einräumen, weil einzelne Erweiterungen gelegentlich DDL-Operationen ausführen. Diese Fälle sollten identifiziert und wenn möglich auf den Migrations-User verlagert werden, statt dem dauerhaften Betriebskonto pauschal alle Rechte zu belassen.

8. Bestehende Rechte auditieren: SHOW GRANTS und information_schema

Bevor eine bestehende, historisch gewachsene Rechtestruktur bereinigt werden kann, muss zunächst der Ist-Zustand vollständig erfasst werden. Der Befehl SHOW GRANTS FOR liefert für ein einzelnes Konto eine lesbare Übersicht, während für eine systematische, serverweite Auswertung eine Abfrage gegen information_schema.USER_PRIVILEGES und information_schema.SCHEMA_PRIVILEGES deutlich effizienter ist, da sich diese Sicht direkt filtern und mit anderen Metadaten verknüpfen lässt.

Ein sinnvoller erster Schritt ist eine Bestandsaufnahme aller Konten mit dem Recht GRANT OPTION oder mit administrativen Rechten wie SUPER, da diese Konten das grösste Schadenspotenzial im Kompromittierungsfall besitzen und deshalb zuerst auf tatsächliche Notwendigkeit geprüft werden sollten.


-- Rechte eines einzelnen Kontos anzeigen
SHOW GRANTS FOR 'magento_app'@'10.0.2.%';

-- Konten mit weitreichenden administrativen Rechten identifizieren
SELECT GRANTEE, PRIVILEGE_TYPE
FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN ('SUPER', 'GRANT OPTION', 'DROP', 'SHUTDOWN')
ORDER BY GRANTEE;

9. Das Standard-Authentifizierungsplugin caching_sha2_password und Fazit

Seit MySQL 8.0 ist caching_sha2_password das Standard-Authentifizierungsplugin und löst das ältere, kryptografisch schwächere mysql_native_password ab, das mittlerweile als veraltet gilt und in aktuellen MySQL-Versionen standardmäßig deaktiviert ist. Ältere PHP-PDO-Treiber oder Legacy-Anwendungen können unter Umständen Probleme mit dem neuen Plugin haben, weshalb ein gezielter Kompatibilitätstest vor einer produktiven Umstellung sinnvoll ist, statt das ältere Plugin pauschal aus Bequemlichkeit weiter zu verwenden.

Zusammengenommen ergeben validate_password, konsequente Passwort-Rotation und eine klare Rollentrennung nach dem Prinzip der geringsten Rechte eine Benutzerverwaltung, die nicht nur Compliance-Anforderungen erfüllt, sondern im Ernstfall den Schaden einer Kompromittierung tatsächlich begrenzt, statt ihn über ein einziges Sammelkonto unnötig zu vergrößern.

Nutzerrolle Typische Rechte Einsatz Passwort-Policy
role_app_runtime SELECT, INSERT, UPDATE, DELETE Regulärer Magento-Anwendungsbetrieb Rotation über Secrets-Management, kein manueller Login
role_reporting Nur SELECT, oft auf Read-Replica BI-Tools, Dashboards, Analyse-Skripte Rotation nach interner Richtlinie, STRONG-Policy
role_migration CREATE, ALTER, DROP, INDEX Deployments über CI/CD, zeitlich begrenzt aktiv Kurze Ablauffrist, ACCOUNT LOCK außerhalb von Deployments
role_dba SUPER, GRANT OPTION Administrative Wartung, manueller Zugriff Kürzeste Ablauffrist, Passwort-Historie erzwungen

Mironsoft

Datenbank-Performance, Index-Tuning und Magento-DB-Optimierung

Magento-Shop, der an langsamen Datenbankabfragen leidet?

Wir analysieren MySQL-Datenbanken auf Performance-Bremsen, optimieren Indizes und Abfragen gezielt und richten Backup- und Replikationsstrategien ein, die im Ernstfall wirklich funktionieren.

Performance-Audit

Slow Query Log und Explain-Pläne systematisch auf Engpässe untersuchen.

Index-Optimierung

Indizes gezielt für die tatsächliche Abfragelast des Shops aufbauen.

Backup-Strategie

Zuverlässige Backup- und Restore-Prozesse für produktive Magento-Datenbanken einrichten.

10. Zusammenfassung

Benutzerverwaltung und Passwort-Policies: das Wichtigste auf einen Blick

Passwortstärke

Die validate_password-Komponente erzwingt Mindestlänge, Zeichenvielfalt und optional eine Wörterbuchprüfung.

Ablauf und Historie

default_password_lifetime, password_history und password_reuse_interval verhindern dauerhaft unveränderte Passwörter.

Geringste Rechte

Getrennte Rollen für App-Betrieb, Reporting und Migration begrenzen den Schaden einer Kompromittierung.

Auditierbarkeit

SHOW GRANTS und information_schema.USER_PRIVILEGES machen bestehende Rechtestrukturen systematisch überprüfbar.

11. FAQ: Benutzerverwaltung und Passwort-Policies: das Wichtigste auf einen Blick

1Was macht die validate_password-Komponente genau?
Sie erzwingt eine konfigurierbare Passwort-Policy mit Mindestlänge, Anforderungen an Groß-/Kleinschreibung, Ziffern und Sonderzeichen sowie optional einer Prüfung gegen eine Wörterbuchdatei häufig verwendeter, unsicherer Passwörter.
2Welche Policy-Stufe wird für produktive Magento-Umgebungen empfohlen?
STRONG in Kombination mit einer unternehmensspezifischen Wörterbuchdatei, wobei einzelne Parameter wie Mindestlänge über eigene Systemvariablen zusätzlich verschärft werden können.
3Wie erzwingt man einen regelmäßigen Passwortwechsel?
Über die globale Variable default_password_lifetime oder pro Nutzer über ALTER USER ... PASSWORD EXPIRE INTERVAL n DAY. Nach Ablauf verweigert MySQL alle Anweisungen außer dem Setzen eines neuen Passworts.
4Wie verhindert man, dass ein abgelaufenes Passwort einfach wiederverwendet wird?
Mit password_history und password_reuse_interval lässt sich festlegen, dass eine bestimmte Anzahl vorheriger Passwörter oder ein bestimmter Zeitraum lang keine Wiederverwendung möglich ist.
5Was bringt CREATE ROLE gegenüber einzelnen GRANT-Anweisungen?
Rollen bündeln Rechte zentral, sodass eine spätere Anpassung automatisch alle zugewiesenen Nutzer betrifft, statt jedes Konto einzeln anpassen zu müssen. Das reduziert administrativen Aufwand und Fehlerquellen.
6Welche Rechte braucht der reguläre Magento-Anwendungsnutzer?
In der Regel nur SELECT, INSERT, UPDATE und DELETE, keine Schema-Rechte wie CREATE, ALTER, DROP oder GRANT. Diese Einschränkung begrenzt den Schaden bei einer SQL-Injection-Schwachstelle in einer Extension erheblich.
7Warum sollte der Migrations-User zeitlich begrenzt aktiv sein?
Weil er weitreichende DDL-Rechte besitzt, die außerhalb eines Deployments nicht benötigt werden. Ein Sperren über ACCOUNT LOCK außerhalb der Deployment-Fenster minimiert das Zeitfenster für einen möglichen Missbrauch.
8Wie findet man bestehende, zu weitreichende Rechte in einer gewachsenen Datenbank?
SHOW GRANTS FOR liefert die Übersicht für ein einzelnes Konto, während eine Abfrage gegen information_schema.USER_PRIVILEGES eine systematische, serverweite Auswertung ermöglicht, insbesondere für Konten mit SUPER oder GRANT OPTION.
9Was ist caching_sha2_password und warum ist es relevant?
Es ist seit MySQL 8.0 das Standard-Authentifizierungsplugin und kryptografisch stärker als das ältere mysql_native_password. Ältere PHP-PDO-Treiber sollten vor einer produktiven Umstellung auf Kompatibilität getestet werden.
10Sollte auch der Reporting-Nutzer eine strenge Passwort-Policy erhalten?
Ja, auch technische Konten profitieren von einer strengen Policy, allerdings wird die Rotation bei rein technischen Konten meist über ein Secrets-Management-System statt über manuellen Wechsel gesteuert.