Auditar contas de risco: senha vazia, host '%', SUPER, mysql_native_password
MySQLSegurançaComando
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;O que faz
Lista os achados de segurança por conta em uma linha: sem senha, conectável de qualquer lugar, plugin de autenticação legado, privilégios SUPER / GRANT / FILE e sem exigência de TLS; a segunda consulta mostra privilégios dinâmicos perigosos.
Quando usar
Em auditorias de segurança periódicas, em um servidor recém-herdado e antes de um upgrade para a 8.4.
Atenção
A consulta lê mysql.user diretamente e precisa de SELECT nela. Contas de role ficam bloqueadas e sem senha, então EMPTY PASSWORD é reportado apenas para contas desbloqueadas. Super_priv é o privilégio estático SUPER; como a 8.0 o divide em privilégios dinâmicos, verifique também a segunda consulta. Contas marcadas como NATIVE AUTH precisam migrar para caching_sha2_password antes da 8.4: ALTER USER 'u'@'h' IDENTIFIED WITH caching_sha2_password BY '...'; clientes / conectores antigos podem não suportar caching_sha2_password, teste-os antes.