首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL安全加固23條軍規:構建數據庫鋼鐵防線的完整實踐指南

     編輯:MySQL 綜合教學

MySQL官方文檔提煉的23條安全準則,涵蓋網絡傳輸、認證授權、注入防範、權限最小化、審計監控、應急處置六大維度。本文結合生產環境實戰經驗,逐條深度解析並提供可執行的加固清單、驗證腳本與自動化巡檢方案,助力構建合規、可審計、高韌性的數據庫安全體系。

網絡與傳輸安全 (第1, 3, 8, 9, 13, 14條)

1. 強制加密傳輸通道


# my.cnf
[mysqld]
require_secure_transport = ON      # 拒絕非SSL連接
ssl_ca = /etc/mysql/ssl/ca.pem
ssl_cert = /etc/mysql/ssl/server-cert.pem
ssl_key = /etc/mysql/ssl/server-key.pem

[client]
ssl_ca = /etc/mysql/ssl/ca.pem
ssl_cert = /etc/mysql/ssl/client-cert.pem
ssl_key = /etc/mysql/ssl/client-key.pem

應用層驅動啟用SSL:JDBC useSSL=true&verifyServerCertificate=true、PDO PDO::MYSQL_ATTR_SSL_CA。

2. 端口與訪問控制

  • 防火牆/安全組:僅允許應用服務器IP訪問 3306
  • MySQL綁定內網IP:bind-address = 192.168.10.5
  • 禁用DNS解析:skip-name-resolve (提速+防DNS劫持)
  • 定期掃描驗證:nmap -p 3306 、telnet 3306

3. SSH隧道/堡壘機運維

禁止直接公網/跨VPC連接數據庫,運維通過堡壘機/SSH隧道:


# 本地端口轉發
ssh -L 13306:db_internal_ip:3306 bastion_user@bastion_host
# 本地連接 127.0.0.1:13306 即通達數據庫

認證與授權體系 (第2, 4, 5, 6, 7, 12, 17, 18, 20, 21條)

4. Root賬號隔離與強化


-- 重命名 root
RENAME USER 'root'@'localhost' TO 'dbadmin'@'localhost';
-- 禁止遠程登錄
DELETE FROM mysql.user WHERE User='dbadmin' AND Host!='localhost';
FLUSH PRIVILEGES;
-- 強密碼:20+字符,大小寫數字特殊符號,定期輪換 (90天)

5. 密碼策略與插件


-- 8.0 默認 caching_sha2_password,更安全
SHOW VARIABLES LIKE 'default_authentication_plugin';
-- 啟用密碼複雜度驗證
INSTALL COMPONENT 'file://component_validate_password';
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;
SET GLOBAL validate_password.policy = 'STRONG';

6. 最小權限原則實施


-- 應用賬號模板
CREATE USER 'app_user'@'192.168.10.%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON biz_db.* TO 'app_user'@'192.168.10.%';

-- 只讀賬號
CREATE USER 'ro_user'@'192.168.10.%' IDENTIFIED BY 'ReadOnlyPass!';
GRANT SELECT ON biz_db.* TO 'ro_user'@'192.168.10.%';

-- 遷移/備份賬號
CREATE USER 'backup_user'@'10.0.0.%' IDENTIFIED BY 'BackupPass!';
GRANT SELECT, LOCK TABLES, SHOW VIEW, PROCESS, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'backup_user'@'10.0.0.%';

-- 禁用危險權限
REVOKE FILE, PROCESS, SUPER, SHUTDOWN, CREATE USER, RELOAD ON *.* FROM 'app_user'@'%';

7. 資源限制防濫用


ALTER USER 'app_user'@'%' WITH MAX_USER_CONNECTIONS 100;
-- 8.0 Resource Group 進一步限制 CPU/IO (企業版功能)

注入攻擊防範 (第10, 11, 13條)

8. 參數化查詢 (核心鐵律)


-- PHP PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ? AND status = ?');
$stmt->execute([$userId, 1]);

-- Java PreparedStatement
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ps.setLong(1, userId);

-- Go
rows, _ := db.Query("SELECT * FROM users WHERE id = ?", userId)

9. 輸入驗證與長度檢查

  • 白名單驗證:ID必須數字、枚舉值必須在允許集合
  • 雙重長度校驗:應用層 + 數據庫列定義長度
  • 拒絕動態表名/列名拼接,若必須嚴格白名單映射

文件系統與OS級防護 (第14, 15, 16條)

10. 專用運行用戶與目錄權限


