核心授權模板
GRANT privileges ON database.table TO 'user'@'host' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
五大常見場景速配
| 場景 | SQL 指令 | 說明 |
| 1. 單庫全權限、任意主機、無密碼(測試用) | GRANT ALL PRIVILEGES ON test.* TO 'root'@'%'; | 僅開發環境,生產嚴禁無密碼 |
| 2. 全庫全權限、任意主機、無密碼 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; | 極高風險,僅內網受信主機 |
| 3. 指定用戶、全庫、任意主機、無密碼 | GRANT ALL PRIVILEGES ON *.* TO 'liuhui'@'%'; | 同上,建議加密碼 |
| 4. 指定用戶、全庫、任意主機、有密碼 | GRANT ALL PRIVILEGES ON *.* TO 'liuhui'@'%' IDENTIFIED BY 'liuhui'; | 生產基礎配置 |
| 5. 指定用戶、全庫、僅特定 IP | GRANT ALL PRIVILEGES ON *.* TO 'liuhui'@'10.2.1.11'; | 最小權限原則,推薦 |
進階授權範例
-- 單表 CRUD
GRANT SELECT, INSERT, UPDATE, DELETE ON prod.orders TO 'app_user'@'10.0.%' IDENTIFIED BY 'StrongPass!';
-- 單表唯讀(報表/分析帳號)
GRANT SELECT ON prod.orders TO 'readonly'@'10.0.%' IDENTIFIED BY 'ReadOnlyPass!';
-- 欄位級授權(隱藏敏感欄位)
GRANT SELECT (id, order_no, amount, status) ON prod.orders TO 'api_user'@'10.0.%' IDENTIFIED BY 'ApiPass!';
-- 存儲程序執行權限
GRANT EXECUTE ON PROCEDURE prod.calc_commission TO 'app_user'@'10.0.%';
-- 僅允許本機 Unix socket 連線(最高安全)
GRANT ALL ON *.* TO 'local_admin'@'localhost' IDENTIFIED BY 'LocalPass!';
網路層面必做配置
- my.cnf 綁定位址:
[mysqld]
bind-address = 0.0.0.0 # 監聽所有介面,或指定內網 IP
# skip-networking # 註釋掉此行
- 防火牆開放 3306(僅信任來源 IP):
# iptables
iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
# firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
- 雲端安全組/防火牆:同理,僅開放應用伺服器 CIDR。
驗證連線
# 客戶端測試
mysql -u liuhui -pliuhui -h 10.2.1.10 -P 3306
# 檢查用戶實際主機匹配
SELECT User, Host, plugin FROM mysql.user WHERE User='liuhui';
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
| ERROR 1130: Host 'x.x.x.x' is not allowed to connect | 用戶主機不匹配(% 不含 localhost socket) | 建立對應 Host 用戶:'user'@'%' + 'user'@'localhost' |
| ERROR 1045: Access denied for user | 密碼錯誤或密碼插件不匹配 | 確認密碼;MySQL 8.0 指定 IDENTIFIED WITH mysql_native_password |
| 連線超時 | 防火牆/安全組攔截、bind-address 錯誤 | 檢查網路層、my.cnf |
安全最佳實踐清單
- ✅ 專用帳號、專用密碼、專用主機限制
- ✅ 最小權限:僅授必要庫/表/欄位/操作
- ✅ 密碼複雜度 ≥ 16 字元,定期輪換
- ✅ 啟用 SSL/TLS 加密傳輸(
REQUIRE SSL)
- ✅ 審計日誌:
audit_log 或一般查詢日誌記錄敏感操作
- ✅ 定期
SHOW GRANTS 檢視權限漂移