温馨提示×

Linux中MySQL的安全策略有哪些

小樊
57
2025-10-03 08:39:48
栏目: 云计算

1. 操作系统级别安全配置

  • 数据文件目录隔离:将MySQL数据文件(默认/var/lib/mysql)放置在非系统分区,防止系统分区磁盘空间耗尽导致数据库服务拒绝(DoS)。通过SHOW VARIABLES LIKE 'datadir'定位数据目录,用df -h检查所属分区,修改my.cnf中的datadir参数完成迁移。
  • MySQL账号权限最小化:创建专用系统用户(如mysql)运行MySQL服务,限制其对系统资源的访问。通过ps -ef | grep mysqld确认进程所属用户,若为root则修改/etc/systemd/system/mysqld.service中的UserGroup参数,重启服务生效。
  • 敏感文件权限控制:确保数据目录权限为drwxr-x---(属主mysql,属组mysql),配置文件(如/etc/my.cnf)权限为640(属主root,属组mysql),日志文件(如error.logquery.log)权限为660(属主mysql,属组mysql),密钥文件(如SSL证书)权限为400(仅属主可读)。

2. MySQL基础安全配置

  • 使用最新稳定版本:定期通过包管理器(如aptyum)升级MySQL至最新版本,修复已知漏洞。订阅MySQL安全公告(如邮件列表),及时获取补丁更新。
  • 删除默认样例数据库与匿名用户:安装后执行DROP DATABASE IF EXISTS test;删除测试数据库,执行SELECT user,host FROM mysql.user WHERE user='' OR password='';查找匿名用户,用DROP USER ''@'localhost'; DROP USER ''@'%';删除,降低攻击面。
  • 修改root用户名:将默认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
  • 启用SSL/TLS加密:生成SSL证书(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(通用日志路径)。注意:通用日志会影响性能,建议仅在调试或高安全需求时开启。
  • 使用审计插件增强审计:安装MySQL Enterprise Audit(商业版)或MariaDB Audit Plugin(开源版),记录用户登录、权限变更、数据操作等详细信息。例如安装MariaDB Audit Plugin:INSTALL PLUGIN server_audit SONAME 'server_audit.so';,配置审计规则(SET GLOBAL server_audit_events='QUERY,QUERY_DDL,QUERY_DML';)。

6. 密码与账户安全策略

  • 密码复杂度要求:通过PAM模块(/etc/pam.d/system-auth)设置密码最小长度(minlen=8)、包含大小写字母、数字和特殊字符(lcredit=-1,ucredit=-1,dcredit=-1,ocredit=-1),禁止使用历史密码(remember=5)。
  • 登录失败限制:配置PAM(/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. 定期维护与监控

  • 定期备份数据:使用mysqldumpmysqldump -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登录)。

0