useradd -r -s /sbin/nologin mysql
chown -R mysql:mysql /var/lib/mysql /var/log/mysql /app/mysql
chmod 750 /var/lib/mysql /var/log/mysql
chmod 640 /etc/my.cnf

11. 禁用危險功能


[mysqld]
local-infile = 0           # 禁用 LOAD DATA LOCAL INFILE
skip-symbolic-links = ON   # 禁用符號鏈接
skip-show-database         # 普通用戶不可 SHOW DATABASES

審計與監控 (第14條擴展)

12. 啟用審計日誌

  • 企業版:audit_log 插件 (JSON格式、過濾規則、異步寫入)
  • 社區版:MariaDB Audit Plugin、McAfee MySQL Audit、解析 General Log/Slow Log
  • 關鍵審計事件:連接/斷開、失敗登錄、DDL、DML、權限變更、敏感表訪問、管理操作

13. 網絡流量審計


# 定期抽檢明文傳輸
tcpdump -i eth0 -nn -s 0 -A port 3306 | strings
# 生產環境建議部署網絡層 IDS/IPS (Suricata/Zeek) 持續監控

應急處置預案 (第22, 23條)

14. 忘記 Root 密碼 / 權限表損壞 急救流程


# 1. 停止服務
systemctl stop mysqld

# 2. 跳過權限表啟動
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking"
systemctl start mysqld

# 3. 本地無密碼登錄修復
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或修復權限表
-- UPDATE mysql.user SET authentication_string='' WHERE User='root'; (舊版本)

# 4. 恢復正常
systemctl stop mysqld
systemctl unset-environment MYSQLD_OPTS
systemctl start mysqld

15. --skip-grant-tables 風險控制

  • 必須配合 --skip-networking 禁止網絡連接
  • 操作完成立即重啟恢復正常模式
  • 審計記錄操作人、時間、原因

自動化巡檢腳本 (納入CI/CD/定時任務)


#!/bin/bash
# mysql_security_audit.sh
echo "=== MySQL Security Audit $(date) ==="

# 1. 匿名用戶
mysql -uroot -p${PWD} -e "SELECT User,Host FROM mysql.user WHERE User='';" | grep -v "User" && echo "❌ 存在匿名用戶" || echo "✅ 無匿名用戶"

# 2. Root 遠程
mysql -uroot -p${PWD} -e "SELECT User,Host FROM mysql.user WHERE User='root' AND Host!='localhost';" | grep -v "User" && echo "❌ Root允許遠程" || echo "✅ Root僅本地"

# 3. 空密碼/弱密碼 (需插件支持)
mysql -uroot -p${PWD} -e "SELECT User,Host FROM mysql.user WHERE authentication_string='' OR LENGTH(authentication_string)<20;" | grep -v "User" && echo "⚠️ 疑似弱密碼" || echo "✅ 密碼長度達標"

# 4. Test 庫
mysql -uroot -p${PWD} -e "SHOW DATABASES LIKE 'test';" | grep test && echo "❌ Test庫殘留" || echo "✅ 無Test庫"

# 5. 危險權限
mysql -uroot -p${PWD} -e "SELECT User,Host FROM mysql.user WHERE File_priv='Y' OR Process_priv='Y' OR Super_priv='Y' OR Shutdown_priv='Y';" | grep -v "User" && echo "⚠️ 非DBA持有危險權限" || echo "✅ 危險權限收斂"

# 6. SSL 強制
mysql -uroot -p${PWD} -e "SHOW VARIABLES LIKE 'require_secure_transport';" | grep ON && echo "✅ SSL強制" || echo "❌ 未強制SSL"

# 7. 審計日誌
ls -la /var/log/mysql/audit.log 2>/dev/null && echo "✅ 審計日誌存在" || echo "❌ 缺少審計日誌"

# 8. 防火牆規則
firewall-cmd --list-all | grep -E '3306|mysql' && echo "✅ 防火牆放行規則存在" || echo "⚠️ 檢查防火牆"

echo "=== Audit Complete ==="

合規映射

合規標準對應加固條目
等保 2.0/3.0身份鑑別、訪問控制、審計、入侵防範、惡意代碼防範
PCI DSS需求2/3/7/8/10/12 (密碼策略、加密傳輸、最小權限、審計日誌)
GDPR數據保護設計、訪問控制、審計追蹤、數據最小化
ISO 27001A.9 訪問控制、A.12 運營安全、A.13 通信安全、A.16 事件管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved