-- 檢查通配符授權
SELECT User, Host, Db FROM mysql.db WHERE Host LIKE '%' OR Db LIKE '%';
SELECT User, Host FROM mysql.user WHERE Host = '%';
-- 修正:收回過度授權
REVOKE ALL ON *.* FROM 'dev_user'@'%';
GRANT SELECT, INSERT ON `biz_db`.* TO 'dev_user'@'10.0.1.%';
-- 審核超級權限
SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';
原則:按業務角色拆分賬號,僅授予必需庫/表/列權限,嚴禁 % 通配符。
-- 安裝密碼驗證插件(5.7+ 內置)
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 配置強策略
SET GLOBAL validate_password.policy = 'STRONG';
SET GLOBAL validate_password.length = 16;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;
-- 禁用舊格式密碼(5.7+)
SET GLOBAL old_passwords = 0;
my.cnf 權限 640 root:mysql,禁止 other 讀取~/.my.cnf 權限 600,存放 [client] password=xxx-- 1. 生成 SSL 憑證
mysql_ssl_rsa_setup --uid=mysql
-- 2. 配置強制 SSL
[mysqld]
require_secure_transport = ON
ssl_ca = /var/lib/mysql/ca.pem
ssl_cert = /var/lib/mysql/server-cert.pem
ssl_key = /var/lib/mysql/server-key.pem
-- 3. 用戶強制 SSL
ALTER USER 'app_user'@'%' REQUIRE SSL;
-- 4. 客戶端驗證
mysql -u app_user -p --ssl-mode=VERIFY_IDENTITY --ssl-ca=ca.pem
或使用 SSH 隧道:ssh -L 3307:localhost:3306 user@db-host,應用連 127.0.0.1:3307。
-- 1. 僅監聽本地/內網 IP
[mysqld]
bind-address = 127.0.0.1 # 或 10.0.0.10
-- 2. 防火牆層面僅放行應用服務器 IP
iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
-- 3. skip-networking(極端場景,僅本地 Unix Socket)
-- 安裝審計插件(企業版/Percona/MariaDB 內置)
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
-- 配置
[mysqld]
audit_log_policy = ALL
audit_log_format = JSON
audit_log_file = /var/log/mysql/audit.log
audit_log_rotate_on_size = 100M
audit_log_rotations = 10
重點監控:CONNECT 失敗嘗試、GRANT/DROP USER、TRUNCATE/DROP TABLE、非工作時間訪問。
mysqlsecurer、Lynis 定期掃描 CIS Benchmarkmysql--release 安全公告,及時打補丁#!/bin/bash
echo "=== MySQL Security Baseline Check ==="
mysql -e "SELECT User, Host, plugin FROM mysql.user WHERE Host='%' OR Password='' OR authentication_string='';"
mysql -e "SHOW VARIABLES LIKE 'validate_password%';"
mysql -e "SHOW VARIABLES LIKE 'require_secure_transport';"
mysql -e "SHOW VARIABLES LIKE 'bind_address';"
ls -l /etc/my.cnf ~/.my.cnf 2>/dev/null
echo "Check audit.log rotation: $(ls -lh /var/log/mysql/audit.log* 2>/dev/null | head -5)"
安全無絕對,唯有纏鬥:通配符清理、強密碼、配置加密、傳輸加密、網絡隔離、審計日志、持續運營,七層防線守護核心資產。