浅谈12 条用于 Linux 的 MySQL/MariaDB 安全最佳实践
MySQL 无疑是开源数据库领域的标杆,而它的分支 MariaDB 近年来增长势头也相当强劲。不过,装好 MySQL 之后,默认配置可谈不上安全——确保数据库安全,是每个 DBA 的基本功。这么做不仅能保护数据库本身,也能提升整个 Linux 系统的安全水平,毕竟攻击者总是无孔不入,数据库更是他们眼
MySQL 无疑是开源数据库领域的标杆,而它的分支 MariaDB 近年来增长势头也相当强劲。不过,装好 MySQL 之后,默认配置可谈不上安全——确保数据库安全,是每个 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 是默认的 TCP 监听端口,改掉它能让很多自动化扫描工具失效。在 [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. 不要在命令行中运行 MySQL 命令
终端里输入的所有命令都会被 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 Server 包
强烈建议从官方仓库定期更新 MySQL/MariaDB 包,以获取最新的安全补丁和错误修复。操作系统默认仓库里的版本往往比较老旧。
# yum update # apt update
对 MySQL/MariaDB 做任何修改之后,别忘了重启服务:
# systemctl restart mariadb # RHEL/CentOS # systemctl restart mysql # Debian/Ubuntu

































