MySQL 權限系統基於 user@host 二元組。host 欄位決定允許連線的來源:
localhost / 127.0.0.1 / ::1:僅本機192.168.1.100:特定 IP192.168.1.%:網段通配%:任意主機(開發測試用,生產嚴禁)hostname / %.domain.com:主機名/域名通配(需 DNS 反解正確)-- 1. 登入 MySQL
mysql -u root -p
-- 2. 建立遠程用戶並授權 (推薦:指定具體 IP/網段)
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY '強密碼123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.1.%';
-- 3. 刷新權限 (8.0+ 通常自動生效,舊版需執行)
FLUSH PRIVILEGES;
-- 4. 驗證用戶建立
SELECT host, user, authentication_string FROM mysql.user WHERE user = 'app_user';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.*
TO 'app_user'@'192.168.1.%' IDENTIFIED BY '強密碼123!';
8.0+ 已移除 IDENTIFIED BY 子句,必須分步 CREATE USER + GRANT。
-- 查看現有用戶
SELECT host, user FROM mysql.user WHERE user = 'root';
-- 修改 host (風險極高,僅示範語法)
UPDATE mysql.user SET host = '%' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
-- 正確做法:建立專用遠程用戶,保留 root 僅 localhost
| 角色 | 建議權限 | Host 範圍 |
|---|---|---|
| 應用讀寫 | SELECT, INSERT, UPDATE, DELETE | 應用伺服器 IP/網段 |
| 應用唯讀 | SELECT | 應用伺服器 IP/網段 |
| 報表/分析 | SELECT, SHOW VIEW | 分析伺服器 IP |
| 備份帳號 | SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE | 備份伺服器 IP |
| 遷移/同步 | REPLICATION SLAVE, REPLICATION CLIENT | 從庫 IP |
| 管理員 (DBA) | ALL PRIVILEGES (含 SUPER, SHUTDOWN 等) | 僅 localhost / 管理堡壘機 IP |
# Ubuntu UFW
sudo ufw allow from 192.168.1.0/24 to any port 3306
# CentOS firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
# iptables 直接操作
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
# 雲廠商安全組 (AWS SG / Azure NSG / GCP Firewall)
# 入站規則:TCP 3306,來源:應用伺服器安全組/IP 段
# /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 監聽所有介面 (允許遠程連線)
bind-address = 0.0.0.0
# 或指定具體內網 IP
# bind-address = 192.168.1.50
# 重啟生效
systemctl restart mysqld
注意:skip-networking 若開啟會禁用 TCP 連線,必須註釋或設 skip-networking=0。
# 遠程客戶端測試
mysql -h 192.168.1.50 -u app_user -p -P 3306
# 指定協議 (排除 socket 干擾)
mysql -h 192.168.1.50 -u app_user -p --protocol=tcp
# 測試連線無需登入
telnet 192.168.1.50 3306
nc -zv 192.168.1.50 3306
# MySQL Workbench / DBeaver / DataGrip 等 GUI 工具
# Host: 192.168.1.50, Port: 3306, User: app_user, Password: ****
ERROR 1045 (28000): Access denied:用戶/密碼/Host 不匹配 → 檢查 mysql.user Host 欄位、密碼正確性ERROR 2003 (HY000): Can't connect to MySQL server:網路不通/防火牆/bind-address → 檢查防火牆、bind-address、服務狀態ERROR 2026 (HY000): SSL connection error:SSL 憑證問題 → 客戶端加 --ssl-mode=DISABLED 或配置正確憑證Authentication plugin 'caching_sha2_password' not supported:舊客戶端不支援 8.0 預設認證 → 用戶改 mysql_native_password 或升級客戶端skip-name-resolve=ON 或確保 DNS 正確DELETE FROM mysql.user WHERE user='root' AND host!='localhost';require_secure_transport=ON,強制加密傳輸max_connect_errors=100000,配合 FLUSH HOSTS 解封audit_log 插件記錄所有連線與操作ALTER USER 'app_user'@'%' IDENTIFIED BY '新密碼';MySQL 遠程連線授權的核心原則:專用用戶、最小權限、具體 Host、防火牆隔離、SSL 加密、禁用 root 遠程。遵循此原則配合定期審計,能在開放遠程存取與資料安全之間取得最佳平衡。