MySQL 權限系統核心在 mysql.user 表的 Host 欄位:
localhost:僅允許本機 Unix socket / 127.0.0.1 連線。%:允許任意 IP 連線(通配符)。具體 IP/主機名:精確匹配來源。-- 建立可遠程登入的用戶
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
細粒度授權範例:
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'readonly'@'192.168.1.%';
GRANT SELECT ON mydb.log_table TO 'monitor'@'10.0.0.5';
USE mysql;
UPDATE user SET Host = '%' WHERE User = 'existing_user';
FLUSH PRIVILEGES;
警告: MySQL 5.7+authentication_string加密方式變更,直接 UPDATE 可能導致密碼驗證失敗,建議改用RENAME USER或重建用戶。
SELECT Host, User, authentication_string FROM mysql.user WHERE User = 'app_user';
-- 預期輸出
+------+----------+-------------------------------------------+
| Host | User | authentication_string |
+------+----------+-------------------------------------------+
| % | app_user | *加密密碼 |
+------+----------+-------------------------------------------+
/etc/my.cnf 中 [mysqld] bind-address = 0.0.0.0(或註解掉),重啟 mysqld。firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload(或 iptables/security group)。require_secure_transport=ON,客戶端需支援 SSL 連線。skip-name-resolve:避免 DNS 反向解析延遲,[mysqld] skip-name-resolve=1。| 錯誤碼 | 訊息 | 原因 | 解決 |
|---|---|---|---|
| 1130 | Host 'x.x.x.x' is not allowed to connect | user 表無對應 Host | GRANT ...@'%' 或修改 Host |
| 1045 | Access denied for user 'u'@'h' (using password: YES) | 密碼錯誤/加密插件不符 | 重設密碼、改用 mysql_native_password |
| 2003 | Can't connect to MySQL server on 'host' (110) | 網路不通/防火牆/bind-address | telnet host 3306、檢查防火牆、my.cnf |
GRANT ALL ON *.*。% 改為應用伺服器具體 IP/CIDR。REQUIRE SSL 強制加密傳輸。MariaDB Audit Plugin 或 MySQL Enterprise Audit 記錄登入/操作。MySQL 遠程訪問配置兩步走:資料庫層 GRANT 授權 + 作業系統層防火牆/bind-address 放行。生產環境務必遵循最小權限、IP 白名單、SSL 加密三原則,避免資料庫裸奔在公網。