MySQL 權限系統基於「最小權限原則」,透過 GRANT 授予、REVOKE 撤銷權限。本文系統整理五大角色權限模板(唯讀、開發、DBA、超級管理員、應用帳號)、多層級授權語法、查看與撤銷操作、生產環境最佳實踐,幫助 DBA 快速建立合規的權限體系。
GRANT priv_type [(columns)] ON object TO user [IDENTIFIED BY 'pass'] [WITH GRANT OPTION] [resource_options];
priv_type:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, EXECUTE 等object:*.* (全域), db.* (庫), db.tbl (表), db.tbl(col) (欄位)user:'user'@'host' 格式,% 代表任意主機
GRANT SELECT ON prod_db.* TO 'readonly'@'10.0.1.%' IDENTIFIED BY 'ro_pass';
-- 僅允許內網報表伺服器 IP 段連線
GRANT SELECT, INSERT, UPDATE, DELETE,
CREATE, DROP, ALTER, INDEX,
CREATE VIEW, SHOW VIEW,
CREATE ROUTINE, ALTER ROUTINE, EXECUTE,
CREATE TEMPORARY TABLES,
LOCK TABLES
ON dev_db.* TO 'dev'@'192.168.1.%' IDENTIFIED BY 'dev_pass';
-- 參考權限(外鍵需求)
GRANT REFERENCES ON dev_db.* TO 'dev'@'192.168.1.%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE
ON app_db.* TO 'app_user'@'10.0.2.%' IDENTIFIED BY 'app_strong_pass'
WITH MAX_QUERIES_PER_HOUR 5000
MAX_UPDATES_PER_HOUR 1000
MAX_CONNECTIONS_PER_HOUR 200
MAX_USER_CONNECTIONS 50;
GRANT ALL PRIVILEGES ON prod_db.* TO 'dba_prod'@'10.0.0.10' IDENTIFIED BY 'dba_pass';
-- 可建表、改結構、管理權限、檢視進程,但無法 SHUTDOWN/FILE/REPLICATION
GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'super_strong_pass' WITH GRANT OPTION;
-- 僅限 localhost,禁止遠程 root
| 層級 | ON 子句 | 儲存表 | 典型場景 |
|---|---|---|---|
| 全域 | ON *.* |
mysql.user |
超管、備份帳號、監控帳號 |
| 資料庫 | ON db.* |
mysql.db, host |
應用帳號、開發、庫級 DBA |
| 資料表 | ON db.tbl |
mysql.tables_priv |
敏感表隔離、跨部門共享 |
| 欄位 | ON db.tbl (col1,col2) |
mysql.columns_priv |
薪資、身分證等敏感欄位 |
| 程序/函數 | ON PROCEDURE db.proc |
mysql.procs_priv |
API 僅執行特定預存程序 |
-- 當前用戶
SHOW GRANTS;
-- 指定用戶
SHOW GRANTS FOR 'app_user'@'10.0.2.%';
-- 撤銷特定權限
REVOKE INSERT, UPDATE ON app_db.* FROM 'app_user'@'10.0.2.%';
-- 撤銷所有權限(不刪除帳號)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'dev'@'192.168.1.%';
-- 徹底刪除帳號
DROP USER 'old_user'@'%';
-- 或
DELETE FROM mysql.user WHERE User='old_user' AND Host='%';
FLUSH PRIVILEGES;
DELETE FROM mysql.user WHERE User='root' AND Host='%';Host 欄位限制為具體 IP/網段,避免 %validate_password 插件,強制複雜度與輪換MAX_* 限制,防止失控查詢拖垮實例GRANT ... REQUIRE SSL; 加密傳輸pt-show-grants 匯出權限快照,納入版本控制| 誤區 | 正確做法 |
|---|---|
GRANT ALL ON *.* 給開發 |
按環境分級:開發庫給 DDL+DML,生產庫僅給 DML |
| 帳號共用 | 每人/每服務獨立帳號,便於審計與撤銷 |
| 密碼明文寫在腳本/代碼 | 使用 Vault/Secrets Manager,或 mysql_config_editor 加密存儲 |
REVOKE 後不重連 |
權限快取需新連線生效,或執行 FLUSH PRIVILEGES |
權限管理是資料庫安全的第一道防線。建立標準化的角色模板、自動化的審計腳本、嚴格的變更流程,才能在業務快速迭代中守住安全底線。