四張權限表,驗證順序:
user(全域權限)db(資料庫級)tables_priv(資料表級)columns_priv(欄位級)邏輯:user 中權限為 Y → 直接通過,不再檢查後續表;為 N → 遞歸檢查下一層。
| 類別 | 權限關鍵字 | 說明 |
|---|---|---|
| 資料操作 | SELECT, INSERT, UPDATE, DELETE | DML 基礎權限 |
| 結構變更 | CREATE, DROP, ALTER, INDEX | DDL 權限 |
| 管理權限 | SUPER, PROCESS, RELOAD, SHUTDOWN | 影響全實例,極度謹慎授予 |
| 檔案權限 | FILE | 可讀寫伺服器檔案,極高風險 |
| 複製權限 | REPLICATION SLAVE/CLIENT | 主從複製專用 |
| 角色 | 建議權限 | 禁止權限 |
|---|---|---|
| 應用讀寫賬號 | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER | SUPER, FILE, PROCESS, SHUTDOWN, GRANT OPTION |
| 只讀報表賬號 | SELECT | 所有寫入與管理權限 |
| 開發/測試賬號 | 特定庫 ALL PRIVILEGES | 生產庫任何權限 |
| 備份賬號 | SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT | FILE, SUPER |
port 減少掃描攻擊CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'ComplexP@ssw0rd'host='localhost' + 禁用遠程登入general_log 或审计插件記錄登入與敏感操作mysql 用戶,目錄權限 750,數據目錄 750secure_file_priv=/var/lib/mysql-files/ 限制 LOAD DATA/INTO OUTFILE 目錄DROP DATABASE test,移除匿名用戶| 攻擊向量 | 核心條件 | 防禦措施 |
|---|---|---|
| UDF 提權 | 寫入 plugin 目錄 .so/dll | 進程用戶無寫入權限、plugin_dir 唯讀 |
| 寫啟動腳本 | 寫入 /etc/init.d/ 或 cron | 進程用戶無系統目錄寫入權限 |
| Root 洩露 | 管理帳號被盜 | 限制 Root 只能本地登入、定期輪換密碼 |
| 應用賬號洩露 | SQL 注入/伺服器被控 | 賬號無 FILE/管理權限、庫級隔離 |
-- 建用戶授權
GRANT SELECT,INSERT,UPDATE,DELETE ON db.* TO 'user'@'%' IDENTIFIED BY 'pass';
GRANT ALL PRIVILEGES ON db.* TO 'user'@'%' IDENTIFIED BY 'pass';
-- 刷新生效
FLUSH PRIVILEGES;
-- 查看權限
SHOW GRANTS FOR 'user'@'%';
-- 回收權限
REVOKE DELETE ON *.* FROM 'user'@'%';
-- 刪除用戶
DROP USER 'user'@'%';
-- 修改密碼
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
-- 導出檔案(需 FILE 權限)
SELECT * FROM t INTO OUTFILE '/var/lib/mysql-files/t.csv';