1. 运行安全初始化脚本
安装MySQL后,首要步骤是执行mysql_secure_installation脚本,完成基础安全配置:设置root用户强密码(包含大小写字母、数字和特殊字符,长度≥12位)、删除匿名用户(防止未授权访问)、禁止root远程登录(降低远程攻击风险)、删除测试数据库(避免敏感信息泄露),最后刷新权限使更改生效。
2. 强化用户权限管理
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'ComplexPass123!')。GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'localhost'),避免过度授权。SHOW GRANTS FOR 'app_user'@'localhost';查看用户权限,及时撤销不再需要的权限(如REVOKE DROP ON *.* FROM 'app_user'@'localhost';)。3. 配置网络访问控制
/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address从0.0.0.0(允许所有IP连接)改为127.0.0.1(仅允许本地连接),减少远程攻击面。ufw(Uncomplicated Firewall)仅允许必要端口(如SSH的22端口、MySQL的3306端口)的流量:sudo ufw allow 22/tcp && sudo ufw allow 3306/tcp && sudo ufw enable。UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;。4. 启用数据传输加密
为防止数据在传输过程中被窃取或篡改,配置MySQL使用SSL/TLS加密:
openssl genpkey -algorithm RSA -out /etc/mysql/ssl/mysql_private.key -aes256 && openssl req -new -key /etc/mysql/ssl/mysql_private.key -out /etc/mysql/ssl/mysql_csr.csr && openssl x509 -req -days 365 -in /etc/mysql/ssl/mysql_csr.csr -signkey /etc/mysql/ssl/mysql_private.key -out /etc/mysql/ssl/mysql_certificate.crt。/etc/mysql/mysql.conf.d/mysqld.cnf的[mysqld]部分添加ssl-ca=/etc/mysql/ssl/mysql_certificate.crt、ssl-cert=/etc/mysql/ssl/mysql_certificate.crt、ssl-key=/etc/mysql/ssl/mysql_private.key。sudo systemctl restart mysql,并通过SHOW VARIABLES LIKE '%ssl%';验证SSL是否启用。5. 定期更新与补丁管理
保持MySQL及系统软件包为最新版本,及时修补已知安全漏洞:
sudo apt update。sudo apt upgrade mysql-server。sudo apt install unattended-upgrades && sudo dpkg-reconfigure unattended-upgrades,确保系统自动安装安全补丁。6. 日志管理与监控
启用日志记录以跟踪数据库活动,便于及时发现异常行为:
/etc/mysql/mysql.conf.d/mysqld.cnf中添加general_log = 1、general_log_file = /var/log/mysql/mysql-query.log,记录所有执行的SQL语句。slow_query_log = 1、slow_query_log_file = /var/log/mysql/mysql-slow.log、long_query_time = 2(记录执行时间超过2秒的查询),帮助优化查询性能并发现潜在攻击。tail -f /var/log/mysql/mysql-query.log实时查看日志,或通过grep命令筛选异常操作(如grep "DROP" /var/log/mysql/mysql-query.log)。7. 禁用危险功能
关闭MySQL中不必要的功能,降低安全风险:
/etc/mysql/mysql.conf.d/mysqld.cnf的[mysqld]部分添加local-infile = 0,防止用户通过LOAD DATA LOCAL INFILE命令读取服务器本地文件。sql_safe_updates = 1,要求DELETE或UPDATE语句必须包含WHERE条件,避免误操作导致数据丢失。8. 定期数据备份
通过定期备份确保数据可恢复,应对数据丢失或勒索软件攻击:
mysqldump工具备份数据库:mysqldump -u root -p --all-databases > /backup/mysql_all_databases_$(date +%F).sql。