本系列第二篇,系統梳理 MySQL 權限體系的物件級權限(庫、表、欄、索引)、管理級權限(全域操作),並重點標註高危權限,助你落實最小權限原則。
物件級權限(針對特定資料庫物件)
| 權限 | 作用對象 | 允許操作 |
SELECT | 表/視圖/欄位 | 執行 SELECT 查詢(無此權限僅能做純運算 SELECT 1+1) |
INSERT | 表 | INSERT、LOAD DATA INFILE(需 FILE 權限配合) |
UPDATE | 表/欄位 | UPDATE 修改資料 |
DELETE | 表 | DELETE 刪除資料 |
INDEX | 表 | CREATE INDEX、DROP INDEX |
ALTER | 表 | ALTER TABLE(修改結構、重命名、分區等) |
CREATE | 資料庫/表/索引 | CREATE DATABASE/TABLE/INDEX |
DROP | 資料庫/表/視圖 | DROP DATABASE/TABLE/VIEW |
GRANT | 全域/庫/表 | 將自身擁有的權限授予他人(**極高危**) |
REFERENCES | 表/欄位 | 建立外鍵約束引用該欄位 |
管理級權限(作用於整個 MySQL 伺服器)
| 權限 | 允許操作 | 風險等級 |
RELOAD | FLUSH TABLES/PRIVILEGES/LOGS/STATUS 等 | ⚠️ 中(可刷新權限、日誌) |
SHUTDOWN | mysqladmin shutdown 關閉伺服器 | 🔴 **極高**(拒絕服務) |
PROCESS | SHOW PROCESSLIST、KILL 連線/查詢 | ⚠️ 高(可見所有 SQL 文本、可殺慢查詢) |
FILE | LOAD DATA INFILE、SELECT ... INTO OUTFILE 讀寫伺服器檔案系統 | 🔴 **極高**(任意檔案讀寫、可寫 Webshell、讀 /etc/passwd) |
SUPER | KILL 任意連線、SET GLOBAL 變數、CHANGE MASTER TO、啟用/停用二進制日誌、PURGE BINARY LOGS | 🔴 **極高**(完全控制伺服器行為、複製拓撲、全域配置) |
REPLICATION SLAVE | 從伺服器連線讀取 Binlog | ⚠️ 中(僅供複製帳號) |
REPLICATION CLIENT | SHOW MASTER STATUS、SHOW SLAVE STATUS | ⚠️ 低 |
CREATE USER | CREATE USER、DROP USER、RENAME USER | ⚠️ 高(帳號生命週期控制) |
高危權限「三不授」原則
- 不授
FILE:應用帳號、開發帳號、讀寫分離帳號**嚴禁**。僅備份/匯入專用腳本在受控環境臨時授予。
- 不授
SUPER:DBA 專用。應用帳號不需修改全域變數、殺別人查詢、操作複製。
- 不授
GRANT:權限管理集中由 DBA/自動化流程執行,應用帳號無授權他人需求。
附帶高危:SHUTDOWN、PROCESS、CREATE USER、ALTER、DROP —— 僅 DBA 核心帳號持有。
帳號分層授權範本
| 角色 | 典型權限集 | REQUIRE |
| 應用讀寫帳號 | SELECT, INSERT, UPDATE, DELETE ON app_db.* | REQUIRE SSL |
| 應用唯讀帳號(報表/從庫) | SELECT ON app_db.* | REQUIRE SSL |
| 開發/測試帳號 | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON dev_db.* | REQUIRE SSL |
| 備份帳號 | SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* + FILE(僅備份窗口臨時授) | REQUIRE X509 + ISSUER |
| 監控/管理帳號 | PROCESS, REPLICATION CLIENT, SUPER ON *.* | REQUIRE X509 + ISSUER |
權限審計常用查詢
-- 列出所有帳號及全域權限
SELECT User, Host,
Select_priv, Insert_priv, Update_priv, Delete_priv,
Super_priv, File_priv, Grant_priv, Shutdown_priv, Process_priv
FROM mysql.user;
-- 檢查匿名帳號、無密碼帳號
SELECT User, Host FROM mysql.user WHERE User = '' OR authentication_string = '';
-- 檢查過寬庫級權限
SELECT User, Host, Db FROM mysql.db WHERE Select_priv='Y' AND Insert_priv='Y' AND Update_priv='Y' AND Delete_priv='Y';