全新安裝的 MySQL 預設 root 無密碼、允許本地匿名登入、擁有所有權限,極度不安全。本文詳細說明設定 root 密碼的多種方式、重載授權表、移除匿名帳號、禁止遠端 root 登入等安全加固清單。
root@localhost:無密碼、全域權限(含 SHUTDOWN、FILE 等危險權限)。''@localhost(匿名帳號):可存取 test 庫與 test_% 庫,無管理權限。localhost 與真實主機名雙重連線。mysqladmin -u root password 'NewStrongP@ssw0rd'
若 root 已有密碼需修改:
mysqladmin -u root -p'OldPass' password 'NewStrongP@ssw0rd'
mysql -u root mysql
UPDATE user SET authentication_string=PASSWORD('NewStrongP@ssw0rd') WHERE User='root';
FLUSH PRIVILEGES;
注意:MySQL 5.7+ 欄位名為 authentication_string,5.6 及之前為 Password。8.0 預設使用 caching_sha2_password 插件,PASSWORD() 函數已移除,建議用 ALTER USER:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongP@ssw0rd';
mysql_secure_installation
會依序引導:設定 root 密碼 → 移除匿名帳號 → 禁止 root 遠端登入 → 移除 test 庫 → 重載權限表。
mysqladmin -u root -p status
# 輸入新密碼,顯示 Uptime/Threads/Questions 即成功
若仍可無密碼登入,執行 mysqladmin -u root reload 強制重載授權表(或重啟 mysqld)。
DROP USER ''@'localhost'; DROP USER ''@'%';DROP DATABASE test; DELETE FROM db WHERE Db='test' OR Db='test\\_%'; FLUSH PRIVILEGES;UPDATE user SET Host='localhost' WHERE User='root' AND Host='%'; FLUSH PRIVILEGES;CREATE USER 'app_user'@'app_server_ip' IDENTIFIED BY 'StrongPass';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'app_server_ip';
REQUIRE SSL,防止流量竊聽。validate_password 插件,強制長度、複雜度、過期輪換。audit_log 記錄登入、DDML、錯誤等事件。systemctl stop mysqldmysqld --skip-grant-tables --skip-networking &mysql -u rootFLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass';