如何在 Ubuntu 20.04 上保护 MongoDB

此教程的早期版本是由Melissa Anderson撰写的(https://www.digitalocean.com/community/users/melissaanderson)。

介绍

MongoDB是一个用于许多现代Web应用程序的文档数据库,它被归类为 NoSQL数据库,因为它不依赖传统的基于表的关系数据库结构。

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

前提条件

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

  • 运行 Ubuntu 20.04 的服务器本服务器应该具有非根管理用户和与 UFW 配置的防火墙。 通过遵循我们的 Ubuntu 20.04 的初始服务器设置指南来设置此设置。
  • MongoDB 安装在您的服务器上。 此教程已通过使用 MongoDB 版本 4.4 进行验证,尽管它通常也应该适用于 MongoDB 的较旧版本。 要在您的服务器上安装 Mongo,请遵循我们的教程。

步骤 1 – 添加管理用户

自版本 3.0 发布以来,MongoDB 示威器已配置为仅接受来自本地 Unix 接口的连接,并且不会自动向更广泛的互联网开放,然而,身份验证仍然默认禁用,这意味着任何有访问安装 MongoDB 的服务器的用户也可以完全访问数据库。

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

要添加一个管理用户,你必须首先连接到Mongo壳. 由于身份验证已禁用,你可以用mongo命令这样做,没有其他选项:

1mongo

由于您尚未启用身份验证,这将包括一个警告,即数据库未启用访问控制,且读取和写入数据以及数据库配置不受限制:

 1[secondary_label Output]
 2MongoDB shell version v4.4.0
 3
 4 . . . 
 5
 62020-06-09T13:26:51.391+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
 72020-06-09T13:26:51.391+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
 8
 9 . . .
10
11>

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

以示例,运行 Mongo 的显示 dbs命令:

1show dbs

此命令返回服务器上的每个数据库的列表. 但是,当启用身份验证时,该列表会根据 Mongo 用户的 role 或它对某些数据库的访问级别进行更改。

1[secondary_label Output]
2admin 0.000GB
3config 0.000GB
4local 0.000GB

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

作为减轻此漏洞的一部分,此步骤侧重于添加一个管理用户。 要做到这一点,您必须先连接到admin数据库。 这是有关用户的信息,如用户名、密码和角色,存储的地方:

1use admin
1[secondary_label Output]
2switched to db admin

MongoDB 配备了 一些基于 JavaScript 的壳方法,您可以使用它们来管理您的数据库。其中一个,即 db.createUser 方法,用于在该方法运行的数据库中创建新用户。

启动db.createUser方法:

1db.createUser(

此方法要求您为用户指定用户名和密码,以及您希望用户拥有的任何角色。 请记住,MongoDB 将其数据存储在类似 JSON 的文档中。

与 JSON 中的对象一样,MongoDB 中的文档始于和结束于弯曲的弯曲({和 `}')。

<$>[注] :在您输入关闭组合之前,Mongo 将不会将 db.createUser 方法注册为完整。

1{

接下来,输入一个用户:字段,用您想要的用户名作为双引文中的值,然后是句子. 下面的示例指定了用户名 AdminSammy,但您可以输入您想要的用户名:

1user: "AdminSammy",

接下来,输入一个pwd字段,其值是passwordPrompt()方法. 当您执行db.createUser方法时,passwordPrompt()方法将为您提供一个提示,以便您输入密码。

<$>[注意] 注意:passwordPrompt()方法仅与MongoDB版本 4.2 和更高版本兼容。如果您使用的是 MongoDB 的较旧版本,则需要用清晰文本写出您的密码,类似于您如何写出您的用户名:

1pwd: "password",

美元

请确保跟随这个字段与一个子也:

1pwd: passwordPrompt(),

然后输入你希望你的管理用户拥有的角色. 因为你正在创建一个管理用户,你至少应该授予他们在admin数据库上的userAdminAnyDatabase角色。 这将允许管理用户创建和修改新的用户和角色。

此外,下面的示例还赋予管理员用户readWriteAnyDatabase的角色,这赋予管理员用户读取和修改集群中的任何数据库中的数据,除了config本地数据库,这些数据库主要用于内部使用:

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

接下来,输入一个关闭键来表示文档的结束:

1}

然后输入一个关闭方针以关闭并执行db.createUser方法:

1)

总的来说,这里是你的db.createUser方法应该是什么样子:

1> db.createUser(
2... {
3... user: "AdminSammy",
4... pwd: passwordPrompt(),
5... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
6... }
7... )

如果每个行的语法正确,该方法将正确执行,您将被要求输入密码:

1[secondary_label Output]
2Enter password:

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

 1[secondary_label Output]
 2Successfully added user: {
 3    "user" : "AdminSammy",
 4    "roles" : [
 5    	{
 6    		"role" : "userAdminAnyDatabase",
 7    		"db" : "admin"
 8    	},
 9    	"readWriteAnyDatabase"
10    ]
11}

接下来,您可以退出 MongoDB 客户端:

1exit

在此时,您的用户将被允许输入凭证,但直到您启用身份验证并重新启动 MongoDB 示范器之前,他们将不会被要求这样做。

步骤 2 – 允许身份验证

要启用身份验证,您必须编辑mongod.conf,MongoDB的配置文件.一旦启用它并重新启动Mongo服务,用户仍然可以连接到数据库而无需身份验证。

使用您喜爱的文本编辑器打开配置文件. 在这里,我们将使用nano:

1sudo nano /etc/mongod.conf

向下滚动以找到评论的安全部分:

1[label /etc/mongod.conf]
2. . .
3#security:
4
5#operationProfiling:
6
7. . .

通过删除英镑符号(#)来消除此行:

1[label /etc/mongod.conf]
2. . .
3security:
4
5#operationProfiling:
6
7. . .

然后添加授权参数并将其设置为启用

1[label /etc/mongod.conf]
2. . .
3security:
4  authorization: enabled
5. . .

请注意,安全性:线在开始时没有空格,而授权:线则有两个空格。

添加这些行后,保存并关闭文件. 如果您使用nano打开文件,请按CTRL + X,Y,然后按ENTER

然后重新启动 DAEMON 以实施这些新更改:

1sudo systemctl restart mongod

接下来,检查服务的状态,以确保它正确地重新启动:

1sudo systemctl status mongod

如果重新启动命令成功,您将收到输出,表示mongod服务正在运行并最近启动:

 1[secondary_label Output]
 2 mongod.service - MongoDB Database Server
 3     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
 4     Active: active (running) since Tue 2020-06-09 22:06:20 UTC; 7s ago
 5       Docs: https://docs.mongodb.org/manual
 6   Main PID: 15370 (mongod)
 7     Memory: 170.1M
 8     CGroup: /system.slice/mongod.service
 9             └─15370 /usr/bin/mongod --config /etc/mongod.conf
10
11Jun 09 22:06:20 your_host systemd[1]: Started MongoDB Database Server.

验证戴蒙备份并运行后,您可以测试您添加的身份验证设置是否按预期工作。

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

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

1mongo

现在您已启用了身份验证,您之前遇到的任何警告都不会显示:

1[secondary_label Output]
2MongoDB shell version v4.4.0
3connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
4Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") }
5MongoDB server version: 4.4.0
6>

通过再次运行显示 dbs命令来确认您的访问是否受到限制:

1show dbs

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

由于此命令不会返回任何信息,所以可以安全地说身份验证设置按预期运行,您也无法创建用户或执行其他特权任务而没有先进行身份验证。

继续前进并退出 MongoDB 壳:

<$>[注意] 注意:而不是像您在步骤 1 中之前一样运行以下退出命令,关闭壳的替代方法是仅仅按CTRL + C

1exit

接下来,请确保您的管理员用户能够通过运行以下mongo命令来正确身份验证以作为该用户连接。该命令包括u旗帜,该命令提前您想要作为连接的用户的名称。

1mongo -u AdminSammy -p --authenticationDatabase admin

当被提示时,输入用户密码,然后你将被扔进壳中. 一旦到达那里,请尝试再次发出显示dbs命令:

1show dbs

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

1[secondary_label Output]
2admin 0.000GB
3config 0.000GB
4local 0.000GB

这表明身份验证已成功启用。

结论

通过完成本指南,您已设置了一个管理 MongoDB 用户,您可以使用它来创建和修改新的用户和角色,并以其他方式管理您的 MongoDB 实例。

有关如何管理 MongoDB 用户的更多信息,请参阅有关该主题的官方文档(https://docs.mongodb.com/manual/tutorial/manage-users-and-roles/)。

此外,如果您打算远程与 MongoDB 实例进行交互,您可以遵循我们在 Ubuntu 20.04 上如何配置 MongoDB 远程访问的指南(https://andsky.com/tech/tutorials/how-to-configure-remote-access-for-mongodb-on-ubuntu-20-04)。

Published At
Categories with 技术
comments powered by Disqus