MySQL在Linux系统中的安全性如何保障
导读:MySQL 在 Linux 上的安全性保障清单 一 操作系统与账号安全 使用专用的 mysql 系统账号运行服务,禁止以 root 运行;检查与整改命令:ps -ef | grep mysqld,确保进程属主为 mysql。 将 data...
MySQL 在 Linux 上的安全性保障清单
一 操作系统与账号安全
- 使用专用的 mysql 系统账号运行服务,禁止以 root 运行;检查与整改命令:
ps -ef | grep mysqld,确保进程属主为 mysql。 - 将 datadir 放在非系统分区,避免系统盘满导致 DoS;检查:
SHOW VARIABLES LIKE 'datadir';与df -h < datadir>。 - 清理或禁用敏感历史与环境变量:删除或链接 ~/.mysql_history 到 /dev/null,并清除或禁用 MYSQL_PWD 的使用。
- 禁止 mysql 系统账号登录系统(仅用于运行服务):
usermod -s /usr/sbin/nologin mysql。 - 配置文件权限最小化:
chmod 644 /etc/my.cnf /etc/mysql/*,仅 root 可写。 - 及时更新到包含漏洞修复的最新稳定版本,降低被已知漏洞利用的风险。
二 网络与访问控制
- 默认禁用远程 root 登录,仅允许本地或受控网段访问;执行:
ALTER USER 'root'@'%' IDENTIFIED BY 'StrongPass!' WITH MAX_USER_CONNECTIONS 0; DROP USER 'root'@'%';(按需保留root@localhost)。 - 绑定到回环地址或内网地址:在
[mysqld]中设置bind-address=127.0.0.1(仅本机)或内网 IP,减少暴露面。 - 仅开放必要端口(默认 3306),并配合 iptables/ufw 限制来源;必要时可修改端口为非默认以降低自动化扫描命中率,但仅靠改端口不构成可靠防护。
- 禁用或限制
LOAD DATA LOCAL INFILE防止读取服务器本地敏感文件:在[mysqld]设置local-infile=0,并在客户端连接时避免使用该功能。 - 按“最小权限”为应用创建专属账号并限制来源主机,例如:
CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'Str0ng!'; GRANT SELECT,INSERT,UPDATE,DELETE ON app.* TO 'app'@'10.0.1.%'; FLUSH PRIVILEGES;。 - 删除匿名用户与测试库:
DROP USER ''@'localhost'; DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;。 - 初次部署建议运行
mysql_secure_installation完成上述基础加固。
三 数据库与文件权限加固
- 数据目录与系统库目录权限最小化:确保属主为 mysql:mysql,权限不高于 750/700;检查:
SHOW VARIABLES LIKE 'datadir';与ls -ld < datadir> /var/lib/mysql。 - 日志文件权限:将 error log、slow query log、general log、binlog 等设置为 660 并属主 mysql:mysql,防止信息泄露与篡改。
- 密钥与插件目录:私钥/证书 400,插件目录 755,均属主 mysql:mysql,避免被替换或加载恶意插件。
- 配置文件与目录:仅 root 可读写,禁止其他用户编辑;定期审计异常权限变更。
四 认证加密与审计监控
- 启用 SSL/TLS 加密传输,强制管理员与敏感账号使用加密连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'StrongPass!' REQUIRE SSL;(MySQL 8.0 默认使用caching_sha2_password,可按需调整)。 - 使用更强的密码策略与定期轮换;可结合安全插件(如 validate_password、连接控制插件)提升口令强度与暴力防护能力。
- 开启必要日志以便审计与取证:错误日志必开;可按需开启 general_log、slow_query_log;确保日志文件权限为 660 且属主 mysql:mysql。
- 备份与恢复演练:定期做全量/增量备份,保留离线副本并验证可恢复性,以应对勒索或误操作。
五 快速加固命令示例
- 基础安全初始化
mysql_secure_installation(设置 root 口令、禁远程 root、删匿名与 test 库)
- 网络与访问控制
- 仅本地:
echo "bind-address=127.0.0.1" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf & & sudo systemctl restart mysql - 禁远程 root:
mysql -u root -p -e "DROP USER 'root'@'%'; FLUSH PRIVILEGES; " - 限制来源与最小权限:
mysql -u root -p -e "CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'Str0ng!'; GRANT SELECT,INSERT,UPDATE,DELETE ON app.* TO 'app'@'10.0.1.%'; FLUSH PRIVILEGES; " - 防火墙(UFW):
sudo ufw allow 3306/tcp;如需改端口,先改配置再放行新端口并重启
- 仅本地:
- 禁用 LOCAL INFILE
echo "local-infile=0" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf & & sudo systemctl restart mysql
- 历史与环境变量清理
rm -f ~/.mysql_history & & ln -s /dev/null ~/.mysql_historygrep -l MYSQL_PWD /proc/*/environ 2> /dev/null || echo "MYSQL_PWD not found"(发现后清理来源脚本)
- 文件权限与属主
sudo chown -R mysql:mysql /var/lib/mysql /var/log/mysql /etc/mysqlsudo find /var/lib/mysql /var/log/mysql -type f -exec chmod 660 { } \;sudo chmod 644 /etc/my.cnf /etc/mysql/*.cnf
- 启用 SSL 示例
mysql -u root -p -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'StrongPass!' REQUIRE SSL; FLUSH PRIVILEGES; "
- 版本与补丁
- Debian/Ubuntu:
sudo apt-get update & & sudo apt-get upgrade mysql-server - RHEL/CentOS:
sudo yum update mysql-server或sudo dnf upgrade mysql-server
- Debian/Ubuntu:
- 备份示例(逻辑)
mysqldump -u backup -p --single-transaction --routines --triggers --databases app db1 > backup_$(date +%F).sql- 定期将备份文件传至离线存储并做恢复演练
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: MySQL在Linux系统中的安全性如何保障
本文地址: https://pptw.com/jishu/748181.html
