【问题标题】:MongoDB "root" userMongoDB“根”用户
【发布时间】:2013-12-05 16:40:38
【问题描述】:

MongoDB 是否有类似“root”用户的超级 UNIX?我一直在查看http://docs.mongodb.org/manual/reference/user-privileges/ 并尝试了许多组合,但它们似乎都缺少某个区域。肯定有一个角色比上面列出的所有角色都重要。

【问题讨论】:

    标签: mongodb authentication mongodb-query authorization roles


    【解决方案1】:

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

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

    更多详情请看built-in roles.

    希望对你有帮助!!!

    【讨论】:

    • 谢谢 - admin 数据库是这里的连接数据库
    • 我看到有些人在 'roles' 属性中使用 'db'。那么,如果我们没有 'db' 怎么办?我创建了用户并分配了角色“root”但 db:“admin”,现在我无法使用 mongoose 访问其他集合。你能告诉我如何解决这个问题,因为我对这种技术很陌生。
    • 另外,如果从--eval运行命令,你必须在createUser之前使用db.getSiblingDB("admin"),否则会在默认测试数据库中创建admin root用户,这不是我们通常的会想要的。
    • 使用 createUser 方法创建 root 用户时,您需要在数据库管理员中,所以首先在 mongo shell 中键入“use admin”,然后您可以使用 createUser 方法,如果您不这样做'您可能会收到此错误:“未捕获的异常:错误:无法添加用户:没有名为 root@something 的角色”
    【解决方案2】:

    虽然 MongoDb 开箱即用,但没有身份验证,您可以通过使用 admin 数据库中特定用户的“任何”角色来创建等效的 root/超级用户。

    类似这样的:

    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 已被删除。

    3.0.7+ 更新

    root 不再有上述限制。

    root 对系统具有验证权限操作。收藏品。 以前,root 不包括对开始的集合的任何访问权限 与系统。前缀不是 system.indexes 和 系统命名空间。

    【讨论】:

    • addUser 自 3.2.3 上的 2.6 起已弃用,我使用了 db.createUser
    • from this linkChanged in version 3.0.7: The root has validate action on system. collections. Previously, root does not include any access to collections that begin with the system. prefix other than system.indexes and system.namespaces.
    • 一些错误:db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "xxxxxxx" } ] }); 2018-02-26T16:59:28.688+0500 E QUERY [thread1] 错误:无法添加用户:没有名为 userAdminAnyDatabase@xxxxxx 的角色:_getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype。 createUser@src/mongo/shell/db.js:1267:15 @(shell):1:1
    • 我更喜欢 @Jerry 的回答。
    【解决方案3】:

    MongoDB用户管理:

    角色列表:

    read
    readWrite
    dbAdmin
    userAdmin
    clusterAdmin
    readAnyDatabase
    readWriteAnyDatabase
    userAdminAnyDatabase
    dbAdminAnyDatabase
    

    创建用户:

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

    更新用户:

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

    删除用户:

    db.removeUser("user")
    

    db.dropUser("user")
    

    查看用户:

    db.getUsers();
    

    更多信息:https://docs.mongodb.com/manual/reference/security/#read

    【讨论】:

    • db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "xxxxxxx" } ] }); 2018-02-26T16:59:28.688+0500 E QUERY [thread1] 错误:无法添加用户:没有名为 userAdminAnyDatabase@xxxxxx 的角色:_getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype。 createUser@src/mongo/shell/db.js:1267:15 @(shell):1:1
    • 查询: db.createUser({ user: "dev1", pwd: "pass", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); 结果: Successfully added user: { "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
    • 您是否在系统中创建了 userAdminAnyDatabase 规则,或者它已经存在?为什么它不在我的系统中。我正在使用centOS 7
    【解决方案4】:

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

    【讨论】:

    • 是的,为了记录,root 角色是在 MongoDB 2.6 中引入的。
    【解决方案5】:

    我注意到很多这样的答案,使用这个命令:

    use admin
    

    切换到管理数据库。至少在 Mongo v4.0.6 中,在 admin 数据库的上下文中创建用户会创建一个带有"_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 命令,通常用于更新用户密码。

    【讨论】:

      【解决方案6】:

      通常的做法是拥有一个仅用于整个系统的身份验证数据的数据库。 在连接 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"
          } ] });
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多