1. 安装与初始安全配置
在Ubuntu上安装MySQL时,优先通过官方APT仓库获取最新版本(sudo apt update && sudo apt install mysql-server),避免使用第三方源的旧版本。安装完成后,必须运行sudo mysql_secure_installation脚本,该脚本会引导完成以下关键操作:设置root用户强密码(拒绝空密码)、删除匿名用户(防止未授权访问)、禁止root远程登录(降低远程攻击风险)、删除测试数据库(避免被恶意利用)。
2. 用户权限精细化管理
遵循“最小权限原则”创建用户并授予权限:
localhost而非%),例如:CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';SELECT、INSERT而非ALL PRIVILEGES),例如:GRANT SELECT, INSERT ON mydb.* TO 'app_user'@'localhost';SHOW GRANTS FOR 'user'@'host'),及时撤销不再需要的权限(REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host');DROP USER 'old_user'@'localhost'),避免权限滥用。3. 网络访问严格控制
/etc/mysql/mysql.conf.d/mysqld.cnf),将bind-address设置为127.0.0.1(仅允许本地访问),若需远程访问则设置为特定IP(如bind-address = 192.168.1.100);ufw限制MySQL端口(默认3306)的访问,仅允许可信IP通过,例如:sudo ufw allow from 192.168.1.100 to any port 3306;UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;)。4. 数据传输加密保护
启用SSL/TLS加密MySQL客户端与服务器之间的数据传输,步骤如下:
sudo mysql_ssl_rsa_setup --uid=mysql;my.cnf中添加):[mysqld] ssl-ca=/etc/mysql/ssl/ca.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem;GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' REQUIRE SSL;);SHOW STATUS LIKE 'Ssl_cipher',若返回非空值则表示加密成功)。5. 定期数据备份与恢复验证
制定合理的备份策略,确保数据可恢复:
mysqldump工具定期备份数据库(如每周全备+每日增量),例如:mysqldump -u root -p --all-databases > full_backup_$(date +%F).sql;rsync或专业工具(如Percona XtraBackup)备份数据目录(/var/lib/mysql),需注意备份时停止写入(FLUSH TABLES WITH READ LOCK;);mysql -u root -p mydb < backup.sql恢复到测试环境,检查数据是否一致)。6. 系统与日志监控强化
sudo apt update && sudo apt upgrade mysql-server,安装最新安全补丁,修复已知漏洞;my.cnf中配置日志(如general_log = 1、slow_query_log = 1、log_error = /var/log/mysql/error.log),记录查询、错误和慢查询信息;chmod和chown设置日志文件权限(如sudo chown mysql:mysql /var/log/mysql/error.log、sudo chmod 640 /var/log/mysql/error.log),仅允许root和mysql用户访问;fail2ban、Prometheus+Granafa)监控日志,及时发现暴力破解、异常查询等安全事件。7. 其他高级安全措施
my.cnf中设置local-infile = 0,防止通过LOAD DATA LOCAL INFILE命令读取本地文件(避免SQL注入攻击);port = 3307),减少自动化工具的扫描攻击(需同步修改防火墙规则);SET GLOBAL validate_password.policy = MEDIUM;(或ENFORCE)和SET GLOBAL validate_password.length = 12;启用密码强度检查,强制用户设置复杂密码(包含大小写字母、数字、特殊字符);my.cnf中的chroot参数(如[mysqld] chroot = /chroot/mysql),将MySQL进程限制在特定目录,限制其对系统文件的访问。