本教程的早期版本由Melissa Anderson编写

介绍

MongoDB,也称为_Mongo_,是一种用于许多现代web应用程序的开源文档数据库。它被归类为NoSQL数据库,因为它不依赖于传统的基于表的关系数据库结构。相反,它使用类似JSON的文档和动态模式。

默认情况下,MongoDB没有启用身份验证,这意味着任何可以访问安装数据库的服务器的用户都可以不受限制地添加和删除数据。为了保护此漏洞,本教程将引导您创建管理用户并启用身份验证。然后,您将测试以确认只有该管理用户可以访问数据库。

先决条件

要完成本教程,您需要以下内容:

  • 运行Ubuntu 18.04的服务器。该服务器应该有一个非root管理用户和一个配置了UFW的防火墙。按照我们的Ubuntu 18.04初始服务器安装指南进行设置。

  • MongoDB安装在您的服务器上。本教程使用MongoDB版本4.4进行了验证,但通常也适用于旧版本的MongoDB。要在您的服务器上安装Mongo,请遵循我们的教程How To install MongoDB on Ubuntu 18.04。

步骤1-添加管理用户

自3.0版发布以来,MongoDB守护进程被配置为仅接受来自本地Unix套接字的连接,并且不会自动向更广泛的Internet开放。但是,默认情况下仍然禁用身份验证。这意味着任何可以访问安装MongoDB的服务器的用户也可以完全访问数据库。

作为保护此漏洞的第一步,您将创建一个管理用户。稍后,您将启用身份验证并作为该管理用户连接以访问数据库。

要添加管理用户,必须首先连接到Mongo shell。由于已禁用身份验证,因此可以使用mongo命令执行此操作,而无需任何其他选项:

mongo

Mongo shell提示符上方会有一些输出。由于您尚未启用身份验证,这将包括一个警告,即未为数据库启用访问控制,并且对数据和数据库配置的读写访问不受限制:

OutputMongoDB shell version v4.4.1
. . . 
2020-10-06T15:08:11.202+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
. . .
> 

启用身份验证后,此警告将消失,但目前这意味着任何可以访问您的Ubuntu服务器的人也可以控制您的数据库。

为了进行说明,请运行Mongo的show dbs命令:

show dbs

此命令返回服务器上每个数据库的列表。但是,当启用身份验证时,列表会根据Mongo用户的角色或对某些数据库的访问级别而变化。但是,由于身份验证已禁用,它将不受限制地返回系统中当前的每个数据库:

Outputadmin   0.000GB
config  0.000GB
local   0.000GB

在此示例输出中,仅显示默认数据库。但是,如果您的系统中有任何保存敏感数据的数据库,任何用户都可以使用此命令找到它们。

作为缓解此漏洞的一部分,此步骤的重点是添加管理用户。为此,必须首先连接到admin数据库。这是存储用户信息的地方,如用户名、密码和角色:

use admin
Outputswitched to db admin

MongoDB安装了许多基于JavaScript的shell方法,您可以使用它们来管理数据库。其中之一是db.createUser方法,用于在运行该方法的数据库上创建新用户。

启动db.createUser方法:

db.createUser(

此方法要求您为用户指定用户名和密码,以及您希望用户拥有的任何角色。回想一下,MongoDB将其数据存储在类似JSON的文档中。因此,当您创建一个新用户时,您所做的只是创建一个文档,将适当的用户数据作为单个字段保存。

与JSON中的对象一样,MongoDB中的文档以花括号开始和结束({})。要开始添加用户,请输入左大括号:

注意:在输入右括号之前,Mongo不会将db.createUser方法注册为完整。在此之前,提示将从大于号(>)更改为省略号(...)。

{

接下来,输入user:字段,将所需用户名作为值,用双引号加逗号。以下示例指定用户名AdminSammy,但您可以输入任何您喜欢的用户名:

user: "AdminSammy",

接下来,输入pwd字段,其值为passwordPrompt()方法。当您执行db.createUser方法时,passwordPrompt()方法将提示您输入密码。这比另一种方法更安全,即用明文输入密码,就像输入用户名一样。

:passwordPrompt()方法仅与MongoDB 4.2及更高版本兼容。如果您使用的是旧版本的Mongo,那么您必须以明文形式写出密码,与写出用户名的方式类似:

pwd: "password",

请确保在该字段后面加逗号:

pwd: passwordPrompt(),

然后输入希望管理用户拥有的角色。因为您要创建一个管理用户,所以至少应该授予他们admin数据库上的userAdminAnyDatabase角色。这将允许管理用户创建和修改新用户和角色。由于管理用户在admin数据库中具有此角色,因此这也将授予其超级用户对整个集群的访问权限。

此外,以下示例还授予管理用户readWriteAnyDatabase角色。这使管理用户能够读取和修改集群中任何数据库上的数据,但configlocal数据库除外,这些数据库主要用于内部使用:

roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]

然后,输入右大括号以表示文档结束:

}

