0
点赞
收藏
分享

微信扫一扫

和我一起学MongoDB(十八)MongoDB数据库安全-角色管理

程序员阿狸 2022-03-23 阅读 74

@toc

内建角色

MongoDB通过角色绑定的方式授予用户权限,在MongoDB中,提供了一些默认的内建角色,用于给用户授权

内建角色的特点

内建角色具有以下特点:

  • 在授予用户角色权限时,默认授予于当前的数据库
  • 角色授权可以授予集合级别的粒度
  • 角色授权分为系统集合以及非系统集合的访问权限
  • 每个数据库中的角色都可以分为一般角色和管理角色
  • 管理数据库(admin)可以使用所有的内建角色

内建角色的种类

数据库用户角色

  • read
    用于读取所有的非系统集合,以及以下三个系统集合的数据:system.indexes,system.js,system.namesp
  • readWrite
    拥有read角色的所有权限,并且可以修改所有非系统集合以及system.js集合上的数据

    数据库管理角色

  • dbAdmin
    提供管理相关的功能,如:查询数据库统计信息,索引管理等
  • userAdmin
    提供管理数据库角色和用户的权限。具有这个角色的用户可以为当前数据库的任何用户(包括自己)分配任何角色权限
  • dbOwner
    提供数据库所有者的权限,可以对数据库执行任何管理操作。这个角色等同于readWrite+dbAdmin+userAdmin

    集群管理角色

    这类角色提供管理整个MongoDB的权限,只能在admin数据库中进行授权

  • clusterManager
    提供对集群进行管理和监控的权限
  • clustermonitor
    提供对监控工具(MongoDB Cloud ManagerOps Manager监控代理)只读的访问权限
  • hostManager
    提供监控和管理服务器的权限
  • clusterAdmin
    提供最高的集群管理访问权限,等同于clusterManager+clusterMonitor+hostManager+dropDatabase

    备份和恢复角色

    这类角色只能在admin数据库中进行授权

  • backup
    提供备份数据的权限,这个角色可以进行以下操作:使用MongoDB Cloud Manager备份代理,使用mongodump备份整个mongod实例
  • restore
    提供还原数据库所需的权限,使用户可以使用mongorestore恢复数据

    全数据库角色

    全数据库角色用于管理所有数据库,这类角色只能授权与admin数据库中的用户,并且不适用于localconfig数据库

  • readAnyDatabase
    提供所有数据库的只读权限
  • readWriteAnyDatabase
    提供所有数据库的readWrite权限
  • userAdminAnyDatabase
    提供所有数据库的userAdmin权限。由于角色可以授权自己所有权限,这个角色实际上是一个MongoDB的超级用户
  • dbAdminAnyDatabase
    提供所有数据库的dbAdmin权限

    超级用户角色

    只能在admin数据库中进行授权,此权限可以对所有数据库进行任何操作,也可以定义任何用户的权限。

  • root
    MongoDB的超级用户,具有所有权限
    此外,由于userAdmin权限可以进行授权,所以拥有/间接拥有admin数据库中此角色的userAdmin,dbOwner,userAdminAnyDatabase的用户,权限也可以视为拥有超级用户权限

    内部角色

  • system
    主要用于MongoDB系统内部的操作,不建议将此角色授权给任何用户,防止用户随意对内部系统进行操作。

自定义角色

自定义角色可以让管理者自行定义角色的权限,以及可以使用的数据库。
自定义角色具有以下特点:

  • 在一般数据库上创建的角色,只适用于当前数据库
  • 在admin数据库上创建的角色,适用于所有数据库
  • 创建角色时,角色名称不能重复

    创建自定义角色

    db.createRole()
    语法

    db.createRole(
    {
    role: "<name>",
    privileges: [
    { resource: { <resource> }, actions: [ "<action>", ... ] },
    ...
    ],
    roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
    ],
    authenticationRestrictions: [
    {
    clientSource: ["<IP>" | "<CIDR range>", ...],
    serverAddress: ["<IP>" | "<CIDR range>", ...]
    },
    ...
    ]
    })

    参数说明

  • role: 要创建的角色名称
  • privileges: 授予角色的权限
    • resource: 指定数据库或集合。若数据库设置为空,则默认为当前数据库;若集合设置为空,则默认为全部集合。
    • actions: 指定权限(如remove,update等)
  • roles: 继承已有角色的权限

示例
在admin数据库中,创建一个名称为myRole01的角色,这个角色具有find,insert,remove,update权限,同时该角色继承Product库的roleWrite权限,Carts库的read权限以及admin库的read权限,并且该角色只能从客户端10.0.0.101进行连接,连接的MongoDB服务端地址为10.0.0.10110.0.0.102

use admin
db.createRole({
role:"myRole01",
privileges:[{
resource:{
db:"",collection:""
},
actions:["find","insert","remove","update"]
}],
roles:[
{role:"readWrite",db:"Product"},
{role:"read",db:"Carts"},
{role:"read",db:"admin"}
],
authenticationRestrictions:[{
clientSource:["10.0.0.101"],
serverAddress:["10.0.0.101","10.0.0.102"]
}]
})

