| 層級 | 方案 | 適用版本 | 說明 |
| 壓縮協議 | 啟用壓縮 | MySQL 3.22+ | 增加竊聽難度,非加密 |
| 隧道加密 | SSH 隧道 | 所有版本 | 客戶端-服務端建立加密 TCP 通道,推薦跨公網場景 |
| 原生 SSL/TLS | 配置 SSL 憑證 | MySQL 4.0+ | 原生加密連線,需憑證管理 |
帳號與認證強化
1. 強制所有帳號設定密碼
-- 修改 root 密碼範例
mysql -u root mysql
UPDATE user SET Password=PASSWORD('strong_password') WHERE user='root';
FLUSH PRIVILEGES;
風險: 空密碼帳號允許任意用戶名登入(mysql -u any_user db_name)。
2. 禁止以系統 root 運行 mysqld
- 建立專用
mysql 系統用戶:useradd -r -s /bin/false mysql
- 啟動腳本使用
su - mysql -c "mysqld" 或 systemd 服務配置 User=mysql
- MySQL 內部 root ≠ 系統 root,兩者無關聯
3. 保護啟動腳本與配置文件
mysql.server 若含系統 root 密碼,權限設為 600(僅 root 可讀)
- 數據目錄擁有者為 mysql 用戶,權限
750(組可讀,其他無權限)
權限最小化原則
| 權限 | 風險 | 建議授予對象 |
| PROCESS | 可見所有查詢文本(含敏感 SQL) | 僅 DBA 管理帳號 |
| FILE | 可讀寫服務器文件系統(含 /etc/passwd) | 極少數 ETL/備份帳號 |
| SHUTDOWN | 可關閉資料庫服務 | 僅自動化運維帳號 |
| GRANT | 可將自身權限轉授他人 | 極謹慎授予 |
關鍵配置參數(my.cnf)
[mysqld]
# 禁用本地資料載入(防止任意文件讀取)
local-infile=0
# 禁用符號連結(防止目錄遍歷)
skip-symbolic-links
# 限制單用戶最大連接數
max_user_connections=50
# 禁用 SHOW DATABASES(資訊洩露防護)
skip-show-database
# 僅綁定內網 IP(拒絕公網直連)
bind-address=192.168.1.100
# 啟用 SSL
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
DNS 與主機名安全
- 授權表優先使用 IP 地址 而非主機名
- 嚴禁使用
% 通配主機名(如 user@'%')
- 啟動參數
--skip-name-resolve 禁用 DNS 解析,提升連線速度並避免 DNS 劫持風險
緊急修復:root 密碼遺失/鎖定
# 1. 跳過授權表啟動
mysqld_safe --skip-grant-tables &
# 2. 無密碼登入重置
mysql -u root mysql
UPDATE user SET Password=PASSWORD('new_pass') WHERE user='root';
FLUSH PRIVILEGES;
# 3. 正常重啟服務
mysqladmin shutdown
systemctl start mysqld
安全審計清單
- 定期執行
mysql_secure_installation 互動式加固
- 審計
mysql.user 表:無空密碼、無匿名帳號、無通配主機名
- 檢查
information_schema.processlist 異常長連線
- 啟用審計日志插件(Enterprise 版)或通用日志(開源版)
- 定期輪換應用帳號密碼,撤銷離職人員權限
- 上一篇文章: MySQL ODBC 驅動實現 SQL Server 7 與 MySQL 雙向資料轉換
- 下一篇文章: SQL Server 資料無縫遷移至 MySQL:DTS 導出 + PHPMyAdmin 導入實戰
Copyright ©
程式碼之家 All Rights Reserved