首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 遠程連線授權完整指南:建立遠程用戶、Host 欄位通配符、權限最小化與防火牆配置

     編輯:MySQL 資料庫相關知識

MySQL 遠程連線核心機制

MySQL 權限系統基於 user@host 二元組。host 欄位決定允許連線的來源:

  • localhost / 127.0.0.1 / ::1:僅本機
  • 192.168.1.100:特定 IP
  • 192.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 隱式建用戶語法 (5.7 及以前)

GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* 
TO 'app_user'@'192.168.1.%' IDENTIFIED BY '強密碼123!';

8.0+ 已移除 IDENTIFIED BY 子句,必須分步 CREATE USER + GRANT。

修改現有用戶 Host 允許遠程 (不推薦用於 root)

-- 查看現有用戶
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 段

MySQL 服務綁定地址配置

# /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: ****

常見連線失敗排查清單

  1. ERROR 1045 (28000): Access denied:用戶/密碼/Host 不匹配 → 檢查 mysql.user Host 欄位、密碼正確性
  2. ERROR 2003 (HY000): Can't connect to MySQL server:網路不通/防火牆/bind-address → 檢查防火牆、bind-address、服務狀態
  3. ERROR 2026 (HY000): SSL connection error:SSL 憑證問題 → 客戶端加 --ssl-mode=DISABLED 或配置正確憑證
  4. Authentication plugin 'caching_sha2_password' not supported:舊客戶端不支援 8.0 預設認證 → 用戶改 mysql_native_password 或升級客戶端
  5. 連線緩慢:DNS 反解超時 → skip-name-resolve=ON 或確保 DNS 正確

安全加固建議

  • 禁用 root 遠程登入:DELETE FROM mysql.user WHERE user='root' AND host!='localhost';
  • 啟用 SSL/TLS:require_secure_transport=ON,強制加密傳輸
  • 限制連線錯誤次數:max_connect_errors=100000,配合 FLUSH HOSTS 解封
  • 審計日誌:安裝 audit_log 插件記錄所有連線與操作
  • 定期輪換密碼:ALTER USER 'app_user'@'%' IDENTIFIED BY '新密碼';

MySQL 遠程連線授權的核心原則:專用用戶、最小權限、具體 Host、防火牆隔離、SSL 加密、禁用 root 遠程。遵循此原則配合定期審計,能在開放遠程存取與資料安全之間取得最佳平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved