數據庫安全是纵深防御體系的核心一環。本文從賬號權限、網絡訪問、密碼策略、審計日志、主機加固、SQL 注入防護、啟動參數、備份恢復八個維度,構建 MySQL 生產環境安全基線。
mysql.user -- 全局權限 (最高層)
mysql.db -- 庫級權限
mysql.tables_priv -- 表級權限
mysql.columns_priv -- 列級權限 (最細粒度)
驗證邏輯:連接校驗 → user 全局權限 → db 庫權限 → tables_priv → columns_priv。就近原則:低層級 Y 覆蓋高層級 N。
| 權限 | 層級 | 業務賬號建議 | 管理賬號建議 |
|---|---|---|---|
| SELECT/INSERT/UPDATE/DELETE | 表 | ✅ 授予 | ✅ 授予 |
| CREATE/ALTER/INDEX/DROP | 庫/表 | ✅ 授予 (DDL 變更走發布系統) | ✅ 授予 |
| GRANT OPTION | 全局 | ❌ 禁止 | ✅ 僅 DBA |
| FILE | 全局 | ❌ 禁止 (防止 LOAD DATA 讀取敏感文件) | ❌ 禁止 |
| SHUTDOWN/PROCESS/SUPER/RELOAD | 全局 | ❌ 禁止 | ✅ 僅 DBA |
| REPLICATION SLAVE/CLIENT | 全局 | ❌ 禁止 | ✅ 僅同步賬號 |
| CREATE USER | 全局 | ❌ 禁止 | ✅ 僅 DBA |
db 表限定 Host、Db、User 三元組。test 庫通配符權限。
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,INDEX ON db.* TO 'app'@'10.0.%.%' IDENTIFIED BY 'strong_pass';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app'@'10.0.%.%';
REVOKE DROP ON db.* FROM 'app'@'10.0.%.%';
DROP USER 'old'@'%';
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_strong_pass');
bind-address=10.0.0.10 (內網 IP),禁用 0.0.0.0。port=33061 降低自動掃描命中率。max_user_connections=100 或 GRANT ... WITH MAX_CONNECTIONS_PER_HOUR 1000。Host 限定為堡壘機 IP。skip-networking 僅允許 Unix Socket 本地連接。validate_password 插件強制長度、大小寫、數字、特殊字符。password_expired、password_history、password_reuse_interval。caching_sha2_password (8.0 默認) 替換 mysql_native_password。--secure-auth 拒絕 pre-4.1 客戶端。| 日志類型 | 配置參數 | 用途 |
|---|---|---|
| 錯誤日志 | log-error | 啟動異常、崩潰堆棧、權限錯誤 |
| 通用查詢日志 | general_log=1, general_log_file | 全量 SQL 審計 (性能影響大,建議關鍵庫開啟) |
| 慢查詢日志 | slow_query_log=1, long_query_time=1 | 性能分析、索引優化 |
| 二進制日志 | log-bin, binlog_format=ROW | 主從同步、時間點恢復 (PITR)、審計 DML |
| 審計插件 | audit_log (Enterprise) / MariaDB Audit Plugin | 合規級審計:誰、何時、何操作、影響行數 |
日志分析自動化:接入 ELK/ClickHouse,規則引擎檢測 UNION SELECT、SLEEP(、INTO OUTFILE 等注入特征;脫庫事後溯源。
mysql 用戶/組,chown -R mysql:mysql /data/mysql;Windows 使用專用服務賬號 (非 Local System)。rx (讀/執行)rwx (讀/寫/執行)usermod -s /sbin/nologin mysql;移除 cmd.exe/bash 執行權限,防 UDF 提權、計劃任務植入。cat /dev/null > ~/.mysql_history、~/.bash_history,防敏感信息洩漏。chmod 660 /var/lib/mysql/mysql.sock,防 Webshell 通過 Socket 免密登錄。libinjection。DROP、TRUNCATE、LOAD DATA、INTO OUTFILE。
--local-infile=0 -- 禁用 LOAD DATA LOCAL (防文件讀取注入)
--skip-grant-tables -- 僅緊急恢復密碼時臨時使用,極度危險
--skip-name-resolve -- 禁用 DNS 解析,Host 欄只存 IP,減少解析延遲與欺騙
--skip-networking -- 禁用 TCP/IP (極高安全)
--skip-show-database -- 僅 SHOW DATABASES 權限用戶可見庫列表
--secure-auth -- 拒絕舊密碼格式客戶端
--safe-user-create -- GRANT 創建用戶需 mysql.user INSERT 權限
--old-passwords -- 兼容舊客戶端 (不推薦,應升級客戶端)
| 策略 | 工具/命令 | RPO/RTO | 適用場景 |
|---|---|---|---|
| 邏輯全量備份 | mysqldump --single-transaction --master-data=2 --routines --triggers | gzip | RPO=備份間隔 | 中小庫、跨版本遷移、開發環境 |
| 物理熱備份 | Percona XtraBackup / MySQL Enterprise Backup | RPO=分鐘級 | 大庫、生產環境、不阻塞寫入 |
| 增量備份 | XtraBackup --incremental / Binlog 解析 | RPO=秒級 | 核心業務、金融級 |
| 異地容災 | rsync/云存儲同步備份文件;GTID 多源複製/Group Replication | RPO=同步延遲 | 多可用區/多Region |
恢復演練:每季度 至少一次全量恢復演練,驗證備份文件完整性、恢復腳本可用性、RTO 達標。
require_secure_transport=ON)安全無終點,唯有持續基線檢查、漏洞修補、紅藍對抗演練,才能構建可信的數據防線。