MySQL 在 Linux 上的安全性保障清单
一 操作系统与账号安全
ps -ef | grep mysqld,确保进程属主为 mysql。SHOW VARIABLES LIKE 'datadir'; 与 df -h <datadir>。usermod -s /usr/sbin/nologin mysql。chmod 644 /etc/my.cnf /etc/mysql/*,仅 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,减少暴露面。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 完成上述基础加固。三 数据库与文件权限加固
SHOW VARIABLES LIKE 'datadir'; 与 ls -ld <datadir> /var/lib/mysql。四 认证加密与审计监控
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'StrongPass!' REQUIRE SSL;(MySQL 8.0 默认使用 caching_sha2_password,可按需调整)。五 快速加固命令示例
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 mysqlmysql -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;"sudo ufw allow 3306/tcp;如需改端口,先改配置再放行新端口并重启echo "local-infile=0" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf && sudo systemctl restart mysqlrm -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/*.cnfmysql -u root -p -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'StrongPass!' REQUIRE SSL; FLUSH PRIVILEGES;"sudo apt-get update && sudo apt-get upgrade mysql-serversudo yum update mysql-server 或 sudo dnf upgrade mysql-servermysqldump -u backup -p --single-transaction --routines --triggers --databases app db1 > backup_$(date +%F).sql