修改自定义角色

db.updateRole()
使用该方法会覆盖掉原本角色的所有权限。如果只想修改其中的几个权限或角色,可以使用以下方法

  • db.grantRolesToRole()
  • db.grantPrivilegesToRole()
  • db.revokeRolesFromRole()
  • db.revokePrivilegesFromRole()
    语法
    db.updateRole(
    "<rolename>",
    {
    privileges:
    [
    { resource: { <resource> }, actions: [ "<action>", ... ] },
    ...
    ],
    roles:
    [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
    ],
    authenticationRestrictions:
    [
    {
    clientSource: ["<IP>" | "<CIDR range>", ...],
    serverAddress: ["<IP>", | "<CIDR range>", ...]
    },
    ...
    ]
    },
    { <writeConcern> }
    )

为自定义角色授权

  • db.grantRolesToRole()将角色授予个自定义角色
    语法
    db.grantRolesToRole( "&lt;rolename&gt;", [ &lt;roles&gt; ], { &lt;writeConcern&gt; } )
    示例
    将Product库的readWrite角色授予给myRole01
    db.grantRolesToRole("myRole01",[{role:"readWrite",db:"Product"}])

  • db.grantPrivilegesToRole()
    将权限授予给自定义角色
    语法
    db.grantPrivilegesToRole(
    "< rolename >",
    [
    { resource: { <resource> }, actions: [ "<action>", ... ] },
    ...
    ],
    { < writeConcern > }
    )

    示例

    db.grantPrivilegesToRole(
    "myRole01",
    [{
    resource:{db:"",collection:""},
    actions:["createUser","createRole"]
    }]
    )

取消自定义角色的权限

  • db.revokeRolesFromRole()
    语法
    db.revokeRolesFromRole( "&lt;rolename&gt;", [ &lt;roles&gt; ], { &lt;writeConcern&gt; } )
    示例
    db.revokeRolesFromRole("myRole01",[{role:"readWrite",db:"Product"}])

  • db.revokePrivilegesFromRole()
    语法
    db.revokePrivilegesFromRole(
    "<rolename>",
    [
    { resource: { <resource> }, actions: [ "<action>", ... ] },
    ...
    ],
    { <writeConcern> }
    )

    示例

    db.revokePrivilegesFromRole(
    "myRole01",
    [{
    resource:{db:"",collection:""},
    actions:["createUser","createRole"]
    }]
    )

    删除自定义角色

    删除自定义角色可以使用以下两种方法

  • db.dropRole() 删除指定的自定义角色
    use products
    db.dropRole( "readPrices" )
  • db.dropAllRoles() 删除所有的自定义角色
    use products
    db.dropAllRoles()

    查询自定义角色

    查询自定义角色可以使用以下两种方法

  • db.getRole() 查询指定的自定义角色
  • db.getRoles() 查询所有的自定义角色

详细说明如下:

  • db.getRole() 查询指定的自定义角色
    语法
    db.getRole(rolename, args)
    参数说明
    args为可选参数,有以下两种值可以设定:
    • showPrivileges: 是否显示自定义角色的全部权限,默认为false
    • showAuthenticationRestrictions: 是否显示角色的IP地址管控限制,默认为false

示例

db.getRole("myRole01",{showPrivileges:true,showAuthenticationRestrictions:true})
{
"role" : "myRole01",
"db" : "admin",
"isBuiltin" : false,
"roles" : [
{
"role" : "read",
"db" : "Carts"
}
],
"inheritedRoles" : [
{
"role" : "read",
"db" : "Carts"
}
],
"privileges" : [
{
"resource" : {
"db" : "",
"collection" : ""
},
"actions" : [
"find",
"insert",
"remove",
"update"
]
}
],
"authenticationRestrictions" : [
[
{
"clientSource" : [
"10.0.0.101/32"
],
"serverAddress" : [
"10.0.0.101/32",
"10.0.0.102/32"
]
}
]
],
"inheritedPrivileges" : [
{
"resource" : {
"db" : "",
"collection" : ""
},
"actions" : [
"find",
"insert",
"remove",
"update"
]
},
{
"resource" : {
"db" : "Carts",
"collection" : ""
},
"actions" : [
"changeStream",
"collStats",
"dbHash",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes",
"planCacheRead"
]
},
{
"resource" : {
"db" : "Carts",
"collection" : "system.js"
},
"actions" : [
"changeStream",
"collStats",
"dbHash",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes",
"planCacheRead"
]
}
],
"inheritedAuthenticationRestrictions" : [
[
{
"clientSource" : [
"10.0.0.101/32"
],
"serverAddress" : [
"10.0.0.101/32",
"10.0.0.102/32"
]
}
]
]
}
  • db.getRoles() 查询所有的自定义角色
    ```示例
    db.getRoles(
    {
    showPrivileges:true,
    showBuiltinRoles: true
    }
    )
举报

相关推荐

0 条评论