MySQL 安全管理的核心在於「最小權限原則」與「纵深防禦」。本文系統梳理 MySQL 兩階段存取控制模型、六大權限表架構、30+ 權限項目、權限層級劃分、GRANT/REVOKE 實戰語法、帳號安全加固與資源配額管理,為 DBA 與安全工程師提供完整的權限治理參考框架。
user 表中的 Host、User、Password 三元組,判斷是否允許建立連線。| 表名 | 層級 | 控制範圍 |
|---|---|---|
user |
全域 | 用戶從哪台主機可連線、全域權限、資源限制、SSL 設定 |
db |
資料庫 | 特定用戶對特定資料庫的權限 |
host |
資料庫 | 配合 db 表,細粒度控制特定主機對資料庫的存取 |
tables_priv |
資料表 | 特定用戶對特定資料表的權限 |
columns_priv |
欄位 | 特定用戶對特定欄位的權限 |
procs_priv |
程序/函數 | 特定用戶對預存程序/函數的執行/修改權限 |
SELECT、INSERT、UPDATE、DELETECREATE、DROP、ALTER、INDEX、CREATE TEMPORARY TABLES、CREATE VIEW、SHOW VIEWCREATE ROUTINE、ALTER ROUTINE、EXECUTEGRANT OPTION、SUPER、PROCESS、RELOAD、SHUTDOWN、CREATE USER、FILE、SHOW DATABASESREPLICATION SLAVE、REPLICATION CLIENT| 層級 | ON 子句語法 | 儲存位置 |
|---|---|---|
| 全域 | ON *.* |
mysql.user |
| 資料庫 | ON db_name.* |
mysql.db, mysql.host |
| 資料表 | ON db_name.tbl_name |
mysql.tables_priv |
| 欄位 | ON db_name.tbl_name (col1, col2) |
mysql.columns_priv |
| 程序/函數 | ON PROCEDURE db_name.proc_name |
mysql.procs_priv |
-- 1. 超級管理員(全域所有權限 + 授權權限)
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' IDENTIFIED BY 'strong_pass' WITH GRANT OPTION;
-- 2. 開發人員(特定庫 DDL+DML)
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, CREATE VIEW, SHOW VIEW,
CREATE ROUTINE, ALTER ROUTINE, EXECUTE
ON dev_db.* TO 'dev'@'192.168.1.%' IDENTIFIED BY 'dev_pass';
-- 3. 唯讀帳號(報表/備份用)
GRANT SELECT ON prod_db.* TO 'readonly'@'10.0.0.%' IDENTIFIED BY 'ro_pass';
-- 4. 欄位級權限(敏感欄位隔離)
GRANT SELECT (id, name, email), UPDATE (name, email) ON crm.customers TO 'cs'@'%' IDENTIFIED BY 'cs_pass';
-- 5. 程序執行權限
GRANT EXECUTE ON PROCEDURE billing.calculate_fee TO 'api'@'%' IDENTIFIED BY 'api_pass';
MySQL 依 Host 排序(具體 IP > 通配符 > 空值),再依 User 排序(非空 > 空值)。匹配到第一筆即停止。
| 優先序 | Host | User | 說明 |
|---|---|---|---|
| 1 | localhost | root | 本地 root 最高優先 |
| 2 | 192.168.1.% | root | 特定子網 root |
| 3 | 192.168.1.2 | root | 特定 IP root |
| 4 | 192.168.1.2 | (空白) | 特定 IP 任意用戶(匿名) |
| 5 | % | root | 任意主機 root |
| 6 | % | (空白) | 任意主機任意用戶(最寬鬆) |
陷阱:若同時存在 ''@'%' 與 ''@'localhost',無參數連線會匹配 localhost 匿名帳號,而非 root。
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('ComplexP@ssw0rd!');DELETE FROM mysql.user WHERE User = '';DELETE FROM mysql.user WHERE User = 'root' AND Host = '%';GRANT ... REQUIRE SSL; 強制加密傳輸PASSWORD EXPIRE 機制(5.7+)
GRANT ALL ON app_db.* TO 'api_user'@'%' IDENTIFIED BY 'pass'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 200
MAX_CONNECTIONS_PER_HOUR 50
MAX_USER_CONNECTIONS 10;
MAX_QUERIES_PER_HOUR:每小時查詢上限MAX_UPDATES_PER_HOUR:每小時更新上限MAX_CONNECTIONS_PER_HOUR:每小時連線次數上限MAX_USER_CONNECTIONS:同時連線數上限配合 FLUSH USER_RESOURCES 重置計數器。
GRANT/REVOKE 修改記憶體中權限快取,**新連線自動生效**FLUSH PRIVILEGES(手動修改 grant 表時必須)REVOKE 不會刪除帳號,需 DROP USER 或 DELETE FROM mysql.user 徹底移除權限管理不是一次性設定,而是持續的治理流程:定期審核、最小授權、審計追蹤、自動化合規檢查。建議導入 pt-show-grants(Percona Toolkit)定期匯出權限快照進行版本控制與異動比對。