MySQL 權限系統基於三張核心權限表,採分級授權模型。本文系統梳理權限表架構、27 項具體權限用途、授權語法與安全最佳實務。
一、權限表架構與驗證流程
| 表名 | 範圍 | 關鍵欄位 |
user | 全域 | Host, User, Password, 全域權限欄位 |
db | 資料庫級 | Host, Db, User, 資料庫權限欄位 |
host | 主機級(輔助 db) | Host, Db, 權限欄位 |
驗證與授權順序:
- 連線驗證:
user 表匹配 Host/User/Password
- 權限疊加:
user → db → tables_priv → columns_priv
- 上層為
Y 則直接生效,不再檢查下層
二、27 項權限完整分類
資料操作類 (DML)
| 權限 | 允許操作 |
SELECT | 查詢 |
INSERT | 插入 |
UPDATE | 更新 |
DELETE | 刪除 |
結構管理類 (DDL)
| 權限 | 允許操作 |
CREATE | 建立資料庫/表/索引 |
DROP | 刪除資料庫/表/視圖/索引 |
ALTER | 修改表結構 |
INDEX | 建立/刪除索引 |
CREATE TEMPORARY TABLES | 建立臨時表 |
CREATE VIEW | 建立視圖 |
SHOW VIEW | 查看視圖定義 |
CREATE ROUTINE | 建立預存程序/函數 (含 EXECUTE, ALTER ROUTINE) |
ALTER ROUTINE | 修改/刪除預存程序/函數 |
EXECUTE | 執行預存程序/函數 |
TRIGGER | 建立/刪除觸發器 (5.1+) |
管理權限類 (需 ON *.*)
| 權限 | 允許操作 | 風險等級 |
GRANT OPTION | 將自身權限授予他人 | 高 |
RELOAD | FLUSH TABLES/LOGS/PRIVILEGES | 中 |
SHUTDOWN | mysqladmin shutdown | 極高 |
PROCESS | SHOW PROCESSLIST (全量)、KILL | 中 |
FILE | SELECT ... INTO OUTFILE, LOAD DATA INFILE | 極高 |
SUPER | Kill 任意查詢、修改全域變數、CHANGE MASTER, PURGE MASTER LOGS | 極高 |
REPLICATION CLIENT | SHOW MASTER/SLAVE STATUS | 中 |
REPLICATION SLAVE | 從庫讀取主庫 Binlog | 高 |
CREATE USER | 建立/刪除/重命名用戶 | 高 |
USAGE | 僅允許連線 (無實際權限) | 無 |
REFERENCES | 建立外鍵引用 (未完全實現) | 低 |
三、授權最佳實務
- 最小權限原則:業務帳號僅授予必要 DML 權限
- 管理權限隔離:
SUPER, FILE, PROCESS, SHUTDOWN 僅限 DBA 專用帳號
- 主機限制:避免
'user'@'%',指定具體 IP/子網
- 定期審計:
SHOW GRANTS FOR 'user'@'host'; 檢查權限漂移
- 移除匿名帳號:
DROP USER ''@'localhost';
- 強密碼策略:啟用
validate_password 元件
四、常用授權範例
-- 唯讀報表帳號
GRANT SELECT ON reporting_db.* TO 'reporter'@'10.0.1.%' IDENTIFIED BY 'strong_pass';
-- 開發帳號 (含建表、臨時表、視圖、程序)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX,
CREATE TEMPORARY TABLES,CREATE VIEW,SHOW VIEW,
CREATE ROUTINE,ALTER ROUTINE,EXECUTE,TRIGGER
ON dev_db.* TO 'dev'@'10.0.2.%' IDENTIFIED BY 'strong_pass';
-- 複寫帳號
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.3.%' IDENTIFIED BY 'strong_pass';
-- 撤銷權限
REVOKE INSERT ON db.* FROM 'user'@'host';
嚴格的權限治理是資料庫安全基石,建議納入變更管理流程,所有授權變更留存審計軌跡。