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登录)。