如何在 Ubuntu 16.04 上保护 MongoDB


在本文中,我们将学习如何在 Ubuntu 16.04 上保护 Mongo DB。在以前的版本中,Mongo DB 容易受到自动化漏洞利用的攻击,因为默认情况下没有启用身份验证,任何用户都可以与数据库交互,创建、读取、修改和销毁数据库及其内容,这是因为 Mongo DB 守护进程默认情况下可以监听所有接口。

启用身份验证并添加管理员用户

这个问题在 Mongo DB 3.x 版本之后的最新版本中得到了缓解,但是,身份验证默认情况下仍然是禁用的,因此任何用户都可以完全访问数据库。为了保护它,我们将创建一个管理员用户并启用身份验证,并使用管理员用户测试身份验证。

添加管理员用户

要添加管理员用户,我们首先需要连接到 Mongo shell。

$ mongo

当我们打开 Mongo DB shell 时,它会显示许多警告,表明数据库未启用访问控制,并且对数据库和配置的读写访问不受限制。

Output:
MongoDB shell version v3.4.4
connecting to: MongoDB://127.0.0.1:27017
MongoDB server version: 3.4.4
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten]
2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] ** WARNING: Using the XF                      S filesystem is strongly recommended with the WiredTiger storage engine2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] **       See http://d ochub.mongodb.org/core/prodnotes-filesystem
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: Access contr ol is not enabled for the database.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** Read and wri te access to data and configuration is unrestricted.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/ mm/transparent_hugepage/enabled is 'always'.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** We suggest set ting it to 'never'
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/ mm/transparent_hugepage/defrag is 'always'.
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** We suggest set ting it to 'never'
2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten]
>

由于没有限制管理员帐户用户名,因为权限级别来自变量 userAdminAnyDatabase。数据库管理员存储凭据。

我们将选择我们选择的用户名,并确保使用以下命令选择安全密码。

> use admin.
switched to db admin

切换数据库后,我们将创建一个管理员用户。

> db.createUser(
... {
...    user: "DBAdmin",
...    pwd: "DBAdmin'sSecurePassword",
...    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...    }
... )

Output:
Successfully added user: {
                           "user" : "DBAdmin",
                           "roles" : [
         {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
         }
]
}
>

由于我们创建了一个名为 DBAdmin 的管理员用户,并设置了安全密码。

我们刚刚创建了一个管理员用户,但在我们启用 Mongo DB 配置中的身份验证之前,它不会被要求。

为 MongoDB 启用身份验证

我们需要在位于 /etc 的配置文件 mongod.conf 中启用身份验证,并重新启动 Mongo DB 守护进程。

现在,我们将编辑 mongod.conf 文件,并在 $security 部分进行修改。

$ sudo vi /etc/mongod.conf

配置文件如下所示

# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:

我们需要删除 security 前面的注释 (#) 以启用该部分,并且我们需要添加授权设置,如下所示。

#processManagement − security −   authorization − “enabled” #operationProfiling − #replication − #sharding −

请注意,security 行没有空格,authorization 行必须以两个空格开头。将这些行添加到配置文件后,我们需要重新启动 mongod 守护进程。

以下是重新启动 MongoDB 服务的命令:

$ sudo systemctl restart mongod

重新启动服务后,我们可以使用以下命令检查 MongoDB 服务的状态:

$ sudo systemctl status mongod
Output:
mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2017-05-16 12:52:09 IST; 48s ago
Docs: https://docs.mongodb.org/manual
Main PID: 3281 (mongod)
Tasks: 20
Memory: 33.3MCPU: 734ms
CGroup: /system.slice/mongod.service
└─3281 /usr/bin/mongod --quiet --config /etc/mongod.conf
May 16 12:52:09 ubuntu-16 systemd[1]: Started High-performance, schema-free document-oriented database.

验证 MongoDB 上的身份验证

首先,让我们在没有任何凭据的情况下连接到 MongoDB。

$ mongo

Output:
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
>

现在,我们可以看到过去显示的所有警告消息都已解决,现在我们将通过尝试连接到测试数据库来测试身份验证。

> show dbs
2017-05-16T12:56:17.306+0530 E QUERY [thread1] Error: listDatabases failed:{
      "ok" : 0,
      "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
      "code" : 13,
      "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

我们可以看到,在没有身份验证的情况下,我们无法创建或使用数据库,现在退出 shell 并尝试使用身份验证。

验证管理员用户访问权限

现在,尝试使用管理员用户身份验证连接到管理员数据库。以下是使用用户身份验证连接到数据库的命令:

$ mongo -u DBAdmin -p --authenticationDatabase admin
MongoDB shell version v3.4.4
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4
>show dbs
admin 0.000GB
local 0.000GB
>

在本文中,我们学习了如何通过添加管理员用户并启用身份验证来保护 Mongo DB,因为默认设置下 Mongo DB 未启用用户身份验证,任何用户都可以创建、删除和修改数据库。

更新于:2020年1月23日

230 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告