MySQL 訪問控制基於 用戶@主機 模型。默認 root@localhost 僅允許本地連接,遠程訪問需顯式授權:
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 登錄 MySQL
mysql -uroot -p
-- 創建用戶,允許任意主機(%)訪問
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
-- 授予具體庫表權限(最小化原則)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `myapp`.* TO 'app_user'@'%';
-- 或授予所有權限(僅受信任內網/管理賬號)
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'%' IDENTIFIED BY 'AdminP@ss!' WITH GRANT OPTION;
-- 刷新權限生效
FLUSH PRIVILEGES;
編輯 /etc/my.cnf(Windows 為 my.ini),[mysqld] 區段:
# 註釋或刪除這行,默認綁定 127.0.0.1 僅本地可訪問
# bind-address = 127.0.0.1
# 或顯式綁定所有介面
bind-address = 0.0.0.0
# 生產環境建議:綁定具體內網 IP
# bind-address = 192.168.1.100
修改後必須 重啟 MySQL 服務 生效:systemctl restart mysqld
# CentOS 7+ / RHEL 7+ (firewalld)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# Ubuntu 18.04+ (ufw)
ufw allow 3306/tcp
# iptables 通用
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# 雲服務器安全組(阿里云/騰訊雲/AWS)
# 控制台 → 安全組 → 入站規則 → 添加 TCP 3306,來源設置為具體應用服務器 CIDR
# 客戶機測試
mysql -uapp_user -p -h 192.168.1.100 -P 3306
# 或使用 telnet/nc 測試端口通達
telnet 192.168.1.100 3306
nc -zv 192.168.1.100 3306
| 措施 | 實施方式 | 風險降低 |
|---|---|---|
| 禁用 root 遠程登錄 | 確保無 root@% 用戶;DROP USER 'root'@'%'; | 防暴力破解最高權限 |
| 強密碼策略 | validate_password 組件強制長度/複雜度 | 防弱密碼猜解 |
| 限制訪問來源 IP | 'user'@'192.168.1.%' 或安全組 CIDR | 縮小攻擊面 |
| 啟用 SSL 加密傳輸 | require_secure_transport=ON,配置憑證 | 防中間人竊聽 |
| 修改默認端口 | port=33061 + 防火牆/安全組同步修改 | 減少自動掃描噪音 |
| 審計日志 | 安裝 MariaDB Audit Plugin 或 MySQL Enterprise Audit | 事後追溯 |
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed | 用戶主機不匹配 | SELECT user, host FROM mysql.user; |
| ERROR 2003 (HY000): Can't connect to MySQL server | 端口未監聽/防火牆阻擋 | netstat -tunlp | grep 3306、firewall-cmd --list-ports |
| ERROR 1045 (28000): Access denied | 密碼錯誤/權限不足 | SHOW GRANTS FOR 'user'@'host'; |
| SSL connection error | 客戶端/服務端 SSL 配置不匹配 | mysql --ssl-mode=DISABLED ... 測試 |
黃金法則: 「最小權限、最小暴露、加密傳輸、審計可追溯」—— 任何遠程訪問配置上線前必須通過安全審核清單。