위험 계정 감사: 빈 비밀번호, '%' 호스트, SUPER, mysql_native_password
MySQL보안명령어
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;하는 일
계정별 보안 발견 사항을 한 행에 나열한다: 비밀번호 없음, 어디서나 접속 가능, 레거시 인증 플러그인, SUPER / GRANT / FILE 권한, TLS 요구 없음. 두 번째 쿼리는 위험한 동적 권한을 보여 준다.
사용 시점
정기 보안 감사, 새로 인수한 서버, 8.4 업그레이드 전.
주의
쿼리는 mysql.user를 직접 읽으므로 해당 테이블에 대한 SELECT 권한이 필요하다. 롤 계정은 비밀번호 없이 잠겨 있으므로 EMPTY PASSWORD는 잠기지 않은 계정에 대해서만 보고된다. Super_priv는 정적 SUPER 권한이며, 8.0부터 동적 권한으로 분리되었으므로 두 번째 쿼리도 확인한다. NATIVE AUTH로 표시된 계정은 8.4 이전에 caching_sha2_password로 전환해야 한다: ALTER USER 'u'@'h' IDENTIFIED WITH caching_sha2_password BY '...'; 오래된 클라이언트/커넥터는 caching_sha2_password를 지원하지 않을 수 있으므로 먼저 테스트한다.