此教程的早期版本是由Melissa Anderson撰写的(https://www.digitalocean.com/community/users/melissaanderson)。
介绍
MongoDB,也被称为 Mongo,是一个开源文档数据库,用于许多现代Web应用程序. 它被归类为 NoSQL数据库,因为它不依赖传统的基于表的关系数据库结构。
默认情况下,MongoDB 没有启用身份验证,这意味着任何拥有访问数据库安装的服务器的用户都可以无限制地添加和删除数据。为了确保此漏洞,本教程将指导您创建一个管理用户并启用身份验证。
前提条件
要完成本教程,您将需要以下内容:
- 要完成本教程,您将需要运行 CentOS 8 的服务器。本服务器应该具有非 root 用户,具有管理权限,并配置了 firewalld. 要设置此功能,请遵循我们的 CentOS 8 初始服务器设置指南。
- MongoDB 安装在您的服务器上。本教程已通过 MongoDB 版本 4.4 验证,尽管它通常也应该适用于较旧的 MongoDB 版本。 要在您的服务器上安装 Mongo,请遵循我们的教程 如何在 CentOS 8 上安装 MongoDB。
步骤 1 – 添加管理用户
自版本 3.0 发布以来,MongoDB 示威器已配置为仅接受来自本地 Unix 接口的连接,并且不会自动向更广泛的互联网开放,然而,身份验证仍然默认禁用,这意味着任何有访问安装 MongoDB 的服务器的用户也可以完全访问数据库。
作为确保此漏洞的第一步,您将创建一个管理用户,随后,您将启用身份验证并作为该管理用户连接以访问数据库。
要添加一个管理用户,你必须首先连接到Mongo壳. 由于身份验证已禁用,你可以用mongo
命令这样做,没有其他选项:
1mongo
由于您尚未启用身份验证,这将包括一个警告,即数据库未启用访问控制,且读取和写入数据以及数据库配置不受限制:
1[secondary_label Output]
2MongoDB shell version v4.4.1
3 . . .
4---
5The server generated these startup warnings when booting:
6 2020-10-02T14:38:03.448+00:00: ***** SERVER RESTARTED *****
7 2020-10-02T14:38:04.209+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
8---
9 . . .
10>
在您启用身份验证后,第二个警告将消失,但目前这意味着任何可以访问 CentOS 服务器的人都可以控制您的数据库。
<$>[注意] 注意:如果您安装了MongoDB,并按照前提中链接的教程,您可能会在提示中看到另一个警告:
1[secondary_label Output]
2. . .
3 2020-10-02T14:38:04.633+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
4. . .
此警告指的是透明巨型页面(THP),这是在 CentOS 8 上默认启用的 Linux 内存管理系统。THP 使用额外大的内存页面来减少 Translation Lookaside Buffer 搜索对大量内存的机器的影响。
如果您想了解如何禁用透明巨型页面的详细信息,请参阅我们关于如何在CentOS 8上安装MongoDB的指南的第2步(https://andsky.com/tech/tutorials/how-to-install-mongodb-on-centos-8#step-2-%E2%80%94-disabling-transparent-huge-pages-to-improve-performance)。
以示例,运行 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 和更高版本兼容。如果您正在使用较旧的 Mongo 版本,则必须用清晰的文本写出您的密码,类似于您写出您的用户名的方式:
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 (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
4 Active: active (running) since Fri 2020-10-02 14:57:31 UTC; 7s ago
5 Docs: https://docs.mongodb.org/manual
6 Process: 15667 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
7 Process: 15665 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
8 Process: 15662 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
9 Process: 15659 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
10 Main PID: 15669 (mongod)
11 Memory: 159.2M
12 CGroup: /system.slice/mongod.service
13 └─15669 /usr/bin/mongod -f /etc/mongod.conf
验证戴蒙备份并运行后,您可以测试您添加的身份验证设置是否按预期工作。
步骤 3 – 测试身份验证设置
若要开始测试您在上一步中添加的身份验证要求是否正常工作,请通过不指定任何凭据的连接开始,以验证您的操作确实受到限制:
1mongo
现在您已启用了身份验证,您之前遇到的任何警告都不会显示:
1[secondary_label Output]
2MongoDB shell version v4.4.1
3connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
4Implicit session: session { "id" : UUID("d57987e5-24dc-427e-89b7-9ab362ebac6b") }
5MongoDB server version: 4.4.1
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 实例进行远程交互,您可以在 CentOS 8 上如何配置 MongoDB 远程访问上遵循我们的指南。