GRANT privileges ON db.tbl TO 'user'@'host_spec' IDENTIFIED BY 'pass';
host_spec 決定「從哪裡可以連」,支援:
localhost、app.server.com192.168.1.100%:192.168.1.% (C 類)、% (任意)%.example.com192.168.128.0/17 → 前 17 位固定,匹配 192.168.128.0 ~ 192.168.255.255| 角色 | Host Spec | 權限 | 說明 |
|---|---|---|---|
| 本地管理 | root@localhost | ALL | 僅本機 socket 連線 |
| 應用讀寫 | app@10.0.1.% | SELECT,INSERT,UPDATE,DELETE | 應用叢集 CIDR |
| 唯讀報表 | ro@10.0.2.% | SELECT | 分析平台網段 |
| 開發測試 | dev@192.168.%.% | ALL ON dev_db.* | 開發網段、隔離庫 |
| 備份帳號 | backup@10.0.10.10 | SELECT,LOCK TABLES,RELOAD,REPLICATION CLIENT | 單一備份伺服器 |
| 異地從庫 | repl@203.0.113.50 | REPLICATION SLAVE | 固定公網 IP |
MySQL 授權表排序:最具體優先 → localhost > 192.168.1.100 > 192.168.1.% > %。
建立帳號時避免同用戶多 host 衝突,或用 RENAME USER 整理。
-- 允許 10.0.0.0/8 內所有應用伺服器
GRANT SELECT,INSERT,UPDATE,DELETE ON prod.* TO 'app'@'10.0.0.0/8';
-- 允許 172.16.0.0/12 (RFC1918 B 類)
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.0.0/12';
優點:單條規則覆蓋大網段、無需枚舉 IP、自動適應擴容。
-- 列出所有非本地帳號
SELECT User, Host FROM mysql.user WHERE Host NOT IN ('localhost','127.0.0.1','::1');
-- 發現過寬授權
SELECT User, Host FROM mysql.user WHERE Host = '%';
-- 檢查高危權限
SELECT User, Host, File_priv, Super_priv, Process_priv FROM mysql.user
WHERE File_priv='Y' OR Super_priv='Y' OR Process_priv='Y';
user@host 是 MySQL 存取控制的基石。精確 IP > CIDR 掩碼 > 通配符 > %,配合最小權限原則,構建「零信任」資料庫網路邊界。