如何在 Ubuntu 16.04 上保护 MongoDB
在本文中,我们将学习如何在Ubuntu16.04上保护MongoDB。在以前的版本中,MongoDB容易受到自动攻击,因为默认情况下,不允许与数据库交互的身份验证,任何用户都可以创建、读取、修改和破坏数据库及其内容,这是因为MongoDB守护进程,它可以将所有接口作为默认设置进行监听。
启用身份验证并添加管理员用户
这个问题在版本3.x发布后的最新版本的MongoDB中得到了缓解,但是,身份验证仍然作为默认设置禁用,因此任何用户都可以完全访问数据库。为了确保这一点,我们将创建一个管理用户并启用身份验证并使用管理员用户测试身份验证。
添加管理员用户
要添加管理员用户,我们将首先连接到Mongoshell。
$ mongo
当我们打开MongoDBshell时,它显示了许多警告,指出没有为数据库启用访问控制,并且对数据库和配置的读或写访问不受限制。
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用户,但除非我们在MongoDB配置中启用身份验证,否则不需要它。
为MongoDB启用身份验证
我们需要在mongod.conf位于/etc的配置文件中启用身份验证并重新启动MongoDB守护进程。
现在我们将编辑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.
验证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尝试使用身份验证。
验证管理员用户访问
现在,尝试使用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 >
在本文中,我们学习了如何通过添加管理员用户并启用身份验证作为默认设置来保护MongoDB的安全,MongoDB没有启用任何用户都可以创建、删除和修改数据库的用户身份验证。