FLUSH PRIVILEGES、易遺漏欄位root 用戶連線root 擁有 INSERT(mysql.db)與 RELOAD 權限shell> mysql -u root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
| 用戶 | 連線來源 | 密碼 | 權限 | 用途 |
|---|---|---|---|---|
| monty | 任意主機(% + localhost) | something | 全域所有權限 + GRANT OPTION | 超級管理員 |
| admin | localhost | 無 | RELOAD, PROCESS | 運維管理(flush、processlist) |
| dummy | localhost | 無 | USAGE(無實際權限) | 預留帳號,後續授權 |
關鍵點:必須同時建立user@localhost與user@%,否則匿名用戶優先匹配導致本地連線失效。
用戶 custom 需求:
localhost、server.domain、whitehouse.gov 連線stupidbankaccount 僅限 localhost、expenses 僅限 whitehouse.gov、customer 三主機皆可GRANT SELECT,INSERT,UPDATE,DELETE ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE ON customer.* TO 'custom'@'localhost' IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE ON customer.* TO 'custom'@'server.domain' IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE ON customer.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'stupid';
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost', User='admin', Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
注意:MySQL 版本不同,user 表權限欄位數量不同(3.22.11 前較少)。建議優先使用 GRANT。
# 立即生效(GRANT 自動觸發)
# 手動刷新(直接修改表後必須)
FLUSH PRIVILEGES;
# 驗證用戶權限
SHOW GRANTS FOR 'monty'@'localhost';