MySQL 權限系統採用分層架構,支援全域、資料庫、資料表、欄位四級授權。本文深入剖析用戶認證機制、權限表結構、GRANT/REVOKE 操作與安全配置最佳實踐。
PASSWORD() 非可逆加密儲存,與 Unix crypt() 演算法不同。.my.cnf [client] 區段固化參數。| 權限 | 權限欄位 | 作用層級 | 儲存表 |
|---|---|---|---|
| SELECT | Select_priv | 表 | user / db / tables_priv / columns_priv |
| INSERT / UPDATE / DELETE | Insert_priv / Update_priv / Delete_priv | 表 | 同上 |
| INDEX / ALTER / CREATE / DROP | Index_priv / Alter_priv / Create_priv / Drop_priv | 資料庫/表/索引 | 同上 |
| GRANT | Grant_priv | 資料庫/表 | user / db / host |
| RELOAD / SHUTDOWN / PROCESS | Reload_priv / Shutdown_priv / Process_priv | 服務器管理 | user |
| FILE | File_priv | 伺服器檔案存取 | user |
核心原則:user 表權限等同超級用戶,僅授予 DBA;一般用戶應在 user 表設為 'N',透過 db/host 表按資料庫授權。
user 表 Host、User、Password 三欄匹配。Host 支援萬用字元 %、_;服務器按排序順序取第一筆匹配(非優先匹配具體用戶名)。GRANT priv_type [(col_list)] ON {tbl|*|*.*|db.*} TO user [IDENTIFIED BY 'pwd'] [WITH GRANT OPTION];
REVOKE priv_type [(col_list)] ON {tbl|*|*.*|db.*} FROM user;
GRANT OPTION 允許受授者再授予自己擁有的權限。FILE 權限極敏感,受授者可讀寫伺服器進程可存取的任意檔案。權限變更生效時機:
FLUSH PRIVILEGES 或 mysqladmin flush-privileges 重載安裝腳本 mysql_install_db 建立:
立即執行:
mysql -u root mysql
UPDATE user SET Password=PASSWORD('strong_pwd') WHERE User='root';
FLUSH PRIVILEGES;
-- 或
mysqladmin -u root password 'strong_pwd'
-- 超級用戶
GRANT ALL ON *.* TO monty@localhost IDENTIFIED BY 'pwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO monty@'%' IDENTIFIED BY 'pwd' WITH GRANT OPTION;
-- 管理用戶(僅 reload/process)
GRANT RELOAD, PROCESS ON *.* TO admin@localhost;
-- 佔位用戶(無實際權限,後續再授)
GRANT USAGE ON *.* TO dummy@localhost;
註:需同時建立 @localhost 與 @'%' 兩條記錄,否則匿名用戶優先權較高會阻擋連線。
刪除 mysql 目錄下所有 *.frm/.MYI/.MYD,再執行 mysql_install_db(可先修改腳本自訂預設權限)。
掌握權限體系,是守護資料資產的第一道防線。