五大權限表概覽
| 表名 | 層級 | 用途 |
| user | 全域 | 記錄允許連線的帳號資訊,權限為全域級 |
| db | 資料庫級 | 記錄各帳號在各資料庫的操作權限 |
| table_priv | 資料表級 | 記錄資料表層級操作權限 |
| columns_priv | 欄位級 | 記錄資料欄位層級操作權限 |
| host | 主機級 | 配合 db 表對特定主機資料庫權限細粒度控制,不受 GRANT/REVOKE 影響 |
注意:MySQL 原生不支援資料列級權限,需自行以 GET_LOCK() 等程式邏輯實現。
版本差異與修正
- 不同版本權限表結構不同,升級後執行
mysql_fix_privilege_tables root_password 修正
- 建議直接升級至 MySQL 4.0.4+,早期版本 db 表缺少
Create_tmp_table_priv、Lock_tables_priv
常用權限項說明
| 權限 | 功能 | 風險提示 |
| CREATE TEMPORARY TABLES | 建立暫存表 | 低 |
| EXECUTE | 執行預存程序(當前版本未實現) | 低 |
| FILE | 讀寫伺服器主機檔案 | 高:可讀取 /etc/passwd 等敏感檔,嚴禁授予普通用戶 |
| GRANT OPTION | 將自身權限轉授他人 | 高:避免濫用 |
| LOCK TABLES | 鎖定資料表 | 中 |
| PROCESS | 檢視/終止客戶執行緒 | 4.0.2+ 僅保留檢視,終止需 SUPER |
| RELOAD | 執行 FLUSH/RESET 等管理操作 | 高:管理工具,勿濫授 |
| REPLICATION CLIENT | 查詢主從位置 | 低 |
| REPLICATION SLAVE | 從庫請求主庫 binlog | 僅授予從庫連線帳號 |
| SHOW DATABASES | 控制 SHOW DATABASES 權限 | 中 |
| SUPER | 終止執行緒、DEBUG、CHANGE MASTER、修改全域變數 | 高:核心管理權限 |
SSL 連線類型 (user.ssl_type)
NONE:預設,無加密
ANY:需加密,任意類型(GRANT REQUIRE SSL)
X509:需加密且需有效 X509 憑證(GRANT REQUIRE X509)
SPECIFIED:需滿足 ISSUER/SUBJECT/CIPHER 指定條件
資源限制欄位 (user 表)
max_connections:每小時最大連線數
max_questions:每小時最大查詢數
max_updates:每小時最大修改查詢數
- 全為 0 表示無限制
安全配置黃金法則
- 刪除所有匿名用戶
- 檢查空密碼帳號:
SELECT host,user FROM user WHERE Password = ''
- 避免 Host 使用萬用字元
%
- 避免直接用 user 表授權(全域權限風險大)
- 絕不授予 mysql 資料庫權限(含權限表本身)
- FILE 權限極謹慎,資料目錄權限嚴格設定(僅 MySQL 進程可讀)
- PROCESS、RELOAD、ALTER 僅授予可信任帳號
GRANT 執行流程
- 在 user 表建立記錄:User、Host、Password、全域權限欄位
- 資料庫級權限 → 寫入 db 表:User、Host、Db、權限欄位
- 資料表/欄位級權限 → 寫入 table_priv/columns_priv
- REVOKE 即刪除對應記錄