MongoDB" root"用户

时间:2013-11-21 09:32:24

标签: mongodb authentication mongodb-query authorization roles

MongoDB是否有类似“root”用户的超级UNIX?我一直在寻找http://docs.mongodb.org/manual/reference/user-privileges/并尝试了很多组合,但它们似乎都缺乏一个区域或另一个区域。当然,有一个角色高于那里列出的角色。

7 个答案:

答案 0 :(得分:76)

开箱即用时,MongoDb没有身份验证,您可以通过对admin数据库的特定用户使用“any”角色来创建等效的超级用户。

这样的事情:

use admin
db.addUser( { user: "<username>",
          pwd: "<password>",
          roles: [ "userAdminAnyDatabase",
                   "dbAdminAnyDatabase",
                   "readWriteAnyDatabase"

] } )

更新2.6 +

虽然2.6中有一个新的root用户,但您可能会发现它不符合您的需求,因为它仍有一些限制:

  

提供对操作和操作的所有资源的访问   readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase和   clusterAdmin角色组合。

     

root不包含对以#开头的集合的任何访问权限   系统。前缀。

更新3.0 +

使用db.createUser,因为db.addUser已被删除。

答案 1 :(得分:68)

最佳超级用户角色是root。语法是:

use admin

db.createUser(
{
    user: "root",
    pwd: "password",
    roles: [ "root" ]
})

有关详细信息,请查看built-in roles.

希望这有帮助!!!

答案 2 :(得分:20)

Mongodb user management:

roles list:

read
readWrite
dbAdmin
userAdmin
clusterAdmin
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase

create user:

db.createUser(user, writeConcern)

db.createUser({ user: "user",
  pwd: "pass",
  roles: [
    { role: "read", db: "database" } 
  ]
})

update user:

db.updateUser("user",{
  roles: [
    { role: "readWrite", db: "database" } 
  ]
})

drop user:

db.removeUser("user")

or

db.dropUser("user")

view users:

db.getUsers();

more information: https://docs.mongodb.com/manual/reference/security/#read

答案 3 :(得分:6)

有一个超级用户角色:root,这是一个内置角色,可以满足您的需求。

答案 4 :(得分:2)

我注意到了很多这样的答案,请使用以下命令:

use admin

切换到管理数据库。至少在Mongo v4.0.6中,在管理数据库的上下文中创建用户将使用"_id" : "admin.administrator"创建用户:

> use admin
> db.getUsers()
[ ]
> db.createUser({ user: 'administrator', pwd: 'changeme', roles: [ { role: 'root', db: 'admin' }  ] })
> db.getUsers()
[
    {
        "_id" : "admin.administrator",
        "user" : "administrator",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]

我强调"admin.administrator",因为我有一个Mongoid(mongodb ruby​​适配器)应用程序,其数据库与admin不同,并且我使用URI在mongoid.yml配置中引用了该数据库:

development:
  clients:
    default:
      uri: <%= ENV['MONGODB_URI'] %>
      options:
        connect_timeout: 15
        retry_writes: false

这引用了以下环境变量:

export MONGODB_URI='mongodb://administrator:changeme@127.0.0.1/mysite_development?retryWrites=true&w=majority'

请注意,数据库是mysite_development,而不是admin。尝试运行该应用程序时,出现错误“用户管理员(机制:scram256)无权访问mysite_development”。

所以我回到Mongo shell删除用户,切换到指定的数据库并重新创建用户:

$ mongo
> db.dropUser('administrator')
> db.getUsers()
[]
> use mysite_development
> db.createUser({ user: 'administrator', pwd: 'changeme', roles: [ { role: 'root', db: 'admin' }  ] })
> db.getUsers()
[
    {
        "_id" : "mysite_development.administrator",
        "user" : "administrator",
        "db" : "mysite_development",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ],
        "mechanisms" : [
            "SCRAM-SHA-1",
            "SCRAM-SHA-256"
        ]
    }
]

请注意,_id和db更改为引用我的应用程序所依赖的特定数据库:

"_id" : "mysite_development.administrator",
"db" : "mysite_development",

进行此更改后,错误消失了,我能够在应用程序内部正常连接到MongoDB。

附加说明:

在上面的示例中,我删除了用户,然后在正确的数据库上下文中重新创建了该用户。如果您已经在正确的数据库上下文中创建了用户,但是赋予了错误的角色,则可以为用户分配一个mongodb内置角色:

db.grantRolesToUser('administrator', [{ role: 'root', db: 'admin' }])

还有一个db.updateUser命令,通常用于更新用户密码。

答案 5 :(得分:0)

通常的做法是拥有一个仅用于整个系统的身份验证数据的数据库。 在连接 uri 上,除了指定要连接使用的数据库外,您还可以指定要对其进行身份验证的数据库。

<块引用>

"mongodb://usreName:passwordthatsN0tEasy2Gue55@mongodb.myDmoain.com:27017/enduserdb?authSource=myAuthdb"

这样您就可以在该单个身份验证数据库中创建所有用户凭据和角色。 如果你想要一个全部并结束一个数据库上的所有超级用户,你只需赋予“root@thedbinquestion”的角色 例如...

use admin
db.runCommand({ 
"updateUser" : "anAdminUser", 
"customData" : {

}, 
"roles" : [
    {
        "role" : "root", 
        "db" : "thedbinquestion"
    } ] });

答案 6 :(得分:-1)

“userAdmin实际上是特定数据库的超级用户角色。具有userAdmin的用户可以授予自己所有权限。但是,userAdmin不会明确授权用户获得用户管理之外的任何权限。”来自the link you posted