首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 權限控制系統深度解析:架構、存儲、驗證流程與生效機制

     編輯:MySQL 綜合教學

MySQL 權限控制系統深度解析:架構、存儲、驗證流程與生效機制

MySQL 權限系統是資料庫安全的基石。本文系統解析權限的分層架構、系統表存儲結構、兩階段驗證流程(連接校驗 + 請求校驗)、賬號名稱匹配規則、權限變更生效機制,為 DBA 與開發者建立完整的權限系統心智模型。

一、權限分層架構

層級範圍典型權限存儲表
全局/管理權限整個 MySQL 服務實例SHUTDOWN, SUPER, RELOAD, PROCESS, CREATE USER, REPLICATION SLAVEmysql.user
資料庫級權限特定資料庫及其所有對象SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTERmysql.db
表級權限特定資料表SELECT, INSERT, UPDATE, DELETE, TRIGGERmysql.tables_priv
欄位級權限特定欄位SELECT, INSERT, UPDATEmysql.columns_priv
存儲程序/函數權限特定 PROCEDURE/FUNCTIONEXECUTE, ALTER ROUTINEmysql.procs_priv
代理用戶權限代理關係PROXYmysql.proxies_priv

二、權限存儲:五大系統表

mysql.user         -- 全局權限、認證信息、帳號鎖定狀態
mysql.db           -- 資料庫級權限
mysql.tables_priv  -- 表級權限
mysql.columns_priv -- 欄位級權限
mysql.procs_priv   -- 存儲程序/函數權限
  • 服務啟動時將上述表載入記憶體 (Grant Tables Cache)
  • 權限變更語句 (GRANT/REVOKE/CREATE USER 等) 自動刷新快取
  • 直接 DML 修改系統表**不會自動生效**,需手動刷新

三、賬號名稱系統:user@host 模型

語法規則

  • 完整形式:'user_name'@'host_name'
  • 僅用戶名:'user_name' 等同 'user_name'@'%'
  • 含特殊字符 (如 -) 或通配符時**必須加引號**
  • 引號可單雙引號混用,但用戶名與主機名**分別加引號**

主機名匹配規則

  • 精確匹配:'localhost'、'192.168.1.100'、'db-server'
  • 通配符 % (SQL LIKE 語義):'192.168.1.%'、'%.example.com'、'%'
  • IP 掩碼 (MariaDB/Percona 擴展):'192.168.1.0/255.255.255.0'

用戶名匹配

  • 非空字串:精確匹配
  • 空字串 '':匹配**任意用戶名** (匿名用戶)

四、權限驗證兩階段流程

階段一:連接校驗 (Connection Verification)

  1. 客戶端發起 TCP 連接
  2. Server 從 mysql.user 讀取 Host, User, authentication_string, account_locked
  3. 按**排序規則**順序匹配:
    • 精確主機名 > 通配符主機名
    • 非空用戶名 > 空用戶名 (匿名)
  4. 檢查密碼 (插件認證) + 帳號鎖定狀態 (account_locked='Y')
  5. 任一失敗 → 拒絕連接 (ERROR 1045/1698)
  6. 通過 → 進入階段二,建立會話線程

階段二:請求校驗 (Request Verification)

每條 SQL 執行前,Server 檢查會話擁有的權限是否滿足操作需求:

  1. 聚合權限:全局 (user) + 資料庫 (db) + 表 (tables_priv) + 欄位 (columns_priv) + 程序 (procs_priv)
  2. 權限並集:任一層級擁有即通過
  3. 不足 → ERROR 1142 (SELECT/INSERT/UPDATE/DELETE command denied)

五、權限變更生效機制

修改方式生效時機命令
權限管理語句**即時生效** (自動刷新快取)GRANT, REVOKE, CREATE USER, DROP USER, ALTER USER, SET PASSWORD, RENAME USER
直接 DML 修改系統表**不生效**,需手動刷新INSERT/UPDATE/DELETE mysql.user 等
手動刷新快取立即生效FLUSH PRIVILEGES; mysqladmin flush-privileges; mysqladmin reload
啟動參數 --skip-grant-tables**完全跳過權限檢查** (極度危險)mysqld --skip-grant-tables

六、密碼存儲與認證機制

  • 密碼**永不以明文存儲** (5.7+ 為 authentication_string,5.6 為 Password)
  • 認證流程:Server 發送隨機數 → Client 用隨機數 + 密碼多次 SHA1 → Server 驗證
  • 加密後的密碼字串**即為真正密碼等價物**,洩露等同洩露明文
  • 支援插件式認證:mysql_native_password、caching_sha2_password (8.0 預設)、auth_socket、LDAP、Kerberos 等

七、排序規則對匹配的影響 (關鍵細節)

Server 讀取 mysql.user 到記憶體時會排序:

  1. Host: 字面值優先 (localhost > %)、IP 精確 > IP 通配
  2. User: 非空優先、字典序

實例:同時存在 'root'@'%' 和 ''@'localhost' (匿名),本地連接 mysql -u root 會匹配**匿名用戶** (因 Host 精確 localhost 排在 % 前),導致權限不足。解決:刪除匿名用戶 DROP USER ''@'localhost'。

八、最佳實踐清單

  1. 安裝後立即 mysql_secure_installation
  2. 生產庫**禁用 root 遠端**,建立專用帳號 + 具體 IP
  3. 最小權限原則:僅授予業務必要權限
  4. 定期審計 mysql.user:檢查匿名用戶、通配符 Host、弱密碼、過期帳號
  5. 使用 SHOW GRANTS FOR 'user'@'host' 核實實際權限
  6. 8.0+ 使用 **角色 (ROLE)** 簡化權限管理

總結

MySQL 權限系統 = 分層存儲 (5 表) + user@host 匹配模型 + 兩階段驗證 (連接+請求) + 快取生效機制。理解排序規則、匿名用戶陷阱、直接修改系統表不生效等核心細節,能避開 90% 權限相關疑難雜症。

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