七步让您的MySQL服务器更安全

译者 | 陈峻
不知您是否发现一种现象,那些初学渗透测试的人员往往过于关注应用的安全性,而对数据库的安全性不太重视 。他们殊不知,没有数据库的配置与安全测试,应用的安全性也就无法得到充分的验证 。在此,我将以最常见的数据库管理系统——MySQL为例,向您介绍如何通过七步骤来安全加固数据库服务器 。
1、使用SSH隧道代替远程连接默认情况下,MySQL服务运行在3306号端口上 。在安装MySQL时,您会注意到3306号端口持续对所有连接都进行侦听 。就目前而言,由于MySQL的端口是对外开放的,因此您应该将MySQL的服务设置为,仅侦听本机地址的模式 。
由于服务器通常是运行在linux的各种发行版上的,因此下面我将选取基于Debian发行版来进行演示 。首先,为了使用SSH隧道,而不是远程连接,您需要在/etc/mysql/my.cnf文件中,关闭由内向外的默认端口 。在该文件中,您需要开启一个名为[mysqld]的字段,并输入如下命令:
【七步让您的MySQL服务器更安全】复制
[mysqld]
bind-address=127.0.0.1
完成之后,请不要忘记保存该文件,并使用如下命令去重新启动该服务:
复制
sudo systemctl restart mysqld
# or
sudo systemctl restart mariadb.service
至此,MySQL服务将只会监听本机地址了 。如果您使用的是MariaDB,那么可以查看/etc/mysql/mariadb.conf.d/50-server.cnf,并检查是否有关于bind-address的定义 。

七步让您的MySQL服务器更安全

文章插图
至此,您已将绑定地址设置为127.0.0.1,即localhost 。您可以运行Nmap进行扫描,并能检查到如下输出:
七步让您的MySQL服务器更安全

文章插图
由于127.0.0.1代表了本地主机,因此您可以看到MySQL的端口 。现在,您可以尝试着再次更改绑定的地址,以确保其已经生效:
复制
[mysqld]
bind-address=127.5.5.
七步让您的MySQL服务器更安全

文章插图
在保存了/etc/mysql/my.cnf文件,并重启了MySQL服务后,您可以再次执行Nmap扫描 。此时,您应该不会在本地主机上再看到该绑定地址了 。
七步让您的MySQL服务器更安全

文章插图
在确认了此类修改是奏效的后,请不要忘了回到第一步的设置中,将绑定地址改回127.0.0.1,并再次保存 。
2、设置本地文件访问的屏障MySQL默认可以与本地文件系统通信 。例如,通过使用查询,您可以在本地文件系统中,查看到文本内容,并将查询结果写到磁盘上 。而为了防止恶意攻击者使用此功能,您必须阻止MySQL直接与本地文件系统进行通信 。
在实践中,您可以使用名为local-infile的函数,来采取预防措施 。例如,假设您有一个名为“/etc/secretfile.txt”的文件,并且您在该文件中存放了密码 。那么,如果您的/etc/mysql/my.cnf文件中的local-infile函数值在为1时,就意味着访问权限是开启的 。您可以基于此去检查secretfile.txt文件 。
七步让您的MySQL服务器更安全

文章插图
出于验证目的,您可以使用如下命令连接到MySQL上,并检查其是否可以看到
复制
secretfile.txt文件:
SELECT LOAD_FILE("/etc/secretfile.txt");
七步让您的MySQL服务器更安全

文章插图
不难看出,它成功地捕获了计算机上的文件信息 。如下所示,请更改/etc/mysql/my.cnf文件中的local-infile值:
复制
[mysqld]
local-infile=0
七步让您的MySQL服务器更安全

文章插图
请重启MySQL服务,并重新连接MySQL 。再次执行上述步骤,您会发现自己已不能看到文件内容了 。
当然,如果用户本身就没有对本地文件的读写权限,那么他们同样无法看到该文件 。不过,这不应该成为您忽略的理由 。它仍然是您应该在渗透测试和数据库安全性中需要检查的内容之一 。
3、设置应用用户和密码值得注意的是,数据库的管理用户和访问数据库的MySQL用户必须互不相同 。换句话说,如果您直接使用root用户,将应用连接到MySQL上,则是极其危险的 。如果可能的话,请定义那些无法单独执行UPDATE或INSERT操作的用户,并分配给应用 。
除了用户,我们再来考虑用户的密码 。与其他领域类似,MySQL用户的密码也需要具有复杂且不可预测的特性 。如果您在此方面缺乏经验的话,可以使用现成的密码生成器系统 。


推荐阅读