然后输入右括号以关闭并执行db.createUser方法:

)

总之,db.createUser方法应该是这样的:

> db.createUser(
... {
... user: "AdminSammy",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )

如果每行的语法正确,该方法将正确执行,并提示您输入密码:

OutputEnter password: 

输入您选择的强密码。然后,您将收到用户已添加的确认:

OutputSuccessfully added user: {
	"user" : "AdminSammy",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		"readWriteAnyDatabase"
	]
}

然后,您可以退出MongoDB客户端:

exit

此时,您的用户将被允许输入凭据。但是,在您启用身份验证并重新启动MongoDB守护进程之前,他们不需要这样做。

步骤2-启用身份验证

要启用身份验证,必须编辑MongoDB的配置文件mongod.conf。启用并重新启动Mongo服务后,用户仍可以连接到数据库而无需验证。但是,在提供正确的用户名和密码之前,他们无法读取或修改任何数据。

使用首选的文本编辑器打开配置文件。在这里,我们将使用nano:

sudo nano /etc/mongod.conf

向下滚动以找到已注释的security部分:

/etc/mongod.conf

. . .
#security:
#operationProfiling:
. . .

通过删除磅符号(#)取消对此行的注释:

/etc/mongod.conf

. . .
security:
#operationProfiling:
. . .

然后添加authorization参数并将其设置为"enabled"。完成后,行应如下所示:

/etc/mongod.conf

. . .
security:
  authorization: "enabled"
. . . 

请注意,security:行的开头没有空格,而authorization:行缩进了两个空格。

添加这些行后,保存并关闭文件。如果使用nano打开文件,请依次按CTRL + XYENTER

然后重新启动守护进程以使这些新更改生效:

sudo systemctl restart mongod

接下来,检查服务的状态以确保其正确重启:

sudo systemctl status mongod

如果restart命令成功,您将收到输出,指示mongod服务处于活动状态并且最近启动:

Output● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-10-06 15:24:44 UTC; 5s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 13660 (mongod)
   CGroup: /system.slice/mongod.service
           └─13660 /usr/bin/mongod --config /etc/mongod.conf
Oct 06 15:24:44 mongo-18-01 systemd[1]: Started MongoDB Database Server.

在验证守护进程是否已备份并运行后,您可以测试添加的身份验证设置是否按预期工作。

步骤3-测试身份验证设置

要开始测试您在上一步中添加的身份验证要求是否正常工作,请在不指定任何凭据的情况下进行连接,以验证您的操作确实受到限制:

mongo 

现在您已经启用了身份验证,以前遇到的警告都不会出现:

OutputMongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ed0e92b6-bee5-4867-9d87-8b57155aea40") }
MongoDB server version: 4.4.1
> 

再次运行show dbs命令以确认您的访问是否受到限制:

show dbs

回想一下第1步,您的服务器上至少有几个默认数据库。但是,在这种情况下,该命令将不会有任何输出,因为您没有作为特权用户进行身份验证。

因为该命令不返回任何信息,所以可以安全地说,身份验证设置正在按预期工作。如果不首先进行身份验证,您也将无法创建用户或执行其他特权任务。

继续并退出MongoDB shell:

注意:与之前在步骤1中运行以下exit命令不同,关闭shell的另一种方法是只按CTRL + C

exit

接下来,通过运行以下mongo命令作为该用户进行连接,确保您的管理用户能够正确进行身份验证。此命令包括-u标志,位于要连接的用户名称之前。请确保将AdminSammy替换为您自己的管理用户用户名。它还包括-p标志,该标志将提示您输入用户密码,并将admin指定为创建指定用户名的身份验证数据库:

mongo -u AdminSammy -p --authenticationDatabase admin

在提示时输入用户的密码,然后您将被放入shell。到达后,再次尝试发出show dbs命令:

show dbs

这一次,由于您已正确验证,该命令将成功返回服务器上当前所有数据库的列表:

Outputadmin   0.000GB
config  0.000GB
local   0.000GB

这确认已成功启用身份验证。

结论

通过完成本指南,您已经设置了一个管理MongoDB用户,您可以使用该用户创建和修改新用户和角色,或者管理您的MongoDB实例。您还将MongoDB实例配置为要求用户在与任何数据交互之前使用有效的用户名和密码进行身份验证。

有关如何管理MongoDB用户的更多信息,请查看关于该主题的官方文档。您还可能有兴趣了解更多关于authentication如何在MongoDB上工作。

此外,如果您计划远程与MongoDB实例交互,您可以按照我们的指南How to Configure Remote Access for MongoDB on Ubuntu 18.04进行设置。

Logo

更多推荐