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