介绍
在Linux和类Unix系统上有许多SQL数据库语言的实现。 MySQL和MariaDB是在服务器环境中部署关系数据库的两个流行选项。 然而,像大多数软件一样,如果配置不正确,这些工具可能是安全责任。本教程将指导您完成一些基本步骤,以确保您的MariaDB或MySQL数据库的安全,并确保它们不是您的VPS的开放。 为了简化和说明,我们将在Ubuntu 12.04 VPS实例上使用MySQL服务器。但是,这些技术可以应用于其他Linux发行版,也可以与MariaDB一起使用。
初始设置
MySQL让您有机会在安装过程中走向安全的第一步。它将请求您设置root密码。
sudo apt-get install mysql-server
?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
? While not mandatory, it is highly recommended that you set a password for the ?
? MySQL administrative "root" user. ?
? ?
? If this field is left blank, the password will not be changed. ?
? ?
? New password for the MySQL "root" user: ?
? ?
? _______________________________________________________________________________ ?
? ?
? ?
? ?
???????????????????????????????????????????????????????????????????????????????????
您可以随时设置root密码,但没有理由跳过此步骤,因此您应该从头开始保护您的管理员帐户。 一旦安装完成,我们应该运行一些包含的脚本。首先,我们将使用“mysql_install_db”脚本为我们的数据库创建目录布局。
sudo mysql_install_db
接下来,运行名为“mysql_secure_installation”的脚本。这将指导我们通过一些过程,将删除一些危险在生产环境中使用的默认值。
sudo mysql_secure_installation
它将首先提示您输入在安装过程中设置的根密码。紧接着,您将被询问一系列问题,首先是否要更改root密码。 这是另一个将您的密码更改为安全的机会(如果您还没有这样做的话)。 您应该对所有剩余的问题回答“Y”(对于是)。 这将删除任何人默认登录MySQL的能力,使用管理员帐户远程禁用日志记录,删除一些不安全的测试数据库,并更新运行的MySQL实例以反映这些更改。
安全注意事项
保护MySQL(和几乎任何其他系统)的首要主题是只有在绝对必要时才授予访问权限。您的数据安全有时来自方便和安全之间的平衡。 在本指南中,我们将侧重于安全性,虽然您对数据库软件的具体使用可能会引导您选择这些选项。
安全通过My.cnf文件
MySQL的主配置文件是一个名为“my.cnf”的文件,它位于Ubuntu上的“/etc/mysql/”目录中,还有一些其他VPS上的“/etc/”目录。 我们将更改此文件中的一些设置以锁定我们的MySQL实例。 以root权限打开文件。如果您在不同的系统上使用本教程,请根据需要更改目录路径:
sudo nano /etc/mysql/my.cnf
我们应该检查的第一个设置是“[mysqld]”部分中的“绑定地址”设置。此设置应设置为本地环回网络设备,即“127.0.0.1”。
bind-address = 127.0.0.1
这确保MySQL不接受来自任何地方的连接,除了本地机器。 如果需要从另一台计算机访问此数据库,请考虑通过SSH连接,以便在本地进行数据库查询和管理,并通过ssh通道发送结果。 接下来我们要修补的是一个允许从MySQL中访问底层文件系统的函数。这可能有严重的安全隐患,应该关闭,除非你绝对需要它。 在文件的同一部分,我们将添加一个指令来禁用加载本地文件的能力:
local-infile=0
这将禁止从文件系统加载文件,而不具有数据库的文件级权限。 如果我们有足够的空间,并且没有操作一个巨大的数据库,记录其他信息以保持对可疑活动的注意是有帮助的。 记录太多可能会造成性能影响,所以这是你需要仔细权衡的东西。 您可以在我们添加到的“[mysqld]”部分中设置日志变量。
log=/var/log/mysql-logfile
确保MySQL日志,错误日志和mysql日志目录不是世界可读的:
sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm 0 Jul 23 18:06 /var/log/mysql.log
/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log
从内部保护MySQL
在使用MySQL提高安全性时,您可以采取多个步骤。 我们将把本节中的命令输入到MySQL提示界面,因此我们需要登录。
mysql -u root -p
系统将要求您提供先前设置的root密码。
保护密码和主机关联
首先,确保没有用户在MySQL中没有密码或主机关联:
SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user | % | |
| root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)
可以看到,在我们的示例设置中,用户“demo-user”没有密码,并且无论他在什么主机上都是有效的。这是非常不安全。 我们可以使用此命令为用户设置密码。变“
新密码 ”,以反映要分配的密码。
UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";
如果我们再次检查User表,我们将看到演示用户现在有一个密码:
SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user | % | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root | ::1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)
如果你查看“主机”字段,你会看到我们还有一个“%”,这是一个通配符,意味着任何主机。这不是我们想要的。让我们把它改为“localhost”:
UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";
如果我们再次检查,我们可以看到User表现在已经设置了适当的字段。
SELECT User,Host,Password FROM mysql.user;
如果我们的表包含任何空白用户(它不应该在这一点,因为我们运行“mysql_secure_installation”,但我们将覆盖这一点),我们应该删除它们。 为此,我们可以使用以下调用从访问表中删除空白用户:
DELETE FROM mysql.user WHERE User="";
在完成修改User表之后,我们需要输入以下命令来实现新的权限:
FLUSH PRIVILEGES;
实现特定于应用程序的用户
类似于在Linux中作为孤立用户运行进程的实践,MySQL从同样的隔离中受益。 使用MySQL的每个应用程序应该有自己的用户,只有有限的权限,只能访问它需要运行的数据库。 当我们配置一个新的应用程序使用MySQL,我们应该创建该应用程序所需的数据库:
create database testDB;
Query OK, 1 row affected (0.00 sec)
接下来,我们应该创建一个用户来管理该数据库,并为它分配所需的权限。这将因应用程序而异,一些用途需要比其他用户更多的开放权限。 要创建新用户,请使用以下命令:
CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';
我们可以使用以下命令为新表授予新用户权限。参见教程
如何在MySQL中创建一个新用户并授予权限 ,以了解具体的权限:
GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';
例如,如果我们以后需要从帐户撤销更新权限,我们可以使用以下命令:
REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';
如果我们需要某个数据库的所有权限,我们可以使用以下命令指定:
GRANT ALL ON testDB.* TO 'demo-user'@'localhost';
要显示用户的当前权限,我们首先必须实现我们使用“flush privileges”命令指定的权限。然后,我们可以查询授予用户的权限:
FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost' |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
完成更改后,始终刷新权限。
更改根用户
您可能想要采取的另一个步骤是更改根登录名。如果攻击者试图访问根MySQL登录,他们将需要执行查找用户名的附加步骤。 可以使用以下命令更改根登录名:
rename user 'root'@'localhost' to 'newAdminUser'@'localhost';
我们可以通过使用我们用于User数据库的相同查询来查看更改:
select user,host,password from mysql.user;
同样,我们必须刷新这些更改发生的权限:
FLUSH PRIVILEGES;
记住,当您希望执行管理任务时,您将必须以从现在开始的新创建的用户名登录MySQL:
mysql -u newAdminUser -p
结论
虽然这绝不是MySQL和MariaDB安全实践的详尽列表,但它应该为您在保护数据库时作出的各种决策提供良好的介绍。 有关配置和安全性的更多信息可以在MySQL和MariaDB网站以及各自的手册页中找到。您选择使用的应用程序也可能提供安全建议。