如何在 Ubuntu 16.04 上保护 MongoDB

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

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

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

添加管理员用户

要添加管理员用户,我们将首先连接到 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,因此对选择 Admin 帐户的用户名没有限制。数据库管理员存储凭据。

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

> 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 的管理员用户,并使用了安全密码。

我们刚刚创建了一个 Admin 用户,但除非我们在 Mongo DB 配置中启用身份验证,否则不需要它。

为 MongoDB 启用身份验证

我们需要在mongod.conf位于 /etc的配置文件中启用身份验证并重新启动 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 - 安全 - 授权 - “启用” #operationProfiling - #replication - #sharding -

注意安全行没有空格,授权行必须以两个空格开头。将这些行添加到配置文件后,我们需要重新启动 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.

验证 Mongo DB 上的身份验证

首先,让我们在没有任何凭据的情况下连接到 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 尝试使用身份验证。

验证管理员用户访问

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

$ 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 没有启用任何用户都可以创建、删除和修改数据库的用户身份验证。