首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 安全管理完整指南:權限體系、存取控制、帳號管理與資源限制實務

     編輯:MySQL 資料庫相關知識

MySQL 安全管理的核心在於「最小權限原則」與「纵深防禦」。本文系統梳理 MySQL 兩階段存取控制模型、六大權限表架構、30+ 權限項目、權限層級劃分、GRANT/REVOKE 實戰語法、帳號安全加固與資源配額管理,為 DBA 與安全工程師提供完整的權限治理參考框架。

一、兩階段存取控制模型

  1. 連線驗證階段:檢查 user 表中的 Host、User、Password 三元組,判斷是否允許建立連線。
  2. 請求授權階段:連線建立後,每個 SQL 請求(SELECT、INSERT、DROP 等)皆依權限表逐層檢查,決定是否執行。

二、六大權限表架構與職責

表名 層級 控制範圍
user 全域 用戶從哪台主機可連線、全域權限、資源限制、SSL 設定
db 資料庫 特定用戶對特定資料庫的權限
host 資料庫 配合 db 表,細粒度控制特定主機對資料庫的存取
tables_priv 資料表 特定用戶對特定資料表的權限
columns_priv 欄位 特定用戶對特定欄位的權限
procs_priv 程序/函數 特定用戶對預存程序/函數的執行/修改權限

三、核心權限項目分類(30+ 項)

資料操作權限(DML)

  • SELECT、INSERT、UPDATE、DELETE

結構管理權限(DDL)

  • CREATE、DROP、ALTER、INDEX、CREATE TEMPORARY TABLES、CREATE VIEW、SHOW VIEW

程序/函數權限

  • CREATE ROUTINE、ALTER ROUTINE、EXECUTE

管理權限

  • GRANT OPTION、SUPER、PROCESS、RELOAD、SHUTDOWN、CREATE USER、FILE、SHOW DATABASES

複寫權限

  • REPLICATION SLAVE、REPLICATION CLIENT

四、權限層級與 GRANT 語法

層級 ON 子句語法 儲存位置
全域 ON *.* mysql.user
資料庫 ON db_name.* mysql.db, mysql.host
資料表 ON db_name.tbl_name mysql.tables_priv
欄位 ON db_name.tbl_name (col1, col2) mysql.columns_priv
程序/函數 ON PROCEDURE db_name.proc_name mysql.procs_priv

GRANT 常用範例


-- 1. 超級管理員(全域所有權限 + 授權權限)
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' IDENTIFIED BY 'strong_pass' WITH GRANT OPTION;

-- 2. 開發人員(特定庫 DDL+DML)
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, CREATE VIEW, SHOW VIEW,
      CREATE ROUTINE, ALTER ROUTINE, EXECUTE
ON dev_db.* TO 'dev'@'192.168.1.%' IDENTIFIED BY 'dev_pass';

-- 3. 唯讀帳號(報表/備份用)
GRANT SELECT ON prod_db.* TO 'readonly'@'10.0.0.%' IDENTIFIED BY 'ro_pass';

-- 4. 欄位級權限(敏感欄位隔離)
GRANT SELECT (id, name, email), UPDATE (name, email) ON crm.customers TO 'cs'@'%' IDENTIFIED BY 'cs_pass';

-- 5. 程序執行權限
GRANT EXECUTE ON PROCEDURE billing.calculate_fee TO 'api'@'%' IDENTIFIED BY 'api_pass';

五、連線匹配優先順序(關鍵機制)

MySQL 依 Host 排序(具體 IP > 通配符 > 空值),再依 User 排序(非空 > 空值)。匹配到第一筆即停止。

優先序 Host User 說明
1 localhost root 本地 root 最高優先
2 192.168.1.% root 特定子網 root
3 192.168.1.2 root 特定 IP root
4 192.168.1.2 (空白) 特定 IP 任意用戶(匿名)
5 % root 任意主機 root
6 % (空白) 任意主機任意用戶(最寬鬆)

陷阱:若同時存在 ''@'%' 與 ''@'localhost',無參數連線會匹配 localhost 匿名帳號,而非 root。

六、帳號安全加固清單

  1. Root 強制強密碼:SET PASSWORD FOR 'root'@'localhost' = PASSWORD('ComplexP@ssw0rd!');
  2. 刪除匿名帳號:DELETE FROM mysql.user WHERE User = '';
  3. 移除 '%' Host 的 root:DELETE FROM mysql.user WHERE User = 'root' AND Host = '%';
  4. 限制連線來源:生產帳號僅允許應用伺服器 IP 段
  5. 啟用 SSL:GRANT ... REQUIRE SSL; 強制加密傳輸
  6. 定期輪換密碼:配合 PASSWORD EXPIRE 機制(5.7+)

七、資源配額管理(防濫用)


GRANT ALL ON app_db.* TO 'api_user'@'%' IDENTIFIED BY 'pass'
WITH MAX_QUERIES_PER_HOUR 1000
     MAX_UPDATES_PER_HOUR 200
     MAX_CONNECTIONS_PER_HOUR 50
     MAX_USER_CONNECTIONS 10;
  • MAX_QUERIES_PER_HOUR:每小時查詢上限
  • MAX_UPDATES_PER_HOUR:每小時更新上限
  • MAX_CONNECTIONS_PER_HOUR:每小時連線次數上限
  • MAX_USER_CONNECTIONS:同時連線數上限

配合 FLUSH USER_RESOURCES 重置計數器。

八、權限變更生效機制

  • GRANT/REVOKE 修改記憶體中權限快取,**新連線自動生效**
  • 現有連線需重新連線或執行 FLUSH PRIVILEGES(手動修改 grant 表時必須)
  • REVOKE 不會刪除帳號,需 DROP USER 或 DELETE FROM mysql.user 徹底移除

權限管理不是一次性設定,而是持續的治理流程:定期審核、最小授權、審計追蹤、自動化合規檢查。建議導入 pt-show-grants(Percona Toolkit)定期匯出權限快照進行版本控制與異動比對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved