1. 操作系统级别安全配置
/var/lib/mysql
)放置在非系统分区,防止系统分区磁盘空间耗尽导致数据库服务拒绝(DoS)。通过SHOW VARIABLES LIKE 'datadir'
定位数据目录,用df -h
检查所属分区,修改my.cnf
中的datadir
参数完成迁移。mysql
)运行MySQL服务,限制其对系统资源的访问。通过ps -ef | grep mysqld
确认进程所属用户,若为root
则修改/etc/systemd/system/mysqld.service
中的User
和Group
参数,重启服务生效。drwxr-x---
(属主mysql
,属组mysql
),配置文件(如/etc/my.cnf
)权限为640
(属主root
,属组mysql
),日志文件(如error.log
、query.log
)权限为660
(属主mysql
,属组mysql
),密钥文件(如SSL证书)权限为400
(仅属主可读)。2. MySQL基础安全配置
apt
、yum
)升级MySQL至最新版本,修复已知漏洞。订阅MySQL安全公告(如邮件列表),及时获取补丁更新。DROP DATABASE IF EXISTS test;
删除测试数据库,执行SELECT user,host FROM mysql.user WHERE user='' OR password='';
查找匿名用户,用DROP USER ''@'localhost'; DROP USER ''@'%';
删除,降低攻击面。root
用户重命名为复杂名称(如admin_root
),执行UPDATE mysql.user SET user='admin_root' WHERE user='root'; FLUSH PRIVILEGES;
,减少密码猜测攻击风险。my.cnf
中设置allow-suspicious-udfs=false
(禁止加载可疑UDF函数)、local_infile=OFF
(阻止SQL注入读取本地文件)、skip-symbolic-links=ON
(禁止符号链接操作)、secure_file_priv=NULL
(限制客户端读取文件路径),关闭潜在安全漏洞。3. 用户权限与访问控制
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';
,根据需求分配具体权限(如GRANT SELECT, INSERT ON appdb.* TO 'app_user'@'localhost';
)。定期审计权限(SELECT user,host,priv FROM mysql.db;
),回收不必要的权限(REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'%';
)。my.cnf
中的bind-address=127.0.0.1
,使MySQL仅监听本地回环接口;通过防火墙(如ufw
)限制3306端口的访问(sudo ufw allow from 192.168.1.100 to any port 3306
),仅允许可信IP连接。FILE
(文件读写)、SUPER
(服务器管理)、SHUTDOWN
(关闭数据库)、CREATE_USER
(创建用户)等高权限,通过REVOKE FILE ON *.* FROM 'user'@'host';
回收,防止权限滥用。4. 网络与传输安全
ufw
(Ubuntu)或iptables
(CentOS)限制3306端口的访问,仅允许特定IP或网段(如公司内网)访问。例如sudo ufw deny 3306
(默认拒绝),再添加sudo ufw allow from trusted_ip to any port 3306
。sudo mysql_ssl_rsa_setup
),修改my.cnf
配置SSL参数(ssl-ca=/etc/mysql/ssl-ca.pem; ssl-cert=/etc/mysql/ssl-server-cert.pem; ssl-key=/etc/mysql/ssl-server-key.pem
),强制用户使用加密连接(GRANT ... REQUIRE SSL;
)。通过SHOW VARIABLES LIKE '%ssl%';
验证SSL是否启用。5. 日志与审计机制
my.cnf
中设置log_error=/var/log/mysql/error.log
(记录错误信息)、general_log=ON
(记录所有查询)、general_log_file=/var/log/mysql/query.log
(通用日志路径)。注意:通用日志会影响性能,建议仅在调试或高安全需求时开启。INSTALL PLUGIN server_audit SONAME 'server_audit.so';
,配置审计规则(SET GLOBAL server_audit_events='QUERY,QUERY_DDL,QUERY_DML';
)。6. 密码与账户安全策略
/etc/pam.d/system-auth
)设置密码最小长度(minlen=8
)、包含大小写字母、数字和特殊字符(lcredit=-1,ucredit=-1,dcredit=-1,ocredit=-1
),禁止使用历史密码(remember=5
)。/etc/pam.d/sshd
)限制连续失败次数(deny=3
),锁定账户60分钟(unlock_time=3600
),防止暴力破解。例如auth required pam_tally2.so onerr=fail deny=3 unlock_time=3600
。/etc/login.defs
设置密码有效期(PASS_MAX_DAYS=90
)、到期前警告(PASS_WARN_AGE=7
),禁止使用最近5次密码(remember=5
),强制用户定期更换密码。7. 定期维护与监控
mysqldump
(mysqldump -u root -p --all-databases > backup.sql
)或物理备份工具(如Percona XtraBackup)备份数据,加密备份文件(如使用gpg
)并离线存储(如移动硬盘),定期测试恢复流程。pt-query-digest
分析慢查询日志(slow_query_log=ON
),识别异常查询(如大量SELECT *
);使用监控工具(如Prometheus+Granafa)监控数据库性能指标(CPU、内存、连接数),及时发现异常行为。my.cnf
配置文件(/etc/my.cnf
),确保没有不必要的参数(如skip-grant-tables
);使用mysql_secure_installation
工具进行安全配置优化(如移除匿名用户、禁止远程root登录)。