核心授權語法
GRANT 權限列表 ON 數據庫.表 TO '用戶'@'主機' IDENTIFIED BY '密碼' [WITH GRANT OPTION];
FLUSH PRIVILEGES;
常見授權模板
| 場景 | SQL 示例 | 說明 |
| 任意主機全權限 (極不推薦生產) | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'strong_pass' WITH GRANT OPTION; | % 匹配任意 IP,僅內網測試用 |
| 指定 IP 全權限 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'218.12.50.60' IDENTIFIED BY 'strong_pass'; | 精確 IP,安全性高 |
| 指定網段只讀 | GRANT SELECT ON mydb.* TO 'readonly'@'10.0.0.%' IDENTIFIED BY '...'; | 10.0.0.0/24 網段 |
| 指定域名 (需 DNS 解析) | GRANT SELECT, INSERT ON appdb.* TO 'app'@'api.example.com' IDENTIFIED BY '...'; | 依賴 skip_name_resolve=OFF |
| 特定表增刪改查 | GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.orders TO 'order_svc'@'172.16.%.%' IDENTIFIED BY '...'; | 最小權限原則 |
實操步驟:從創建用戶到驗證連通
- 登入 MySQL:
mysql -uroot -p
- 創建用戶 (8.0+ 推薦):
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'ComplexPass#2024';
-- 或舊版兼容
GRANT USAGE ON *.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'ComplexPass#2024';
- 授權:
GRANT SELECT, INSERT, UPDATE, DELETE ON production_db.* TO 'app_user'@'192.168.1.%';
- 刷新生效:
FLUSH PRIVILEGES;
- 驗證:
SHOW GRANTS FOR 'app_user'@'192.168.1.%';
-- 客戶端測試
mysql -h db_host -u app_user -p'ComplexPass#2024' -D production_db -e "SELECT 1;"
修改現有用戶 Host (遷移/擴展訪問來源)
-- 方法 1:更新 user 表 (需權限)
USE mysql;
UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- 方法 2:重新授權 (推薦,更安全)
RENAME USER 'root'@'localhost' TO 'root'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
安全加固清單
- 禁用 root 遠程:生產環境 root 僅允許
localhost / 127.0.0.1 / ::1。
- 強密碼策略:
validate_password 插件強制長度、大小寫、數字、特殊字符。
- 網絡層隔離:安全組/防火牆僅放行應用服務器 IP 段 3306 端口。
- SSL 加密傳輸:
REQUIRE SSL 子句強制加密連接。
- 定期審計:
SELECT User, Host, authentication_string FROM mysql.user; 掃描弱口令、通配符 Host。
常見報錯排查
| 錯誤碼 | 原因 | 解決 |
| 1130 Host not allowed | 用戶 Host 不匹配 | 檢查 SHOW GRANTS,確認 Host 模式 (IP/域名/%) |
| 1045 Access denied | 密碼錯誤/插件不匹配 | 確認密碼、authentication_plugin (caching_sha2_password vs mysql_native_password) |
| SSL connection required | 服務端強制 SSL | 客戶端加 --ssl-mode=REQUIRED 或配置 CA/證書 |
一鍵授權腳本 (Bash + 參數化)
#!/bin/bash
# grant_remote.sh
set -euo pipefail
USER=$1; HOST=$2; DB=$3; PRIVS=$4; PASS=$5
SQL="GRANT ${PRIVS} ON ${DB} TO '${USER}'@'${HOST}' IDENTIFIED BY '${PASS}'; FLUSH PRIVILEGES;"
mysql -uroot -p"${ROOT_PASS}" -e "${SQL}"
echo "Granted ${PRIVS} on ${DB} to ${USER}@${HOST}"
掌握授權本質:用戶 = 用戶名 + 來源 Host,精確控制來源、最小化權限、加密傳輸、定期審計,構建纵深防禦體系。