-- 建立用戶並授權(MySQL 8.0+ 建議分步)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, REFERENCES
ON mydb.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
參數解析:
ALL PRIVILEGES 或列舉具體權限(最小權限原則)。mydb.*:資料庫.表,* 代表所有表。*.* 為全庫全表(極度危險)。'app_user'@'%':% 允許任意 IP,生產環境務必限定具體 IP 或網段(如 'app_user'@'10.0.%.%')。FLUSH PRIVILEGES:重載授權表使立即生效(MySQL 8.0 通常隱含,但保留為佳)。/etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 0.0.0.0 # 監聽所有介面,預設 127.0.0.1 僅本機
重啟服務 systemctl restart mysqld。firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# 或限定來源 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" port protocol="tcp" port="3306" accept'
mysql -h server_ip -u app_user -p -D mydb -e "SELECT 1;"
| 措施 | 說明 |
|---|---|
| 禁用 root 遠程登入 | DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1'); FLUSH PRIVILEGES; |
| 強制 SSL/TLS 連線 | REQUIRE SSL 於 GRANT 子句,或全域 require_secure_transport=ON。 |
| 密碼策略 | 安裝 validate_password 元件,強制長度、複雜度、過期輪換。 |
| 審計日誌 | 啟用 audit_log 外掛記錄登入、查詢、DDL。 |
| 連線限制 | max_user_connections、max_connections 防止耗盡。 |
| 定期審核權限 | SHOW GRANTS FOR 'user'@'host'; 移除過期/多餘授權。 |
Host 'x.x.x.x' is not allowed to connect → 用戶 Host 欄位不匹配,檢查 SELECT User, Host FROM mysql.user;。Access denied for user 'user'@'host' (using password: YES) → 密碼錯誤或權限不足。SSL connection error → 客戶端/伺服器 TLS 版本不匹配,檢查 tls_version 參數。遠程存取便利與安全並重,嚴守最小權限、網路隔離、加密傳輸三原則。