注册
登录

您现在的位置是:首页 > 学无止境

MongoDB 3.0 的权限控制系统简介

木木彡82 2017-04-30 21:30:41 200人围观
转载自:http://mp.weixin.qq.com/s/YzWcAyE_VzYVvBjV_ta3Iw
举个栗子


开发:“给我们最高权限吧,我们用起来方便”


两天后...


开发:“喂喂 DBA 吗我们的库怎么巨卡无比,你们搞什么啊?”

DBA :“....哦...

转载自:http://mp.weixin.qq.com/s/YzWcAyE_VzYVvBjV_ta3Iw

举个栗子

开发:“给我们最高权限吧,我们用起来方便”

两天后...

开发:“喂喂 DBA 吗我们的库怎么巨卡无比,你们搞什么啊?”

DBA :“....哦,你们是不是创建索引没加backgroud:true ?”

开发:“.... .... ... 好像是”

这就是我们没有权限控制前的日常,建索引不加 [backgroud:true] 、直接误删业务库或集合数据、对集合每个字段添加单列索引导致容量急剧膨胀还有各种突破认知范围的误操作。

由于 MongoDB 早期版本自身对权限控制极其简单粗暴,DBA 为了兼容不同版本的可用性在权限控制上也只能对业务用户授予“超级”(root)用户权限。这也就相当于给伟大的开发开启了邪恶的“番多拉之盒”。

随着MongoDB 3.x 版本的大规模上线,为了避免线上误操作及一些其他人为低级错误,我们迫切需要引入更精细化的权限控制机制。从 MongoDB 2.6  版本 开始 MongoDB 已经开始尝试引入相对精细的权限控制,不过直到 MongoDB 3.0 版本权限体系才算相对完善,所以本文将主要介绍 MongoDB 3.0 版本的权限控制机制。

权限概念

要想理解清楚MongoDB的权限必须先了解如下一些关键字。

user:

即用户,用于提供客户端连接MongoDB的认证账户。

role:

即角色,数据权限的集合,创建用户的时候必须要指定对应的角色,否则用户无法操作数据库。

resource:

即资源,包括database或collection也可以是database和collection的组合例如:{ db:, collection:}当然你也可能看到一种特殊的资源: {"cluster" : true}它其实表示的是全局资源。

actions:

即权限操作,"actions" 定义了"user"能够对 "resource document"执行的操作例如,增删改查包括如下操作:find、insert、remove、update

privilege:

即权限,"privilege" 是一组"resource" 和 "actions" 的组合。

authenticationDatabase:

认证库,即创建角色或用户时所在的库例如,在 admin 下创建了 MongoDB 用户那么登陆的时候需要指定认证库。


关于角色

MongoDB 里角色分为 ”内建角色“ 和 ”用户自定义“ 角色两种,内建角色是 MongoDB 为了方便用户管理和内部操作进行的预定义的一些角色。多数时候为了精细化权限控制 MongoDB 的内建角色无法满足我们的需求,因此需要 DBA 自定义角色来进行更加详细的权限控制。

创建角色

上述语句在 admin 库里创建了一个名为 testrole的角色,该角色具有对数据库lidan下的所有集合进行 find、insert、remove、update的操作的权限。

角色创建完毕后 MongoDB 会在系统库 admin 下创建一个系统collection名叫system.roles  里面存储的即是角色相关的信息。可以使用如下语句进行查看:


查看角色


角色继承


角色授权

执行完操作后testrole角色便可以对库lidan_1下的所有集合进行 "createCollection", "dropCollection","convertToCapped" 操作。

角色权限回收

执行完操作后testrole角色对库lidan_1下的所有集合无法进行 "createCollection", "dropCollection","convertToCapped" 操作。

删除角色


关于用户创建用户

MongoDB 创建用户时可以指定内建角色也可以使用用户自定义角色,DBA 可以根据需求自行决定(注意:用户不允许在local库下创建用户)


用户创建成功后可以使用如下语句登陆:

查看用户


为用户 添加/回收 角色


删除用户


另外,除上述对用户的操作方法外还有其他对用户的管理方法。这里就不一一列举。

注意事项
  1. 在 MongoDB 中删除库和集合并不会级联删除对应的角色和用户。因此如果想彻底删除对应的业务库因该先删除库及其对应的角色和用户。

  2. 如果既想实现精细化权限控制又想简化用户管理,原则上建议只给开发创建一个账户,并且使用 admin 做认证库,这样可避免清理过期业务库而导致无法登陆的问题

相关连接:

  • MongoDB 内建角色介绍:https://docs.mongodb.org/manual/reference/built-in-roles/

  • MongoDB  权限操作列表:https://docs.mongodb.org/manual/reference/privilege-actions/#security-user-actions

  • MongoDB 角色管理方法:https://docs.mongodb.org/manual/reference/method/js-role-management/

  • MongoDB  用户管理方法:https://docs.mongodb.org/manual/reference/method/js-user-management/



文章评论

  • 登录后评论

点击排行