MongoDB:了解createUser和db admin

MongoDB: Understand createUser and db admin

我的 MongoDB 托管在 compose.io 上,名为 ScroungeBA。 我尝试创建一个具有一些内置角色的用户,根据纪录片,这些角色只能在管理数据库中工作:

MongoDB provides all other built-in roles only on the admin database

所以我的问题是:那个管理数据库是关于什么的?它是始终存在的标准数据库吗?

此外,我遇到了问题(使用 MongoDB shell 版本:3.0.5):

$ use admin
switched to db admin
$ db.auth("user", "secret")
Error: 18 Authentication failed.

我想我的用户确实存在于 ScroungeBA 数据库中,但不存在于管理数据库中?我怎样才能在管理数据库中创建一个用户,因为

db.createUser({user:"hello", pwd:"world", roles:[{role: "userAdmin", db: "admin"}]})

导致错误:

Error: couldn't add user: not authorized on admin to execute command { createUser: "hello", pwd: "xxx", roles: [ { role: "userAdmin", db: "admin" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } }
at Error (<anonymous>)
at DB.createUser (src/mongo/shell/db.js:1101:11)
at (shell):1:4 at src/mongo/shell/db.js:1101

管理数据库是一个特殊的数据库,您自动拥有一个 MongoDB 实例。它包含诸如数据库用户、角色、自定义数据等内容。

要在管理数据库中创建用户,您必须暂时禁用 MongoDB 实例上的身份验证。我不知道compose.io具体是如何工作的,但我通常会修改mongod.conf文件,并将auth=true.

行注释掉

之后,您可以连接到您的 MongoDB shell 并在管理数据库中创建一个用户。

为用户赋予角色 userAdminAnyDatabase,而不仅仅是 useAdmin

use admin
db.createUser({ user:"admin", pwd: "pass", roles: [{role: "userAdminAnyDatabase", db: "admin"}] })

具有userAdminAnyDatabase角色的用户可以管理所有数据库的用户。

现在再次启用身份验证并重新启动服务。

如我所说,我不确定 compose.io 的实际工作原理以及它为您提供了多少控制权。如果您没有管理员帐户,这应该是正确的方法。

顺便说一下,我已经发布了 an article on Medium 关于 MongoDB 3.0 auth.

这解决了我的问题:

I finally got it to work on compose.io! So here it what my oplog url ended up looking like: "MONGO_OPLOG_URL": "mongodb://username:password@single.18.mongolayerhost.com:1111/local?authSource=myDB"
I keep the MONGO_URL exactly the same as the URL compose.io provides with ?replicaSet
But for the OPLOG_URL you can only use a single host, not multiple. So you have to edit the URL compose.io gives you to only have one host. And you can't end the oplog with ?replicaSet. you can only have the ?replicaSet in the MONGO_URL.

source

设置身份验证的流程:

  1. 在没有访问控制的情况下启动MongoDB。

    mongod --port 27017 --dbpath /data/db1

  2. 连接到实例。

    mongo --端口27017

  3. 创建用户管理员。

use admin
    db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
  1. 重新启动具有访问控制的 MongoDB 实例。

    mongod --auth --port 27017 --dbpath /data/db1

  2. 验证为用户管理员。

    使用 -u 、 -p 和 --authenticationDatabase 命令行选项启动 mongo shell:

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

具有 userAdminAnyDatabase 角色的用户可以管理所有数据库的用户。

对于常规用户创建,您必须拥有以下权限:

To create a new user in a database, you must have the createUser action on that database resource.
To grant roles to a user, you must have the grantRole action on the role’s database.

MongoDB 将所有用户信息,包括名称、密码和用户的身份验证数据库存储在 admin 数据库的 system.users 集合中。

更多详情:https://docs.mongodb.com/manual/tutorial/enable-authentication/

你可以试试这个:

   use admin
   db.createUser( { user: "user", pwd: "password", roles: [ 
   "readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin" ] } )