1. 修改默认配置文件限制访问
编辑MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),修改以下两项:
bind-address设置为127.0.0.1,限制MySQL仅监听本地连接,避免暴露在公网;skip-name-resolve,防止MySQL通过DNS解析主机名,提升连接性能并减少DNS欺骗风险。sudo systemctl restart mysql。2. 强化root账户安全
ALTER USER命令为root用户设置包含大小写字母、数字和特殊字符的强密码(长度不低于12位):ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!';
FLUSH PRIVILEGES;
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;
-- 全局设置(需修改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_ssl_rsa_setup工具生成自签名证书(生产环境建议使用CA颁发的证书):sudo mysql_ssl_rsa_setup --datadir=/etc/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
app_user用户):ALTER USER 'app_user'@'localhost' REQUIRE SSL;
mysql命令指定--ssl-mode=REQUIRED参数连接,确认加密生效:mysql -u app_user -p --ssl-mode=REQUIRED
6. 配置防火墙限制访问
使用Linux防火墙(如ufw或firewalld)限制MySQL端口(默认3306)的访问,仅允许信任的IP地址或网段连接:
sudo ufw allow from trusted_ip to any port 3306/tcp # 替换trusted_ip为信任的IP
sudo ufw enable
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的日志功能,记录数据库操作以便后续审计和排查安全事件:
SHOW VARIABLES LIKE 'log_error';查看(通常为/var/log/mysql/error.log)。[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log
[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. 定期更新与安全审计
sudo apt-get update && sudo apt-get upgrade mysql-server更新Ubuntu系统上的MySQL)。mysql_secure_installation工具进行初始安全配置(如设置root密码、删除匿名用户、禁止远程root登录等),适用于新安装的MySQL实例:sudo mysql_secure_installation
my.cnf配置文件,确保没有不必要的权限设置(如未使用的端口、多余的bind-address配置);使用SELECT User, Host, authentication_string FROM mysql.user;查看用户列表,确认无多余或未使用的账户。