「人人用 root」是最大安全隱患。本文構建 MySQL 用戶管理標準化體系,覆蓋創建、分級授權、密碼策略、認證插件、定期審計。
GRANT ALL ON *.*user@'10.0.1.%' 優於 user@'%'caching_sha2_password-- 1. 創建應用讀寫賬號(指定認證插件兼容舊驅動) CREATE USER 'app_rw'@'10.0.1.%' IDENTIFIED WITH mysql_native_password BY 'AppRwPassw0rd!'; -- 2. 創建只讀賬號 CREATE USER 'app_ro'@'10.0.1.%' IDENTIFIED BY 'AppRoPassw0rd!'; -- 8.0 默認 caching_sha2_password -- 3. 創建備份賬號 CREATE USER 'backup'@'10.0.1.50' IDENTIFIED BY 'BackupPassw0rd!'; -- 4. 創建監控賬號 CREATE USER 'monitor'@'10.0.1.100' IDENTIFIED BY 'MonitorPassw0rd!' REQUIRE SSL;
| 角色 | 授權語句 |
|---|---|
| 應用讀寫 | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `app_db`.* TO 'app_rw'@'10.0.1.%'; |
| 應用只讀 | GRANT SELECT ON `app_db`.* TO 'app_ro'@'10.0.1.%'; |
| 備份 | GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, EVENT, RELOAD, PROCESS ON *.* TO 'backup'@'10.0.1.50'; |
| 監控 | GRANT PROCESS, REPLICATION CLIENT, SELECT ON performance_schema.* TO 'monitor'@'10.0.1.100'; |
| 開發(測試庫) | GRANT ALL PRIVILEGES ON `dev_%`.* TO 'dev'@'10.0.1.%'; |
| DBA | GRANT ALL PRIVILEGES ON *.* TO 'dba'@'10.0.1.10' WITH GRANT OPTION; |
必須執行:FLUSH PRIVILEGES;
-- 修改密碼(三種等價方式)
ALTER USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'NewPassw0rd!';
SET PASSWORD FOR 'app_rw'@'10.0.1.%' = 'NewPassw0rd!';
-- 5.7 兼容
UPDATE mysql.user SET authentication_string = PASSWORD('NewPassw0rd!') WHERE user='app_rw' AND host='10.0.1.%'; FLUSH PRIVILEGES;
-- 密碼過期策略(8.0)
ALTER USER 'app_rw'@'10.0.1.%' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'app_rw'@'10.0.1.%' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 2;
-- 查看指定用戶權限
SHOW GRANTS FOR 'app_rw'@'10.0.1.%';
-- 查看所有用戶(核心字段)
SELECT user, host, authentication_string, plugin, password_expired, password_last_changed, account_locked
FROM mysql.user
ORDER BY user, host;
-- 審計腳本:檢查高風險配置
SELECT user, host FROM mysql.user WHERE user = 'root' AND host != 'localhost';
SELECT user, host FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;
SELECT user, host FROM mysql.user WHERE host = '%' AND user NOT IN ('monitor');
| 操作 | SQL |
|---|---|
| 重命名用戶 | RENAME USER 'old'@'%' TO 'new'@'%'; |
| 鎖定/解鎖賬號 | ALTER USER 'user'@'%' ACCOUNT LOCK / UNLOCK; |
| 刪除用戶 | DROP USER 'user'@'%'; |
| 複製用戶權限 | CREATE USER 'new'@'%' IDENTIFIED BY 'pwd'; GRANT ALL ON *.* TO 'new'@'%' WITH GRANT OPTION; -- 需手動複製 GRANT |
| 查看當前連接用戶 | SELECT CURRENT_USER(); |
caching_sha2_password,升級驅動(JDBC 8.0+、Connector/NET 8.0+、PHP mysqlnd 7.4+)mysql_native_passwordALTER USER 'legacy'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';#!/bin/bash
# audit_mysql_users.sh
mysql -h localhost -u auditor -p'AuditPass!' -e "
SELECT 'ROOT_REMOTE' AS check_type, user, host FROM mysql.user WHERE user='root' AND host!='localhost'
UNION ALL
SELECT 'EMPTY_PASS', user, host FROM mysql.user WHERE authentication_string='' OR authentication_string IS NULL
UNION ALL
SELECT 'WILDCARD_HOST', user, host FROM mysql.user WHERE host='%' AND user NOT IN ('monitor')
UNION ALL
SELECT 'NO_EXPIRE', user, host FROM mysql.user WHERE password_expired='N' AND user NOT IN ('mysql.sys','mysql.session');
" | mail -s "MySQL User Audit $(date +%F)" dba@company.com
將用戶管理納入基線檢查,從源頭消除「弱口令、過度授權、僵屍賬號」隱患。