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

MySQL 用戶權限體系深度解析:授權表、匹配邏輯與安全加固

     編輯:MySQL 資料庫相關知識

授權機制核心

MySQL 權限 = 主機 + 用戶 二元組唯一識別。root@localhost ≠ root@192.168.1.%。所有授權資訊儲於 mysql 系統庫三張表:

  • user:全域權限(基線)。
  • db:庫級權限。
  • host:輔助 db 表,定義「安全主機清單」。

三表結構要點

表主鍵關鍵權限欄位
user(Host, User)Select_priv, Insert_priv, ..., File_priv, Process_priv, Super_priv
db(Host, Db, User)Select_priv, Insert_priv, ..., Create_priv, Drop_priv
host(Host, Db)同 db,但僅在 db.Host 為空時生效

密碼欄位 Password **必須**用 PASSWORD('plain') 加密儲存,明文會導致認證失敗。

權限匹配演算法(優先序)

  1. user 表:按 Host(無通配符 → 有通配符 → 空)再按 User 同序排序,取第一匹配行作為 GlobalPriv。
  2. db 表:按 Host 同序排序,取第一匹配行作為 DbPriv。
  3. 合併邏輯:
    • 若 db.Host 為空,且 GlobalPriv.Host 在 host 表中 → EffectivePriv = GlobalPriv | host_privs。
    • 否則 EffectivePriv = GlobalPriv | DbPriv(布林 OR)。

實例:建立跨主機受限帳號

需求:用戶 custom,密碼 stupid,允許從 localhost、server.domain、whitehouse.gov 連線;bankaccount 僅限 localhost 存取;customers 三主機皆可。

INSERT INTO user (Host,User,Password) VALUES
('localhost','custom',PASSWORD('stupid')),
('server.domain','custom',PASSWORD('stupid')),
('whitehouse.gov','custom',PASSWORD('stupid'));

INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES
('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'),
('%','customers','custom','Y','Y','Y','Y','Y','Y');

FLUSH PRIVILEGES;

常見 Access Denied 排查清單

  1. 是否執行 mysql_install_db 初始化授權表?
  2. 首次是否用 mysql -u root mysql 進入系統庫?
  3. 修改授權表後是否 FLUSH PRIVILEGES 或 mysqladmin reload?
  4. 測試期是否用 --skip-grant-tables 啟動?
  5. 密碼是否用 PASSWORD() 加密?-ppass 無空格?

安全加固清單

  • 所有帳號**強制設密碼**,刪除匿名帳號(User='')。
  • **禁止 root 遠端登入**:DELETE FROM user WHERE User='root' AND Host!='localhost';。
  • 服務進程以**專用低權限 OS 用戶**啟動(非 root)。
  • 嚴禁授予 FILE、PROCESS、SUPER、SHUTDOWN 給應用帳號。
  • 不信任 DNS → 啟動參數 --skip-name-resolve,授權表只存 IP/localhost。
  • 內網部署 → --skip-networking 僅允許 Unix Socket。
  • 防火牆外需存取 → --secure 驗證 IP 一致性(但會阻擋 NAT 環境)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved