如何掌控您的MongoDB安全

黑客变得越来越复杂,他们知道如何利用漏洞。如果您的MongoDB数据库中有敏感数据,重视安全至关重要。但是如何做呢?不用担心!本教程将为您提供解决方案!

在本教程中,您将学习通过设置安全措施来保护您的MongoDB数据库并抵御黑客攻击。

继续阅读,开始掌控您的MongoDB安全性!

先决条件

  • 本教程将进行实际演示。为了跟随操作,请确保具备以下条件:
  • A non-root user with sudo privileges.

创建专用管理用户

MongoDB没有内置的身份验证系统。默认情况下,任何访问数据库的人都具有完全的管理员权限,这太危险了!如何保护您的数据库?您将创建一个具有管理员权限的用户,并将数据库锁定给该管理员用户。

这个设置允许您提供一个具有管理员特权的用户访问单一点,同时限制每个用户在数据库中的操作权限。例如,开发人员应该只能对数据库进行只读访问,而管理员可以创建和编辑数据。

1. 打开您的终端并运行下面的mongo命令,不带任何参数。这个命令允许您连接到MongoDB shell作为默认的管理员用户。

这个管理员用户非常强大,因为它具有对服务器上所有数据库的完全读/写访问权限,最好避免将此用户用于日常工作。

mongo

您将收到一条警告,内容是Access control is not enabled……,如下所示。

这个警告表示任何能够访问MongoDB服务器的人都可以执行他们想要的操作,这些操作包括但不限于删除、丢弃、更新数据库。

这个警告之所以出现是因为您还没有启用访问控制。现在不用担心,您将在以下部分学习如何启用访问控制。

Connecting to your MongoDB shell

2. 接下来,运行show dbs命令,显示服务器上的所有数据库,包括正常用户不应该看到的admin数据库。

show dbs
Showing all databases on the server

3. 运行以下use admin命令,切换到 admin 数据库,因为您的重点是创建专用的管理员用户。此命令将当前数据库上下文更改为使用 admin 数据库,如下所示。

MongoDB 使用 admin 数据库存储访问控制规则,并为用户及其角色提供内置身份验证、用户名和密码。由于 admin 数据库对数据库功能至关重要,因此无法删除或重命名。

use admin
Switching to the admin database

4. 现在,复制并粘贴以下代码到 mongo shell 中,然后按 Enter 键。此代码将创建一个名为AdminATA的用户,密码为LDWbPf6Fy9Ezs3Mv,但您可以根据需要使用不同的凭据。

这个新用户具有对所有数据库的读/写(readWriteAnyDatabase)访问权限,并对所有集合具有管理员访问权限。但是,此用户没有删除/更改数据库权限,也不能删除或更改其他用户的权限。

运行命令后,如果出现错误,请重新检查您的代码并重试。

# db.createUser()方法在当前数据库上创建一个新用户,该用户拥有由角色指定的特权。
db.createUser(
{
# 指定用户名为AdminATA,但你可以输入任何你喜欢的用户名
user: "AdminATA",
# passwordPrompt()方法是一个通用的辅助函数 
# 它告诉MongoDB shell提示你为AdminATA用户输入密码。
pwd: passwordPrompt(),
# 指定你希望AdminATA用户具有的角色。
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)

5. 在提示时输入安全密码,如下所示,然后按Enter键。

Providing a secure password

下面,你会看到一个成功添加用户的消息。这个输出确认你成功创建了一个具有管理特权并将其限制为所需最低特权的用户。

此时,你已经拥有一个名为AdminATA的管理用户,可以在数据库上执行所有你需要的操作,而不会给予所有人访问权限。

Verifying Successful Admin User Creation in MongoDB

6. 最后,运行exit命令退出mongo shell。

exit
Leaving the mongo shell

通过启用身份验证增加安全性

现在你有了一个管理用户,通过启用身份验证,你将增加另一层安全性。这样做将只给具有正确凭据的用户提供数据库访问权限。

身份验证是指验证连接的过程,通常通过提供用户名和密码或使用身份验证令牌来完成。身份验证确保您是您声称的人,而不是试图访问资源的冒名顶替者。

1. 通过编辑MongoDB配置文件并保存更改来启用身份验证:

  • 打开您喜欢的文本编辑器中的/etc/mongod.conf文件。 /etc/mongod.conf文件包含您的MongoDB集群的配置
  • 查找并取消注释#security指令,方法是删除该指令前面的#符号,如下所示。该指令告诉MongoDB在配置文件中查找安全设置。
  • security指令下面添加一行新的内容,写入authorization: enabled。请注意authorization: enabled行已缩进(开头有两个空格),如下所示。
Adding the authorization parameter

2. 接下来,运行以下systemctl命令来重新启动MongoDB服务器以使更改生效。

sudo systemctl restart mongod

3. 最后,运行以下命令查看您的MongoDB服务状态。

sudo systemctl status mongod

下面,您可以看到一行文字,其中包含绿色文字的Active: active (running),表示您的MongoDB服务器正在运行并准备好接受连接。

Viewing MongoDB Service Status

测试身份验证是否有效

您刚刚启用了身份验证,但您怎么知道它是否有效?您将登录到管理用户以测试并确保身份验证有效,通过查看数据库。

1. 运行以下命令以访问mongo shell,就像在“创建专用管理用户”部分(第一步)中所做的那样。

mongo

如下所示,您将不再收到关于启用身份验证的Access control is not enabled…警告。相反,您将收到一条消息,告诉您MongoDB服务器和MongoDB shell的版本。

Connecting to the MongoDB Shell

2. 接下来,重新运行show dbs命令以检查是否仍然可以访问数据库。

show dbs

该命令应该显示所有数据库,甚至是管理员数据库。但如您下面所见,什么都没有显示。为什么?查看数据库列表是仅供管理员用户使用的权限。

您尚未对mongo shell进行身份验证以使用Admin角色,因此您无权查看数据库列表。

Listing All Databases (empty)

启用身份验证后,如果有人尝试使用不包含正确凭据的连接字符串访问数据库,连接将失败。

MongoDB 安全性的核心部分是验证连接字符串,您应该在应用程序的所有层次上实施验证。所有连接到 MongoDB 的连接都必须使用包含凭据的身份验证字符串。这些凭据包括正确的用户名和密码。

3. 运行 exit 命令以退出 MongoDB shell。

exit

4. 现在,运行以下命令以使用新创建的管理员用户的用户名(-u)和密码(-p)登录 MongoDB shell。将 AdminATA 替换为您在“创建专用管理员用户”部分(第四步)中创建的用户名。

--authenticationDatabase 参数告诉 MongoDB shell 对 admin 数据库进行身份验证。

mongo -u AdminATA -p --authenticationDatabase admin

5. 在提示时提供管理员用户的密码。

Providing administrative password
logging into the MongoDB shell as an administrator

6. 最后,重新运行 show dbs 命令,尝试查看是否可以查看所有数据库。

show dbs

这次,如下所示,因为您是管理员用户,显示了数据库列表。

Listing all databases as admin user

结论

在本教程中,您学会了如何连接并创建管理员用户并启用身份验证。您已经学会了掌控 MongoDB 安全性并对谁可以访问服务器上的数据库进行限制。

此时,您可以决定谁可以访问什么。那么对您来说,下一步是什么呢?也许学习一下 如何安全使用 MongoDB 容器

Source:
https://adamtheautomator.com/mongodb-security/