美文网首页
mongodb权限简介

mongodb权限简介

作者: nextliving | 来源:发表于2018-07-03 09:27 被阅读53次

    mongodb概念

    权限模型

    mongodb使用基于角色的认证授权模型,也就是我们熟知的RBAC权限模型,参考Role-Based Access Control。mongodb中的所有角色都存储在admin数据库(database)的admin.system.roles集合(collection)中。

    collection

    mongodb的database类似关系型数据库的database,mongodb的collection类似关系型数据库的table。

    document

    mongodb的document类似关系型数据库某个标中的一条数据记录(row)。另外,在mongodb的语境中,object也经常指的是document。如果某个document的某个field的类型为document或者object,并不是指在该文档中又引用了另一个文档,仅仅表示document中又嵌套了一层json而已。

    privilege

    mongodb的某个权限(privilege)包含了资源(resource)和对应的操作(privilege action)。当用户需要自定义role时,会使用到resource,比如db.createRole()给出了下面的创建示例:

    use admin
    db.createRole(
       {
         role: "myClusterwideAdmin",
         privileges: [
           { resource: { cluster: true }, actions: [ "addShard" ] },
           { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
           { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
           { resource: { db: "", collection: "" }, actions: [ "find" ] }
         ],
         roles: [
           { role: "read", db: "admin" }
         ]
       },
       { w: "majority" , wtimeout: 5000 }
    )
    

    Privilege Actions

    Privilege Actions指的是一个用户可以在某个资源(resource)上进行的操作(action),,在具体实现上对应的就是各个command,比如db.collection.find()中的find就是一个action。所有可以进行的操作(action)都由mongodb定义并提供给用户使用,用户自己无法定义或者创建某种操作(action)。所有的action列表可以参阅mongodb官网的Privilege Actions部分

    Resource Document

    Resource Document用于定义某个Privilege Action对应的resource.Resource Document的基本书写格式为{ db: <database>, collection: <collection> },具体如何书写参考mongodb官网Resource Document部分。

    role

    一个role对应多个权限(privilege),查看某个role的所有privilege可以使用命令rolesInfo
    可以在创建用户时指定该用户的role以及该用户在哪些数据库(database)上拥有该角色。mongodb提供了很多mongodb提供了很多built-in roles(内置角色),一般够用了,如果不能满足需求,可以自定义role。自定义role参考Create a User-Defined Roledb.createRole()

    built-in role

    mongodb提供了很多built-in roles(内置角色),包括每一个database都拥有的用户角色和管理角色,以及只有admin这个特殊数据库上才有的角色。admin上特有的角色包括Cluster Administration Roles、Backup and Restoration Roles、All-Database Roles等。更多参考Built-In Roles。某个角色被特定数据库拥有什么意思呢?指的是创建用户时,role对应的db必须是拥有该角色的db。举一个例子,要创建一个在所有数据库中都可以读写的用户,role值"readWriteAnyDatabase"对应的db必须是admin,不能是test等其它数据库,类似下面这样:

    
    use admin
    
    db.createUser(
    
     {
    
     user: "myCommonUser",
    
     pwd: "abc123",
    
     roles: [ { role: "readWriteAnyDatabase", db: "admin" } ]
    
     }
    
    )
    
    

    如果创建用户时readWriteAnyDatabase角色对应的db使用了test等其它数据库:

    
    use admin
    
    db.createUser(
    
     {
    
     user: "myCommonUser",
    
     pwd: "abc123",
    
     roles: [ { role: "readWriteAnyDatabase", db: "test" } ]
    
     }
    
    )
    
    

    则会报错:

    
    2018-07-03T09:17:59.757+0800 E QUERY [thread1] Error: couldn't add user: No role named userAdminAnyDatabase@test :
    
    _getErrorWithCode@src/mongo/shell/utils.js:25:13
    
    DB.prototype.createUser@src/mongo/shell/db.js:1267:15
    
    @(shell):1:1
    
    

    也就是普通数据库test中没有userAdminAnyDatabase这个角色。

    authentication database

    用户的authentication database就是创建该用户时的数据库。通过mongo shell操作时通过参数--authenticationDatabase指定。而该用户要读写数据的数据库通过参数-d指定。mongodb官网对此的解释是:

    
    The database where you create the user (in this example, admin) is the user’s authentication database. Although the user would authenticate to this database, the user can have roles in other databases; i.e. the user’s authentication database does not limit the user’s privileges.
    
    

    权限管理功能

    mongodb默认没有启用权限管理功能。如果需要启用权限管理功能,共有2种方法。(1)启动mongod时添加参数--auth,关于该参数参考auth.(2)mongod.conf文件中配置security.authorization=enabled,该参数默认值为disabled.启动mongod时需要指定使用该配置文件。

    权限管理用户

    根据mongodb官网的建议,创建的第一个用户最好是具有管理其它用户权限的用户管理员,这个用户一般具有类似userAdminAnyDatabase的权限。参考mongdb官网Enable Auth部分。

    添加用户管理员账户

    使用命令$ mongod --config /usr/local/etc/mongod.conf启动mongod服务。然后新打开一个终端,执行命$ mongo令打开mongo shell,该命令会默认连接本机的27017端口,如果需要连接其他机器或者其它端口添加--port--host参数。启动mongo shell界面如下:

    
    MongoDB shell version: 3.2.7
    
    connecting to: test
    
    Server has startup warnings: 
    
    2018-07-02T19:17:36.136+0800 I CONTROL [initandlisten] 
    
    2018-07-02T19:17:36.136+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
    
    >
    
    

    执行命令

    
    > db.createUser({ user:"myUserAdmin",pwd:"123",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
    
    

    终端输出如下信息:

    
    Successfully added user: {
    
    "user" : "myUserAdmin",
    
    "roles" : [
    
    {
    
    "role" : "userAdminAnyDatabase",
    
    "db" : "admin"
    
    }
    
    ]
    
    }
    
    

    该示例证实了一点,在非admin数据库中可以创建具有管理员权限的用户,只不过具有管理权限的角色对应的db必须是admin.

    启用权限管理

    首先关闭mongod和mongo shell。使用命令$ mongod --config /usr/local/etc/mongod.conf --auth重新启动mongod,再执行$ mongo,终端输出

    
    MongoDB shell version: 3.2.7
    
    connecting to: test
    
    >
    
    

    执行> db.getUsers()输出

    
    2018-07-02T19:34:08.295+0800 E QUERY [thread1] Error: not authorized on test to execute command { usersInfo: 1.0 } :
    
    _getErrorWithCode@src/mongo/shell/utils.js:25:13
    
    DB.prototype.getUsers@src/mongo/shell/db.js:1523:1
    
    @(shell):1:1
    
    > 
    
    

    说明没有权限。执行命令$ db.auth("myUserAdmin","123"),终端输出1.再执行> db.getUsers()输出

    
    [
    
    {
    
    "_id" : "test.myUserAdmin",
    
    "user" : "myUserAdmin",
    
    "db" : "test",
    
    "roles" : [
    
    {
    
    "role" : "userAdminAnyDatabase",
    
    "db" : "admin"
    
    }
    
    ]
    
    }
    
    ]
    
    

    说明认证成功。其实可以在一开始连接mongo shell时使用$ mongo -u "myUserAdmin" -p "123" --authenticationDatabase "test"指定认证信息,如果连接mongo shell时没指定认证信息,后面只有通过db.auth()去认证了。

    删除用户

    使用命令> db.dropUser("myUserAdmin"),终端输出true.重新启动mongod和mongo shell,并且启动mongod时不加--auth参数,在mongo shell中执行> db.getUsers()输出[],说明删除成功。

    相关文章

      网友评论

          本文标题:mongodb权限简介

          本文链接:https://www.haomeiwen.com/subject/plcduftx.html