MySQL資料庫安全加固實戰:8步鎖死你嘅Database Server

# MySQL 資料庫安全加固實戰:8 步鎖死你嘅 Database Server 做 IT 嘅人都知,database 係成個 infrastructure 嘅心臟 — 所有 application data、客户資料、交易記錄全部喺曬入面。但係好多人 deploy MySQL 嗰陣求其裝完就算,default config 照用,root password 都唔改,結果成個 database ...

MySQL資料庫安全加固實戰:8步鎖死你嘅Database Server - 文章重點速覽 infographic

# MySQL 資料庫安全加固實戰:8 步鎖死你嘅 Database Server

做 IT 嘅人都知,database 係成個 infrastructure 嘅心臟 — 所有 application data、客户資料、交易記錄全部喺曬入面。但係好多人 deploy MySQL 嗰陣求其裝完就算,default config 照用,root password 都唔改,結果成個 database 曝露喺攻擊者面前。

今日就同大家 step-by-step 做一次 MySQL 安全加固,由安裝到審計,8 個步驟鎖死你嘅 database server。全部指令可以直接 copy 嚟用,唔使慢慢打。

## MySQL 安全加固:Step 1 — 安全安裝

裝 MySQL 嗰陣就要做足安全措施。用 `mysql_secure_installation` 係第一步:

# Ubuntu/Debian 安裝
sudo apt update && sudo apt install mysql-server -y

# 即刻執行安全安裝精靈
sudo mysql_secure_installation

呢個 wizard 會問你幾條問題,全部答 YES:
– Set root password? → **YES**(揀個強密碼,最少 16 位,有大小寫+數字+符號)
– Remove anonymous users? → **YES**(匿名用户係重大漏洞)
– Disallow root login remotely? → **YES**(root 只可以 localhost 登入)
– Remove test database? → **YES**(test db 任何人都 access 到)
– Reload privilege tables? → **YES**

## MySQL 安全加固:Step 2 — 強制密碼政策

MySQL 8.0 內置咗密碼驗證插件 `validate_password`,一定要開:

-- 檢查插件狀態
SHOW VARIABLES LIKE 'validate_password%';

-- 安裝插件(如果未啟用)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

-- 設定嚴格密碼政策
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 14;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

咁樣所有新 create 嘅 user 都會強制用強密碼,冇得偷懶。

## MySQL 安全加固:Step 3 — 最小權限原則

唔好成日用 root 或者 ALL PRIVILEGES 俾 application user。每個 user 只俾佢真正需要嘅權限:

-- 建立專用 application user(只限特定 database)
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd2026!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'app_user'@'192.168.1.%';

-- 建立 read-only reporting user
CREATE USER 'report_user'@'192.168.1.%' IDENTIFIED BY 'An0therStr0ng!P@ss';
GRANT SELECT ON myapp_db.* TO 'report_user'@'192.168.1.%';

-- 建立 backup user(只需要 SELECT + LOCK TABLES)
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'B@ckupStr0ngP@ss!';
GRANT SELECT, LOCK TABLES ON *.* TO 'backup_user'@'localhost';

FLUSH PRIVILEGES;

重點:**唔好俾 GRANT OPTION**,除非真係需要。**唔好 host=’%’**,限制 IP range。

## MySQL 安全加固:Step 4 — 啟用 SSL/TLS 加密連線

Database 同 application 之間嘅 traffic 一定要加密,唔係中間人攻擊一 sniff 就睇曬所有 data:

# 生成 self-signed cert(production 用正式 CA)
sudo mkdir /etc/mysql/ssl
cd /etc/mysql/ssl
sudo openssl genrsa 2048 > ca-key.pem
sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
sudo openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
sudo openssl rsa -in server-key.pem -out server-key.pem
sudo openssl x509 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

然後改 `/etc/mysql/mysql.conf.d/mysqld.cnf`:

[mysqld]
ssl_ca = /etc/mysql/ssl/ca-cert.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem
require_secure_transport = ON

Restart MySQL 之後,所有連線都強制用 TLS:

sudo systemctl restart mysql

# 驗證 SSL 已啟用
mysql -u root -p -e "SHOW VARIABLES LIKE '%ssl%';"

## MySQL 安全加固:Step 5 — 審計日誌

MySQL Enterprise 有 Audit Plugin,Community 版可以用 `general_log` + `log_slow` 或者第三方工具:

-- 啟用 general query log(debug 用,production 小心 performance)
SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql/general.log';

-- 啟用 slow query log(偵測異常 query)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- 啟用 error log 詳細模式
SET GLOBAL log_error_verbosity = 3;

另外可以裝 **Percona Audit Plugin**(Community 版免費):

# 下載 Percona Audit Plugin
wget https://downloads.percona.com/downloads/Percona-Audit-Log-Plugin/...
# 安裝後喺 my.cnf 加入
# plugin-load-add=audit_log.so
# audit_log_format=JSON
# audit_log_policy=ALL

## MySQL 安全加固:Step 6 — 網絡層防護

MySQL default port 3306 係全世界都知嘅,一定要做 network 層防護:

# 1. Bind 去 localhost(如果 app 同 db 同一部機)
# 喺 mysqld.cnf: bind-address = 127.0.0.1

# 2. 用 firewall 限制來源 IP
sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw deny 3306  # block 所有其他來源

# 3. 考慮改 default port(security by obscurity,輔助性質)
# port = 3307

## MySQL 安全加固:Step 7 — 定期備份 + 加密

Backup 唔單止係 disaster recovery,仲係防 ransomware 最後一道防線:

# mysqldump with SSL
mysqldump --ssl-mode=VERIFY_IDENTITY \
  --ssl-ca=/etc/mysql/ssl/ca-cert.pem \
  -u backup_user -p \
  --all-databases --single-transaction --routines --triggers \
  | gzip | openssl enc -aes-256-cbc -salt -out backup_$(date +%Y%m%d).sql.gz.enc

## MySQL 安全加固:Step 8 — 定期漏洞掃描 + 更新

最後,定期 check MySQL 有冇 security update:

# Check current version
mysql --version

# Ubuntu/Debian 更新
sudo apt update && sudo apt upgrade mysql-server -y

# 用 Lynis 做 security audit
sudo lynis audit system --tests-from-group databases

# 用 nmap 掃自己 database port
nmap -sV -p 3306 localhost

## 總結

MySQL 安全加固唔係一次性工作,係持續嘅 process。上面 8 個步驟涵蓋咗安裝、認證、授權、加密、審計、網絡、備份、更新 — 全部做齊嘅話,你個 database server 已經比 90% 嘅 production environment 更安全。

記住:**Database 係 attacker 嘅終極目標**,佢哋唔會直接打你個 firewall,而係透過 SQL injection、credential leak、insider threat 嚟攞 data。做好 MySQL 安全加固,就係守住最後一道防線。

#MySQL安全 #Database安全 #資安加固 #Linux教學