MySQL權限檢查順序:user(全局) → db(庫級) → tables_priv(表級) → columns_priv(列級),首個匹配生效,host表不受GRANT/REVOKE影響(需直接DML維護)。
GRANT priv_type [(col_list)]
ON object_type priv_level
TO user_specification [auth_option]
[REQUIRE tls_option]
[WITH grant_option | resource_option];
| 類別 | 權限 | 典型角色 |
|---|---|---|
| 管理類 | SHUTDOWN, SUPER, PROCESS, RELOAD, FILE, REPLICATION SLAVE/CLIENT | DBA、監控、備份、復制賬號 |
| DDL類 | CREATE, ALTER, DROP, INDEX, CREATE TEMPORARY TABLES | 開發、遷移工具、Schema管理 |
| DML類 | SELECT, INSERT, UPDATE, DELETE | 應用讀寫、只讀報表、ETL寫入 |
| 授權類 | GRANT OPTION | 權限代理賬號 |
| 特殊 | ALL [PRIVILEGES] (除GRANT OPTION外所有), USAGE (無實權限,僅修改帳號屬性) | 超管/佔位 |
GRANT SELECT ON *.* TO 'monitor'@'%'; -- 全局只讀
GRANT SELECT,INSERT ON `biz_db`.* TO 'app_rw'@'10.0.%'; -- 庫級讀寫
GRANT UPDATE(col1,col2) ON `biz_db`.`tbl` TO 'etl'@'10.0.0.5'; -- 列級寫入
GRANT ALL ON `biz_db`.`tbl` TO 'dev'@'localhost'; -- 表級全權
'user'@'%':任意主機(通配符%匹配任意長度,_匹配單字符)'user'@'10.0.%':IP段限制'user'@'host.domain':主機名(依賴DNS反解,建議優先用IP)Host精確度排序匹配-- 修改密碼(不影響權限)
GRANT USAGE ON *.* TO 'app'@'%' IDENTIFIED BY 'NewPass2024!';
-- 強制SSL
GRANT USAGE ON *.* TO 'app'@'%' REQUIRE SSL;
-- 限制資源(每小時)
GRANT USAGE ON *.* TO 'app'@'%'
WITH MAX_QUERIES_PER_HOUR 10000
MAX_UPDATES_PER_HOUR 2000
MAX_CONNECTIONS_PER_HOUR 500
MAX_USER_CONNECTIONS 50; -- 並發連接數
-- 清零計數器
FLUSH USER_RESOURCES;
-- 收回特定權限
REVOKE INSERT ON `biz_db`.* FROM 'app'@'%';
-- 收回所有權限(保留帳號)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app'@'%';
-- 徹底刪除帳號(需DROP權限或直接操作mysql.user表)
DROP USER 'app'@'%';
-- 或
DELETE FROM mysql.user WHERE User='app' AND Host='%';
FLUSH PRIVILEGES;
注意:REVOKE不移除REQUIRE SSL/資源限制,需用GRANT USAGE ... REQUIRE NONE / WITH MAX_... 0覆蓋清除。
CREATE USER 'app_rw'@'10.0.1.%' IDENTIFIED BY 'StrongPass!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `biz_db`.* TO 'app_rw'@'10.0.1.%';
GRANT EXECUTE ON `biz_db`.* TO 'app_rw'@'10.0.1.%'; -- 若用存儲過程
CREATE USER 'report_ro'@'10.0.2.%' IDENTIFIED BY 'StrongPass!';
GRANT SELECT ON `biz_db`.* TO 'report_ro'@'10.0.2.%'
WITH MAX_QUERIES_PER_HOUR 5000 MAX_CONNECTIONS_PER_HOUR 20;
CREATE USER 'backup'@'10.0.3.10' IDENTIFIED BY 'StrongPass!';
GRANT SELECT, RELOAD, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER
ON *.* TO 'backup'@'10.0.3.10'
WITH MAX_CONNECTIONS_PER_HOUR 5; -- 單連接備份
CREATE USER 'repl'@'10.0.4.%' IDENTIFIED BY 'StrongPass!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.4.%';
-- 發現無Host限制的高危帳號
SELECT User, Host FROM mysql.user WHERE Host='%' AND User NOT IN ('repl','monitor');
-- 發現擁有FILE/SHUTDOWN/SUPER的非DBA帳號
SELECT User, Host FROM mysql.user
WHERE File_priv='Y' OR Shutdown_priv='Y' OR Super_priv='Y'
AND User NOT IN ('root','backup','repl');
-- 定期導出權限矩陣
SELECT * FROM information_schema.USER_PRIVILEGES;
SELECT * FROM information_schema.SCHEMA_PRIVILEGES;