首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料庫安全防護完整指南:23 項核心防禦策略

     編輯:MySQL 資料庫相關知識

前言

MySQL 作為全球最流行的開源關係型資料庫,其安全性直接關係到企業核心資產的安危。本文系統整理了 23 項關鍵安全配置與最佳實踐,涵蓋網路傳輸加密、存取控制、權限最小化、審計監控等核心維度,助您構建纏深防禦體系。

一、網路傳輸與連線安全

1. 強制加密跨網路連線

當客戶端與伺服器需跨越不可信網路(如公網)通訊時,務必透過 SSH 隧道或 SSL/TLS 加密連線,防止資料被竊聽、竄改或重放攻擊。

2. 禁用明文密碼傳輸

禁止在腳本、配置檔或命令列中使用明文密碼。應採用單向雜湊函式(如 SHA-256)儲存密碼雜湊值,並啟用 MySQL 原生的 caching_sha2_password 認證外掛。

3. 封鎖非信任網路的 3306 連接埠

使用防火牆或路由器規則,僅允許應用伺服器 IP 存取 3306 連接埠。可透過 nmap -p 3306 或 telnet host 3306 驗證封鎖成效。

4. 啟用 SSL 與 SSH 加密傳輸

在生產環境強制要求 SSL 連線(REQUIRE SSL),並在程式碼層面使用參數化查詢搭配預處理語句,徹底杜絕 SQL 注入風險。

二、認證授權與權限最小化

5. 強化 Root 帳號安全

  • 修改預設空密碼,設定長度 ≥ 16 字元的複雜密碼
  • 禁止 Root 遠端登入(skip-networking 或 bind-address=127.0.0.1)
  • 重命名 Root 帳號(RENAME USER 'root'@'localhost' TO 'admin_xyz'@'localhost')

6. 實施最小權限原則

  • 應用程式使用專用帳號,僅授予 SELECT, INSERT, UPDATE, DELETE 等必要權限
  • 嚴禁授予 PROCESS, SUPER, FILE, SHUTDOWN 等高危權限給非管理帳號
  • 定期審核 mysql.user 表,移除無用帳號與匿名帳號

7. 保護系統資料表

除管理帳號外,任何使用者不得存取 mysql.user、mysql.db 等系統表。密碼雜湊值一旦洩露,攻擊者可直接離線破解或利用 Pass-the-Hash 攻擊。

8. 資源限制與連線控制

  • 設定 max_user_connections 限制單一帳號並發連線數
  • 使用 GRANT ... WITH MAX_QUERIES_PER_HOUR 等資源控制選項
  • 啟用 wait_timeout、interactive_timeout 快速回收閒置連線

三、伺服器層級加固

9. Chroot 隔離與專用帳號運行

以專用 mysql 使用者/群組(無 Shell、無家目錄)啟動 mysqld,並配合 --chroot 參數限制檔案系統可見範圍。

10. 關閉危險功能

  • --skip-symbolic-links 禁止符號連結攻擊
  • --local-infile=0 禁用 LOAD DATA LOCAL INFILE
  • --skip-show-database 隱藏資料庫列表
  • --skip-grant-tables 僅用於緊急救援,平時嚴禁啟用

11. 檔案系統權限鎖定

確保 MySQL 資料目錄(datadir)僅 mysql 使用者可讀寫,防止惡意寫入 UDF 惡意共享庫或竄改資料檔。

12. 審計與異常監控

  • 啟用一般查詢日誌與慢查詢日誌
  • 部署 MariaDB Audit Plugin 或 MySQL Enterprise Audit 記錄所有 DDL/DML 操作
  • 使用 tcpdump -i eth0 port 3306 | strings 定期抽查網路流量是否為明文

四、應用層防禦

13. 參數化查詢與輸入驗證

所有動態 SQL 必須使用預處理語句(Prepared Statements),嚴禁字串拼接。對輸入長度、型別、格式進行嚴格白名單驗證。

14. 錯誤資訊最小化

生產環境關閉詳細錯誤回顯(display_errors=Off),避免洩露資料庫結構、版本等敏感資訊。

15. 備份加密與離線儲存

mysqldump 導出資料時使用 --single-transaction --routines --triggers 確保一致性,備份檔案需加密(GPG/AES-256)並存放於異地離線儲存。

五、緊急恢復與常見誤區

16. 忘記 Root 密碼的標準恢復流程

  1. 停止 MySQL 服務
  2. 以 --skip-grant-tables --skip-networking 啟動
  3. 無密碼登入,執行 FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewComplexPass!';
  4. 正常重啟服務

17. 避開常見配置錯誤

  • ❌ 使用 GRANT ALL ON *.* TO 'user'@'%' → ✅ 指定具體庫表與 IP
  • ❌ 啟用 --skip-grant-tables 長期運行 → ✅ 僅救援時臨時使用
  • ❌ 直接刪除 mysql 系統庫檔案 → ✅ 使用 DROP USER、REVOKE 管理權限

結語

資料庫安全非一次性設定,而是持續的「防護-檢測-響應」循環。建議每季度執行:權限收斂審查、弱密碼掃描、日誌異常分析、滲透測試驗證。唯有纏深防禦,方能守住數據生命線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved