Auditer les comptes à risque : mot de passe vide, hôte '%', SUPER, mysql_native_password
MySQLSécuritéCommande
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;Ce que fait la commande
Liste les constats de sécurité par compte sur une ligne : absence de mot de passe, connexion possible depuis n'importe où, ancien plugin d'authentification, privilèges SUPER / GRANT / FILE et absence d'exigence TLS ; la deuxième requête montre les privilèges dynamiques dangereux.
Quand l'utiliser
Lors des audits de sécurité périodiques, sur un serveur nouvellement hérité et avant une mise à niveau vers 8.4.
Attention
La requête lit directement mysql.user et nécessite SELECT dessus. Les comptes de rôle sont verrouillés sans mot de passe, donc EMPTY PASSWORD n'est signalé que pour les comptes non verrouillés. Super_priv est le privilège statique SUPER ; comme 8.0 le divise en privilèges dynamiques, vérifiez aussi la deuxième requête. Les comptes marqués NATIVE AUTH doivent passer à caching_sha2_password avant 8.4 : ALTER USER 'u'@'h' IDENTIFIED WITH caching_sha2_password BY '...'; les anciens clients / connecteurs peuvent ne pas prendre en charge caching_sha2_password, testez-les d'abord.