
# MySQL 安全加固終極指南:5 步鎖死數據庫防黑客
做 IT 嘅你一定聽過:「數據庫俾人爆咗,成間公司收皮。」MySQL 作為全球最流行嘅開源數據庫,每日俾黑客掃 port 嘅次數多到你唔信。但好多中小企裝完 MySQL 就咁用 default config,等於大門打開歡迎參觀。
今日就同大家 step-by-step 搞掂 MySQL 安全加固,5 步鎖死你個數據庫,等黑客見到都頭痛。
## MySQL 安全第一步:剷走預設帳户同測試資料庫
裝完 MySQL 第一件事,唔係 create database,而係清垃圾。MySQL 預設有 anonymous user 同 test database,呢兩樣嘢係黑客最鍾意嘅切入點。
-- 登入 MySQL root
mysql -u root -p
-- 剷走 anonymous users
DELETE FROM mysql.user WHERE User='';
-- 剷走 test database
DROP DATABASE IF EXISTS test;
-- 清除 test 相關權限
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- 重新載入權限表
FLUSH PRIVILEGES;
行完之後用 `SELECT User, Host FROM mysql.user;` 確認,應該只見到 root 同你建立嘅管理帳户。呢步係 MySQL 安全嘅基本,但超過 60% 嘅 MySQL instance 都冇做。
## MySQL 安全第二步:強制密碼策略同帳户鎖定
MySQL 8.0 內置咗密碼驗證插件 `validate_password`,你一定要開。唔好靠用户自律,要靠系統強制。
-- 安裝密碼驗證插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 設定密碼策略(最少 12 位、要有大細階+數字+特殊字符)
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.policy = 'STRONG';
-- 啟用帳户鎖定(5 次失敗鎖 2 日)
CREATE USER 'app_user'@'%'
IDENTIFIED BY 'SuperStrongP@ssw0rd2026'
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 2;
呢個設定令暴力破解基本上冇可能成功。5 次錯就鎖 48 小時,黑客等到花兒也謝了。
## MySQL 安全第三步:網絡層防護 — 限制 IP 同強制 SSL/TLS
MySQL 預設 listen 0.0.0.0:3306,等於全宇宙都連到。你必須限制 bind address 同啟用 SSL。
# 編輯 MySQL config(Ubuntu/Debian)
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 加入以下設定
[mysqld]
bind-address = 127.0.0.1 # 只聽 localhost(如需要 remote 就改內網 IP)
require_secure_transport = ON
ssl-ca = /etc/mysql/certs/ca.pem
ssl-cert = /etc/mysql/certs/server-cert.pem
ssl-key = /etc/mysql/certs/server-key.pem
-- 建立 SSL 用户(強制加密連線)
CREATE USER 'secure_user'@'192.168.1.%'
IDENTIFIED BY 'SecureP@ss2026'
REQUIRE SSL;
-- 檢查現有用户 SSL 狀態
SELECT User, Host, ssl_type FROM mysql.user;
所有 remote connection 必須行 SSL,中間人攻擊即刻失效。MySQL 安全嘅網絡層就係咁簡單。
## MySQL 安全第四步:最小權限原則 — 只俾必要權限
「是但 grant ALL PRIVILEGES」係最常見嘅 MySQL 安全災難。每個 application user 只需要最基本嘅權限。
-- ❌ 千祈唔好咁做
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%';
-- ✅ 正確做法:只俾必要權限
GRANT SELECT, INSERT, UPDATE, DELETE
ON myapp_db.*
TO 'app_user'@'192.168.1.%';
-- 連 DROP/ALTER 都唔俾(除非真係需要)
-- Application user 唔應該有 DDL 權限
-- 檢查用户權限
SHOW GRANTS FOR 'app_user'@'192.168.1.%';
記住:每個 user account 只應該有佢工作需要嘅最低權限。Web app user 唔需要 DROP TABLE,backup user 只需要 SELECT 同 LOCK TABLES。呢個 principle 係 MySQL 安全嘅黃金法則。
## MySQL 安全第五步:審計日誌同持續監控
做完以上四步,MySQL 安全已經好穩固。但安全係持續嘅過程,你需要知道邊個做過咩。
-- 啟用 general query log(debug 用,唔好長期開)
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/query.log';
-- 啟用 error log(必須長期開)
-- 喺 my.cnf 設定:
-- [mysqld]
-- log_error = /var/log/mysql/error.log
-- 啟用 slow query log(性能+安全雙重用途)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
# 用 MySQL Enterprise Audit Plugin(MySQL Enterprise Edition)
# 或者用 Percona Audit Plugin(免費替代)
# 安裝 Percona Audit Plugin
sudo apt install percona-server-server # 已內置 audit plugin
# 啟用 audit log
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_format = 'JSON';
SET GLOBAL audit_log_policy = 'ALL'; # 記錄所有連線同查詢
## MySQL 安全 Bonus:定期備份 + 加密
安全唔止係防入侵,仲要防數據損失。定期 backup 係 MySQL 安全嘅最後一道防線。
# 加密備份(用 mysqldump + openssl)
mysqldump -u root -p --all-databases --single-transaction \
| openssl enc -aes-256-cbc -salt -pass pass:YourBackupPassword \
> /backup/mysql_$(date +%Y%m%d).sql.enc
# 解密還原
openssl enc -aes-256-cbc -d -pass pass:YourBackupPassword \
-in /backup/mysql_20260612.sql.enc \
| mysql -u root -p
## 總結
MySQL 安全唔係火箭科技,5 步就搞掂:
1. 清走預設帳户同 test DB
2. 強制密碼策略 + 帳户鎖定
3. 限制 IP + 強制 SSL
4. 最小權限原則
5. 審計日誌 + 持續監控
🔗 參考資料:NVD NIST 漏洞資料庫
呢 5 步做齊,你個 MySQL 已經比 90% 嘅 production instance 更安全。記住:MySQL 安全係持續過程,唔係一次性 project。定期 review 權限、檢查 log、更新 patch,先係真正嘅安全。
#MySQL安全 #數據庫安全 #MySQL #DatabaseSecurity #Linux安全



