Linux环境开启MongoDB的安全认证
文章目录
- 1. MongoDB安全认证简介
- 1.1 访问控制
- 1.2 角色
- 1.3 权限
- 2. MongoDB中的常见角色
- 3. MongoDB Shell
- 3.1 下载MongoDB Shell
- 3.2 通过MongoDB Shell连接MongoDB
- 4. 创建管理员用户
- 5. 为具体的数据库创建用户
- 6. 开启权限认证
- 7. 重启MongoDB服务
- 8. 连接MongoDB
- 9. MongoDB数据库被黑的情况
阅读本文前可以先阅读以下文章:
- Linux环境下安装MongoDB
- MongoDB快速入门(MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常用命令)
- MongoDB的常用命令(数据库操作、集合操作、文档操作)
1. MongoDB安全认证简介
默认情况下,MongoDB 实例启动运行时是没有开启用户访问权限控制的,也就是说任何客户端都可以随意连接到MongoDB实例进行各种操作,MongoDB 不会对连接客户端进行用户验证,这是非常危险的
为了保障 MongoDB 的安全,MongoDB 官网给出了以下建议:
- 使用新的端口:如果使用默认的 27017 端口,一旦知道了 IP 地址就能连接上,不太安全
- 设置 MongoDB 的网络环境:将 MongoDB 部署到公司服务器内网,这样外网是访问不到的,公司内部使用 VPN 访问
- 开启安全认证:既要设置服务器之间的内部认证方式,也要设置客户端连接到集群的账号密码认证方式
本文采用开启安全认证的方式,在此之前,我们先来了解三个概念:访问控制、角色、权限
1.1 访问控制
MongoDB 使用基于角色的访问控制(Role-Based Access Control,RBAC)来管理用户对实例的访问
通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配角色之前,用户无法访问实例
1.2 角色
在 MongoDB 中通过角色对用户授予相应数据库资源的操作权限,每个角色当中的权限可以显式指定,也可以通过继承获得其他角色的权限
1.3 权限
权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成
- 资源(resource)包括:数据库、集合、部分集合和集群
- 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作
2. MongoDB中的常见角色
角色名称 | 数据库 | 描述 |
---|---|---|
read | 单个数据库 | 允许用户读取指定数据库的所有数据。 |
readWrite | 单个数据库 | 允许用户读取和写入指定数据库的所有数据。 |
dbAdmin | 单个数据库 | 允许用户执行管理操作,如索引创建、删除以及查看统计信息。 |
userAdmin | 单个数据库 | 允许用户管理数据库的用户和角色。 |
clusterAdmin | admin | 允许用户执行集群管理操作,如添加和删除节点、关闭节点等。 |
readAnyDatabase | admin | 允许用户读取所有数据库。 |
readWriteAnyDatabase | admin | 允许用户读取和写入所有数据库。 |
userAdminAnyDatabase | admin | 允许用户管理所有数据库的用户和角色。 |
dbAdminAnyDatabase | admin | 允许用户管理所有数据库。 |
root | admin | 超级用户角色,具有最高的权限,可以对任何数据库执行任何操作。 |
backup | admin | 允许用户备份数据库。 |
restore | admin | 允许用户从备份中恢复数据库。 |
hostManager | admin | 允许用户执行监控和管理服务器操作。 |
clusterMonitor | admin | 允许用户监控集群状态。 |
changeStream | 单个数据库 | 允许用户监听变更流事件。 |
enableSharding | admin | 允许用户开启数据库的分片。 |
bypassDocumentValidation | 单个数据库 | 允许用户绕过文档验证。 |
3. MongoDB Shell
3.1 下载MongoDB Shell
MongoDB 6.x 版本之后移除了 mongo 连接工具,需要自行下载 MongoDB Shell
下载地址:MongoDB Shell Download
MongoDB Shell 的官方文档:安装 mongosh
选择 Linux 发行版本的信息,选择 tgz 格式,最后点击 Copy link
在 Linux 终端执行下载命令(该命令会将文件下载到当前路径)
curl -o mongosh-2.3.3-linux-x64.tgz 复制的地址
查看已下载的文件
ls -l
将文件解压到当前目录
tar -zxvf mongosh-2.3.3-linux-x64.tgz
为 mongosh 文件赋予执行权限
chmod +x mongosh-2.3.3-linux-x64/bin/mongosh
将下载的二进制文件添加到PATH
环境变量中
sudo cp mongosh-2.3.3-linux-x64/bin/mongosh /usr/local/bin/
sudo cp mongosh-2.3.3-linux-x64/bin/mongosh_crypt_v1.so /usr/local/lib/
3.2 通过MongoDB Shell连接MongoDB
MongoDB Shell 的官方教程:使用 MongoDB Shell 连接到 MongoDB 部署
使用以下命令连接 MongoDB
mongosh --host 127.0.0.1 --port 27017
连接成功的界面
附带用户名和密码的连接方式
mongosh --host 127.0.0.1 --port 27017 --username wuyanzu --password
4. 创建管理员用户
先切换到 admin 数据库
use admin;
接着创建一个管理员用户(密码中不要出现 #
、$
、!
、@
等特殊符号)
db.createUser({
user: "wuyanzu",
pwd: "6nJPsG6m4ESx9mra",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
});
命令中每个部分的详细解释:
db.createUser({ ... })
:这是MongoDB的命令,用于在当前数据库实例中创建一个新的用户user: "wuyanzu"
:这是新用户的用户名。在这个例子中,用户名是wuyanzu
pwd: "6nJPsG6m4ESx9mra"
:这是新用户的密码。在这个例子中,密码是UxrhiPSI9bh65mgs
。在实际操作中,应该使用一个强密码来确保安全性roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
:这是为新用户分配的角色列表。在这个例子中,用户被分配了一个角色role: "userAdminAnyDatabase"
:这是分配给用户的角色名称。userAdminAnyDatabase
是一个内置角色,它允许用户在任何数据库中管理用户和角色db: "admin"
:这是角色将被分配的数据库。尽管userAdminAnyDatabase
角色适用于所有数据库,但角色本身必须分配在admin
数据库中,因为这是一个特殊的权限角色
5. 为具体的数据库创建用户
用管理员用户登录之后,为具体的数据库(比如一个叫做 article
的数据库)创建用户
首先切换到要创建用户的数据库(如果数据库不存在会自动创建)
use article;
创建一个用户并为用户授予适当的角色
db.createUser({
user: "niekeyi",
pwd: "rVEK8GfVjvM5NMUo",
roles: [
{ role: "readWrite", db: "article" },
{ role: "dbAdmin", db: "article" }
]
});
命令中每个部分的详细解释:
db.createUser({ ... })
:这是MongoDB shell命令,用于在当前数据库实例中创建一个新的用户。user: "niekeyi"
:这是新用户的用户名。在这个例子中,用户名设置为niekeyi
。pwd: "rVEK8GfVjvM5NMUo"
:这是新用户的密码。在这个例子中,密码设置为rVEK8GfVjvM5NMUo
。roles: [...]
:这是一个数组,用于指定分配给新用户的角色列表。角色定义了用户在数据库中的权限。{ role: "readWrite", db: "article" }
:这表示新用户在article
数据库中拥有读写权限。readWrite
角色允许用户执行以下操作:- 读取所有非系统集合的数据。
- 插入、更新和删除数据。
{ role: "dbAdmin", db: "article" }
:这表示新用户在article
数据库中拥有数据库管理权限。dbAdmin
角色允许用户执行以下操作:- 创建和删除索引。
- 收集统计信息。
- 视图管理。
- 复制数据库中的数据。
- 备份数据库(尽管通常备份是通过MongoDB的工具如
mongodump
来执行的)。 - 恢复数据库(通常通过
mongorestore
工具)。
6. 开启权限认证
修改 MongoDB 的配置文件,开启权限认证
vim /home/ubuntu/mongodb/single/mongod.conf
security:
authorization: enabled
完整的配置文件(已开启安全认证)
systemLog:
# MongoDB 发送所有日志输出的目标指定为文件
# The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
# mongod 或 mongos 应向其发送所有诊断日志记录信息的日志文件的路径
path: "/home/ubuntu/mongodb/single/log/mongod.log"
# 当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
# mongod 实例存储其数据的目录。storage.dbPath 设置仅适用于 mongod
# The directory where the mongod instance stores its data. Default Value is "/data/db"
dbPath: "/home/ubuntu/mongodb/single/data/db"
# processManagement:
security:
authorization: enabled
net:
# 服务实例绑定的 IP,默认是 127.0.0.1
# bindIp: 127.0.0.1
bindIp: 0.0.0.0
# 绑定的端口,默认是 27017
port: 27017
7. 重启MongoDB服务
输入以下指令重启 MongoDB 服务
sudo systemctl restart mongodb.service
8. 连接MongoDB
通过 Compass 或 navicat 等工具连接 MongoDB
选择通过用户名和密码进行验证
如果连接失败,需要指定数据库
9. MongoDB数据库被黑的情况
如果是在云服务器上部署的 MongoDB,一定要开启安全认证,否则你的 MongoDB 数据库将在极短的时间内被黑
MongoDB 被黑之后,将会出现一个名为 READ__ME_TO_RECOVER_YOUR_DATA
的数据库,数据库中会有一个名为 README
的集合,集合中会有一个文档,文档的内容大概如下:
{
_id: ObjectId(‘672c2dcafbee857340b0b1b1’),
content: ‘All your data is backed up. You must pay 0.0053 BTC to bc1q307y2v8aujqwrej8m9v998yj0m242km989t8d2 In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://2fix.info/mdb)After paying send mail to us: dzen+1amnxt@onionmail.org and we will provide a link for you to download your data. Your DBCODE is: 1AMNXT’
}
{
_id: ObjectId('672c2dcafbee857340b0b1b1'),
content: 'All your data is backed up. You must pay 0.0053 BTC to bc1q307y2v8aujqwrej8m9v998yj0m242km989t8d2 In 48 hours, your data will be publicly disclosed and deleted. (more information: go to http://2fix.info/mdb)After paying send mail to us: dzen+1amnxt@onionmail.org and we will provide a link for you to download your data. Your DBCODE is: 1AMNXT'
}
简单翻译一下就是:你的数据被我黑掉了,要想拿回你的数据,就在 48 小时内打钱给指定的账户(而且还要用比特币),否则你的数据将会在公开后被删除
- 知名服务使用的端口(如 MySQL 服务使用的 3306 端口、Redis 服务使用的 6379 端口、MongoDB 服务使用的 27017 端口),如果不开启安全认证,或者密码的安全等级太低,是很容易被爆破的
- 为了避免 MongoDB 数据库被黑,我们一定要开启 MongoDB 的安全认证(必要情况下可以使用新的端口来部署 MongoDB)