Riskante Konten prüfen: leeres Passwort, Host '%', SUPER, mysql_native_password
MySQLSicherheitBefehl
SELECT user, host, plugin,
CONCAT_WS(', ',
IF(authentication_string = '' AND account_locked = 'N', 'EMPTY PASSWORD', NULL),
IF(host = '%', 'ANY HOST', NULL),
IF(plugin = 'mysql_native_password', 'NATIVE AUTH', NULL),
IF(Super_priv = 'Y', 'SUPER', NULL),
IF(Grant_priv = 'Y', 'GRANT OPTION', NULL),
IF(File_priv = 'Y', 'FILE', NULL),
IF(ssl_type = '', 'NO TLS REQUIRED', NULL),
IF(password_expired = 'Y', 'EXPIRED', NULL),
IF(account_locked = 'Y', 'LOCKED', NULL)) AS findings,
password_last_changed
FROM mysql.user
WHERE user NOT IN ('mysql.sys', 'mysql.session', 'mysql.infoschema')
ORDER BY (Super_priv = 'Y') DESC, user;
-- Accounts holding powerful dynamic privileges
SELECT GRANTEE, PRIVILEGE_TYPE FROM information_schema.USER_PRIVILEGES
WHERE PRIVILEGE_TYPE IN ('SUPER', 'SYSTEM_VARIABLES_ADMIN', 'CONNECTION_ADMIN', 'BINLOG_ADMIN', 'REPLICATION_SLAVE_ADMIN')
ORDER BY GRANTEE;Was es tut
Listet Sicherheitsbefunde pro Konto in einer Zeile: kein Passwort, von überall verbindbar, altes Authentifizierungs-Plugin, Berechtigungen SUPER / GRANT / FILE und keine TLS-Pflicht; die zweite Abfrage zeigt gefährliche dynamische Berechtigungen.
Wann einsetzen
Bei regelmäßigen Sicherheitsaudits, auf einem neu übernommenen Server und vor einem Upgrade auf 8.4.
Vorsicht
Die Abfrage liest mysql.user direkt und braucht SELECT darauf. Rollenkonten sind gesperrt und ohne Passwort, daher wird EMPTY PASSWORD nur für nicht gesperrte Konten gemeldet. Super_priv ist die statische SUPER-Berechtigung; da 8.0 sie in dynamische Berechtigungen aufteilt, prüfe auch die zweite Abfrage. Mit NATIVE AUTH markierte Konten müssen vor 8.4 auf caching_sha2_password umgestellt werden: ALTER USER 'u'@'h' IDENTIFIED WITH caching_sha2_password BY '...'; alte Clients / Connectors unterstützen caching_sha2_password eventuell nicht, teste sie vorher.