MySQL 初始安裝默認存在匿名用戶、root 無密碼、測試庫等安全隱患。本文提供標準化初始化腳本,覆蓋 root 密碼設置、匿名用戶清理、業務賬號創建、權限最小化、遠程訪問控制等全鏈路加固操作。
| 隱患 | 風險 | 成因 |
|---|---|---|
| root@localhost 無密碼 | 本地任意用戶獲取最高權限 | 初始化腳本未設置密碼 |
| 匿名用戶 ''@'localhost' / ''@'hostname' | 無需密碼登入、可訪問 test 庫 | mysql_install_db 默認創建 |
| test 數據庫所有用戶可讀寫 | 數據洩露、惡意寫入 | 默認權限授予 |
| root 允許遠程登入(部分版本) | 暴力破解、遠程接管 | 授權 Host='%' |
mysql -u root
-- 5.7+ 語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongRootPass123!';
ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'StrongRootPass123!';
ALTER USER 'root'@'::1' IDENTIFIED BY 'StrongRootPass123!';
-- 若需遠程管理(極不推薦),單獨創建管理賬號
FLUSH PRIVILEGES;
-- 僅允許應用服務器 IP 訪問
CREATE USER 'app_user'@'10.0.1.%' IDENTIFIED BY 'AppUserPass456!';
-- 僅授予業務庫增刪改查權限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE
ON `app_db`.*
TO 'app_user'@'10.0.1.%';
-- 禁止 DDL、GRANT、SHUTDOWN 等危險權限
FLUSH PRIVILEGES;
-- 查看所有用戶
SELECT User, Host FROM mysql.user;
-- 刪除匿名用戶(注意 Host 匹配)
DROP USER ''@'localhost';
DROP USER ''@'%';
-- 若報錯 ERROR 1396,按實際 Host 刪除:
-- DROP USER ''@'actual_hostname';
💡 技巧:SELECT User, Host FROM mysql.user WHERE User = ''; 精確定位匿名用戶 Host。
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = 'test' OR Db LIKE 'test\_%';
FLUSH PRIVILEGES;
DELETE FROM mysql.user WHERE User = 'root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;
#!/bin/bash
# mysql_secure_init.sh
# 使用:mysql_secure_init.sh 'RootPass' 'AppUser' 'AppPass' 'AppDB' 'AppIP%'
ROOT_PASS=$1
APP_USER=$2
APP_PASS=$3
APP_DB=$4
APP_HOST=$5
mysql -uroot <
validate_password 插件,強制長度≥12、混合字符類型CREATE USER ... WITH MAX_QUERIES_PER_HOUR 1000 MAX_CONNECTIONS_PER_HOUR 100GRANT ... REQUIRE SSL,配置 require_secure_transport=ONaudit_log 記錄登入、DDL、權限變更mysql.user 異常 Host、過期賬號、過度授權| 報錯 | 原因 | 解決 |
|---|---|---|
ERROR 1396 (HY000): Operation DROP USER failed for ''@'localhost' | Host 名不匹配(如實際為主機名) | SELECT User,Host FROM mysql.user WHERE User=''; 確認後精確刪除 |
ERROR 1410 (HY000): You are not allowed to create a user with GRANT | NO_AUTO_CREATE_USER SQL 模式開啟 | 先 CREATE USER 再 GRANT |
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements | 密碼不符合 validate_password 策略 | 增強密碼複雜度或降低策略等級 |
MySQL 安全基線 = 強 root 密碼 + 零匿名用戶 + 無測試庫 + 業務最小權限 + 禁用 root 遠程。將上述操作封裝為自動化腳本、納入部署流水線、定期審計複核,構建「安裝即安全、變更可追溯、異常可感知」的數據庫安全防線。