MySQL 和 MariaDB 是当前最流行的开源数据库之一,但默认安装后的安全配置往往存在诸多隐患。对 DBA 而言,筑牢数据库安全防线是基础工作,不仅能保护核心数据,也能提升整个 Linux 系统的防御能力。攻击者常将数据库视为重点目标,暴力破解 root 密码就是最常见的入侵手段之一。
下面 12 条经过实战检验的 MySQL/MariaDB 安全最佳实践,能帮助你有效加固数据库,抵御常见攻击。
1. 安全安装 MySQL:运行安全脚本
安装 MySQL 后第一件事就是执行安全安装脚本。这个脚本能帮你完成关键操作:
- 如果安装时未设置 root 密码,立即设定
- 删除允许从本地主机外部访问的 root 账户,彻底禁用远程 root 登录
- 清理匿名用户和测试数据库——默认情况下匿名用户也能访问它们
# mysql_secure_installation
运行上述命令后,设置 root 密码,并通过输入 [Yes/Y] 和回车键回答一系列问题。
安全安装 MySQL 的界面
2. 将数据库绑定到 Loopback 地址
通过配置绑定地址,限制 MySQL 只接受来自本地主机的连接,从源头阻止远程机器访问。编辑主配置文件即可:
# vi /etc/my.cnf [RHEL/CentOS] # vi /etc/mysql/my.conf [Debian/Ubuntu] # vi /etc/mysql/mysql.conf.d/mysqld.cnf [Debian/Ubuntu]
在 [mysqld] 部分加入这一行:
bind-address = 127.0.0.1
3. 禁用 MySQL 的 LOCAL INFILE
为了提高安全性,建议禁用 local_infile。在 [mysqld] 部分添加下面这行,防止 MySQL 直接访问底层文件系统:
local-infile=0
4. 修改 MySQL 默认端口
默认端口 3306 是自动扫描工具的重点目标,改掉它能让大量自动化攻击失效。在 [mysqld] 中设置:
Port=5000
5. 启用 MySQL 日志
日志是了解数据库运行状况的关键渠道,一旦遭遇攻击,也能从中发现入侵痕迹。在 [mysqld] 部分添加:
log=/var/log/mysql.log
6. 设置合适的 MySQL 文件权限
确保所有 MySQL 服务文件和数据路径的权限严格合理。例如 /etc/my.cnf 只能由 root 修改,防止其他用户篡改数据库配置:
# chmod 644 /etc/my.cnf
7. 清理 MySQL Shell 命令历史
MySQL shell 中执行的所有命令都会被保存在 ~/.mysql_history 文件中。这相当危险——你创建过哪些用户、输入过什么密码,都会被完整记录。
# cat /dev/null > ~/.mysql_history
8. 避免在命令行直接暴露密码
终端输入的每条命令都会进入 shell 历史文件(如 bash 的 ~/.bash_history)。攻击者一旦获取该文件,就能直接看到你输入的密码。强烈不建议像下面这样直接输密码:
# mysql -u root -ppassword_

使用密码连接 MySQL
查看命令行历史,就能看到之前输入的密码:
# history

查看命令行输入历史
正确的连接方式是这样的:
# mysql -u root -p Enter password:
9. 为每个应用创建专用数据库用户
服务器上运行的每个应用,都应分配一个与之对应的独立数据库用户。例如部署 WordPress 站点时,按如下方式创建专用用户:
# mysql -u root -p MariaDB [(none)]> CREATE DATABASE osclass_db; MariaDB [(none)]> CREATE USER 'osclassdmin'@'localhost' IDENTIFIED BY 'osclass@dmin%!2'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON osclass_db.* TO 'osclassdmin'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> exit
记得及时删除不再使用的数据库用户。
10. 启用额外的安全插件与库
MySQL 自带多种安全插件,例如客户端连接验证、密码强度校验、敏感信息加密存储等,这些功能在免费版本中即可使用。更多信息可参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/security-plugins.html
11. 定期更换 MySQL 密码
密码定期更新是信息安全的基本要求,具体周期由内部安全策略决定。定期换密码能有效阻止长期蹲点、试图猜解密码的攻击者:
MariaDB [(none)]> USE mysql;
MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
12. 定期更新 MySQL 服务器软件包
强烈建议从官方仓库定期更新 MySQL/MariaDB 软件包,以获取最新的安全补丁和错误修复。操作系统默认仓库中的版本通常较旧。
# yum update # apt update
对 MySQL/MariaDB 做任何修改之后,别忘了重启服务:
# systemctl restart mariadb # RHEL/CentOS # systemctl restart mysql # Debian/Ubuntu
