如何配置Linux MySQL安全设置
1. 修改默认配置文件限制访问
编辑MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),修改以下两项:
- 绑定本地地址:将
bind-address设置为127.0.0.1,限制MySQL仅监听本地连接,避免暴露在公网; - 禁用DNS解析:添加
skip-name-resolve,防止MySQL通过DNS解析主机名,提升连接性能并减少DNS欺骗风险。
修改后重启MySQL服务使配置生效:sudo systemctl restart mysql。
2. 强化root账户安全
- 设置强密码:登录MySQL后,使用
ALTER USER命令为root用户设置包含大小写字母、数字和特殊字符的强密码(长度不低于12位):ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!'; FLUSH PRIVILEGES; - 限制远程访问:默认情况下,root用户允许从任何IP远程登录,需修改其
Host字段为localhost,仅允许本地访问:UPDATE mysql.user SET Host='localhost' WHERE User='root' AND Host='%'; FLUSH PRIVILEGES; - 禁用默认账户与测试数据库:删除匿名用户(无法通过密码验证的用户)和测试数据库(默认创建的空数据库),避免未授权访问:
DELETE FROM mysql.user WHERE User=''; DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;
3. 创建专用用户并实施最小权限原则
避免使用root用户进行日常操作,创建专用用户并授予最小必要权限(如仅需访问特定数据库的SELECT、INSERT权限):
-- 创建用户(指定允许访问的主机,如localhost或特定IP)
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppSpecificPassword!';
-- 授予特定数据库的只读权限(示例)
GRANT SELECT, INSERT ON my_database.* TO 'app_user'@'localhost';
-- 刷新权限使变更生效
FLUSH PRIVILEGES;
定期审核用户权限,使用SHOW GRANTS FOR 'app_user'@'localhost';
查看用户权限,及时回收不必要的权限(如REVOKE DELETE ON my_database.* FROM 'app_user'@'localhost';
)。
4. 配置密码安全策略
- 启用密码插件:安装
validate_password插件,强制密码符合复杂性要求(如长度、大小写字母、数字、特殊字符):INSTALL PLUGIN validate_password SONAME 'validate_password.so'; -- 设置密码长度至少12位,包含至少1个大写字母、1个特殊字符 SET GLOBAL validate_password_length = 12; SET GLOBAL validate_password_mixed_case_count = 1; SET GLOBAL validate_password_special_char_count = 1; - 设置密码有效期:通过全局变量或用户级别设置密码过期时间(如全局90天,用户级别180天),强制用户定期更改密码:
-- 全局设置(需修改my.cnf配置文件并重启服务) SET GLOBAL default_password_lifetime = 90; -- 用户级别设置(覆盖全局策略) ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY; - 使用强认证插件:优先使用
caching_sha2_password(MySQL 8.0+默认)替代旧的mysql_native_password,提升密码存储安全性:ALTER USER 'app_user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'AppSpecificPassword!';
5. 配置SSL/TLS加密连接
为防止数据传输过程中被窃取或篡改,启用MySQL的SSL/TLS加密:
- 生成证书与密钥:使用MySQL自带的
mysql_ssl_rsa_setup工具生成自签名证书(生产环境建议使用CA颁发的证书):sudo mysql_ssl_rsa_setup --datadir=/etc/mysql/ssl - 配置MySQL启用SSL:编辑
my.cnf文件,在[mysqld]部分添加证书路径:[mysqld] ssl-ca=/etc/mysql/ssl/ca.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem - 强制用户使用SSL:修改用户权限,要求其连接时使用SSL(如
app_user用户):ALTER USER 'app_user'@'localhost' REQUIRE SSL; - 验证SSL连接:使用
mysql命令指定--ssl-mode=REQUIRED参数连接,确认加密生效:mysql -u app_user -p --ssl-mode=REQUIRED
6. 配置防火墙限制访问
使用Linux防火墙(如ufw或firewalld)限制MySQL端口(默认3306)的访问,仅允许信任的IP地址或网段连接:
- 使用ufw(Ubuntu/Debian):
sudo ufw allow from trusted_ip to any port 3306/tcp # 替换trusted_ip为信任的IP sudo ufw enable - 使用firewalld(CentOS/RHEL):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="trusted_ip" port port="3306" protocol="tcp" accept' # 替换trusted_ip sudo firewall-cmd --reload
通过netstat -tuln | grep 3306或ss -tuln | grep 3306命令确认MySQL仅监听本地地址(127.0.0.1),避免公网暴露。
7. 启用日志记录与监控
开启MySQL的日志功能,记录数据库操作以便后续审计和排查安全事件:
- 错误日志:记录MySQL运行时的错误信息(默认开启),位置可通过
SHOW VARIABLES LIKE 'log_error';查看(通常为/var/log/mysql/error.log)。 - 通用查询日志:记录所有客户端连接和执行的SQL语句(生产环境谨慎开启,避免性能影响):
[mysqld] general_log = 1 general_log_file = /var/log/mysql/general.log - 慢查询日志:记录执行时间超过阈值的SQL语句(帮助优化性能,同时发现潜在攻击):
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow-queries.log long_query_time = 2 # 执行时间超过2秒的查询视为慢查询
修改配置后重启MySQL服务,定期检查日志文件,使用pt-query-digest等工具分析慢查询日志,及时发现异常操作(如大量SELECT *查询、频繁的登录失败尝试)。
8. 定期更新与安全审计
- 更新MySQL版本:及时安装MySQL官方发布的安全补丁,修复已知漏洞(如通过
sudo apt-get update & & sudo apt-get upgrade mysql-server更新Ubuntu系统上的MySQL)。 - 运行安全脚本:使用MySQL自带的
mysql_secure_installation工具进行初始安全配置(如设置root密码、删除匿名用户、禁止远程root登录等),适用于新安装的MySQL实例:sudo mysql_secure_installation - 定期安全审计:检查
my.cnf配置文件,确保没有不必要的权限设置(如未使用的端口、多余的bind-address配置);使用SELECT User, Host, authentication_string FROM mysql.user;查看用户列表,确认无多余或未使用的账户。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何配置Linux MySQL安全设置
本文地址: https://pptw.com/jishu/746709.html
