通过这 7 个步骤让您的 MySQL 服务器更安全

小安小安 in 安全 2022-12-03 22:20:21

您如何确保您的 MSQL 数据库免受黑客攻击?借助这份方便的清单,采取万全之策。

特别是初学者渗透测试人员通常不太重视数据库安全性。没有数据库配置和安全测试的应用程序是不安全的。您可能已经在使用 MySQL 软件,这是一种数据库管理系统,那么如何才能使它更安全呢?以下是您需要遵循的七个步骤。

1.使用 SSH 隧道代替远程连接

默认情况下,MySQL 服务在端口 3306 上运行。当你安装 MySQL 时,你会看到端口 3306 对所有连接都处于侦听模式。就目前而言,MySQL 端口是对外开放的。这就是为什么您应该将 MySQL 服务设置为仅侦听本地地址。

由于服务器通常在 Linux 发行版上运行,因此下面的示例基于 Debian 发行版。您需要用于 SSH 隧道而不是远程连接并关闭与外界的默认端口的文件是/etc/mysql/my.cnf。在这个文件中,您需要打开一个名为[mysqld]的字段并编写以下命令:


[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 的定义。
setting-bind-address-in-mysql-configuration-file
现在您已将绑定地址设置为 127.0.0.1,即 localhost,您可以运行 Nmap 扫描并检查输出:
Using-nmap-to-check-bind-address-setting
您可以看到 MySQL 端口,因为 127.0.0.1 代表您看到的本地主机。您可以尝试再次更改绑定地址以确保其有效:


[mysqld]
bind-address=127.5.5.1

checking-with-nmap-scan-by-changing-bind-address
然后保存/etc/mysql/my.cnf 文件,重启 MySQL 服务。如果你在这个阶段再次执行 Nmap 扫描,你应该不会在本地主机上看到这个绑定地址。
Unable-to-access-localhost-with-bind-address-parameter
一旦你知道这是有效的,回到第一步的设置并将绑定地址设置回 127.0.0.1 并再次保存。

2.设置本地文件访问屏障

MySQL 可以与本地文件系统通信。使用查询,您可以在本地文件系统中查看文本内容或将查询结果刻录到磁盘。为防止恶意攻击者使用此功能,您必须阻止 MySQL 与本地文件系统通信。

您可以使用名为 local-infile 的函数来采取预防措施。例如,假设您有一个名为“/etc/secretfile.txt”的文件,并且您在该文件中有一个密码。如果你的/etc/mysql/my.cnf 文件中的 local-infile 函数的值为 1,那么访问就打开了。因此您可以访问 secretfile.txt 文件。
Configuration-file-with-local-infile-function-turned-on
local-infile 函数的值为 1。重新启动 MySQL 数据库以使更改生效。现在,使用以下命令连接到 MySQL 并检查是否可以看到 secretfile.txt 文件:


SELECT LOAD_FILE("/etc/secretfile.txt");

view-file-content-via-MySQL
捕获计算机上任何文件中的信息并不困难。

要解决此问题,请更改 /etc/mysql/my.cnf 文件中的 local-infile 值,如下所示:


[mysqld]
local-infile=0

Contents-of-configuration-file-with-local-infile-closed
重新启动 MySQL 服务。重新连接 MySQL,重复上一步;您应该无法再看到文件内容。

如果用户还没有对本地文件的读写权限,他们将无法看到该文件。但是,它仍然是您应该在渗透测试和数据库安全性中检查的内容。

3.设置应用用户和密码

数据库管理用户和访问数据库的 MySQL 用户必须互不相同。换句话说,使用 root 用户将应用程序连接到 MySQL 是极其危险的。如果可能,请定义不单独执行 UPDATE 或 INSERT 操作的应用程序的用户。

此时要考虑的另一件事是用户密码。与几乎所有领域一样,MySQL 用户的密码需要复杂且不可预测。如果您需要这方面的帮助,可以使用很棒的密码生成器系统。

4.删除匿名用户

默认情况下安装 MySQL 时,会出现一些匿名用户。您需要删除这些并阻止他们访问。对于安全的 MySQL 服务器,您不应从以下查询中得到任何响应:


SELECT * FROM mysql.user WHERE USER="";
# Example Output
Empty set (0.001 sec)

如果有任何结果,您应该删除这些匿名用户。例如,如果在名为“localhost”的环境中有一个名为“anonuser”的匿名帐户,则必须使用如下命令删除此帐户:


DROP USER 'anonuser'@'localhost';

5.检查 MySQL 本地文件权限

假设您是一名数据库管理员,您想要返回一周前的数据。在这种情况下,您可能必须通过 SSH 连接到数据库服务器并更改所需的 MySQL 文件。在执行此操作时,您可能已经使用了 Linux 的 root 用户权限;也就是说,数据文件的所有权和权限可以更改。你不想要那个。

查看 /var/lib/mysql 目录以检查授予的权限。这里需要检查的是所有文件的所有者是否是 MySQL 用户。以下命令可以解决问题:


sudo ls -al /var/lib/mysql

Checking-permissions-of-mysql-user-groups
文件的读写权限应该只给 MySQL 用户。其他用户不应该有任何权限。

6.使用 MySQL SSL

思考具体示例是理解 MySQL 和 SSL 用法的最佳方式。想象一下,在 ABC 地区,有许多不同的服务器,其中一台服务器被恶意黑客接管了。黑客将在 ABC 区域进行内部扫描。通过这种方式,他们收集有关服务器的信息。

如果他们在此过程中检测到 MySQL 服务器,他们可以对目标服务器执行中间人 (MitM) 攻击,这意味着他们可以窃取连接到该服务器的应用程序和用户的会话信息。避免这种情况的最佳方法之一是在 MySQL 服务器上启用 SSL。

7.日志和历史文件

您使用 MySQL 日志来分析和查找错误。您可以通过输入 my.cnf 来编辑这些日志的保存位置,如下所示:


# /etc/mysql/my.cnf
[mysqld]
log =/var/log/mylogfiles

您可以根据需要更改 mylogfiles 名称或位置。您还需要检查一份文件。当您在 Linux 终端中连接到 MySQL 服务器并键入各种命令时,这些查询将保存在 mysql_history 文件中。如果运行以下命令,您可以在 MySQL 终端中看到您正在使用的查询:


cat ~/.mysql_history

如果您不想提供有关您在服务器内部进行的查询类型的信息,则需要删除此文件的内容。使用以下命令删除文件内容:


sudo echo "cleaned" > ~/.mysql_history

然后您可以再次检查文件内容。

谁拥有数据库,谁就拥有系统

无论您在哪个行业工作,您的数据库始终包含重要信息。这可以是您的客户、银行帐户和密码。恶意攻击者知道这些的重要性和价值。数据库开发人员和管理员至少需要了解他们将在渗透测试中遇到的基础知识,才能打败黑客。

-- End --