注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MongoDB认证和授权详解

MongoDB 彭东稳 9702次浏览 已收录 0个评论

MongoDB权限控制系统简介

对于数据库的管理,一般DBA都不会给开发过大的权限,避免如开发建立索引不加[backgroud:true]导致线上操作巨卡、误删除业务库或集合数据、对集合每个字段添加单列索引导致容量急剧膨胀,还有各种突破认知范围的误操作。由于MongoDB早期版本自身对权限控制极其简单粗暴,一般DBA都是授予开发最高权限。随着MongoDB3.X版本的发布,在权限控制这块算是比较完善了,下面主要介绍MongoDB权限控制系统。

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

  • user

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

  • role

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

  • resource

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

  • actions

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

  • privilege

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

  • authenticationDatabase

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

MongoDB用户的角色说明

角色是什么?就是对某一资源的权限的“集合”。在MongoDB中有两种角色,一种是知道的角色,一种是自定义的角色。下面先说说内置的角色,可满足大部分用户的需求。

第一种:内置角色介绍

1)read

数据库的只读权限,包括:

aggregate,checkShardingIndex,cloneCollectionAsCapped,collStats,count,dataSize,dbHash,dbStats,distinct,filemd5,mapReduce (inline output only),text (beta feature)geoNear,geoSearch,geoWalk,group。

2)readWrite

数据库的读写权限,包含read角色的所有权限,包括:

cloneCollection (as the target database.),convertToCapped,create (and to create collections implicitly.),renameCollection (within the same database.)findAndModify,mapReduce (output to a collection.),drop(),dropIndexes,emptycapped,ensureIndex()。

3)dbAdmin

数据库的管理权限,包括:

clean,collMod,collStats,compact,convertToCappe,create,db.createCollection(),dbStats,drop(),dropIndexes
ensureIndex(),indexStats,profile,reIndex,renameCollection (within a single database.),validate。

4)userAdmin

数据库的用户管理权限。

5)clusterAdmin

集群管理权限(副本集、分片、主从等相关管理)。

6)readAnyDatabase

任何数据库的只读权限,和read相似,但它是全局的。

7)readWriteAnyDatabase

任何数据库的读写权限,和readWrite相似,但它是全局的。

8)userAdminAnyDatabase

任何数据库用户的管理权限,和userAdmin相似,但它是全局的。

9)dbAdminAnyDatabase

任何数据库的管理权限,dbAdmin相似,但它是全局的。

10)backup、restore

数据的备份和恢复权限。

11)root

超级用户权限,只能针对admin库。

第二种:自定义角色

MongoDB内置角色一般来说都是够用的,但是当内置角色不满足需求时就可以自定义角色了。其实自定义角色也很简单,语法如下:

如下示例:

上述语句在admin库里创建了一个名为test的角色,该角色具有对数据库ywnds下的所有集合进行 find、insert、remove、update的操作的权限。角色创建完毕后 MongoDB会在系统库admin 下创建一个系统collection名叫system.roles  里面存储的即是角色相关的信息。可以使用如下语句进行查看:

操作角色(以下操作都基于admin库)

查看角色

角色继承

角色授权

角色移权

删除角色

MongoDB认证授权说明

一、MongoDB单实例认证

MongoDB安装时不添加任何参数,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库,如果需要开启MongoDB身份验证,那么需要在命令行启动MongoDB时加上–auth参数启动(或配置文件中使用auth=True),这样当MongoDB启动后再次登录就需要用户和密码进行认证了。

在刚安装完毕的时候,MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。当admin.system.users一个用户都没有时,如果mongod启动时添加了–auth参数,那么就尴尬了。

MongoDB的访问分为认证和授权,所以使用–auth参数开启认证后,虽然还是可以不进行认证直接进入数据库,但是不会有任何的权限进行任何操作,当执行命令时会报如下错误:

由此看出,一旦开启认证后授权就会生效了。如果登录时没进行用户认证,那么就没有任何权限执行任何命令。此时有两种办法,第一就是关掉MongoDB,先添加完用户再开启用户认证;第二种就是MongoDB还提供了一个参数,就是在开启认证的情况下允许本地连接MongoDB,就是使用localhost连接,其余一律不接受。此时就可以把这两个参数同时使用上,即开启认证时又没有添加任何用户的情况下允许本地无认证连接进行数据库操作。

注意:这个参数的使用有如下几条限制。

1)这个参数只能在开启认证的情况下,并且没有任何用户的情况下才生效,否则无效。

2)满足第一个条件时,只允许本地以localhost的方式进行连接MongoDB,否则无效。

3)满足第一个条件时,当进入到MongoDB后如果创建了一个用户后,此参数将失效,就是本地无法登陆了。

4)以此方式创建的用户必须是admin库的,同时必须能够具备创建其他用户的权限。

在MongoDB授权部分,其中admin数据库中的用户名可以管理所有数据库,其他数据库中的用户只能管理其所在的数据库。在2.4之前版本中,用户的权限分为只读和拥有所有权限。2.4版本的权限管理主要分为:数据库的操作权限、数据库用户的管理权限、集群的管理权限,建议由超级用户在admin数据库中管理这些用户。不过依然兼容2.4版本之前的用户管理方法。

二、MongoDB复制集认证

上面说的都是针对单实例MongoDB,如果使用MongoDB复制集的话,那么情况与一点点变化了。如果在复制集机制下开启了–auth认证,那么此时MongoDB复制集状态就会变成不健康状态,这就需要另外一个认证方式了“KeyFile”。简单来说“KeyFile”就是用在复制集群间开启认证的情况下需要的另外一种认证方式,用来验证集群间身份的。在复制集模式下,开启KeyFile之后就需要再开启你–auth了,因为开启KeyFIle后就会自动开启认证功能。

开启KeyFile也非常简单,需要在每个节点主机上创建一个文件,然后给一些字符串,但是复制集各个节点上的字符串必须相同,才能进行身份验证。如下所示,手动生成一个KeyFile:

生成KeyFile时需要注意,不用在意空格、tab以及换行符的,KeyFile都会自动去掉的。

KeyFile注意事项:

1)内容:base64编码,所以不能超出这个范围[a-zA-Z+/]

2)长度:1000bytes

3)权限:chmod 600 KeyFile

KeyFile生成好之后,就可以同步到各个节点间了,然后在各个节点的配置文件中把KeyFile文件指定进来即可。

然后给权限为600即可。

前面已经说了,开启了KeyFile后就不需要添加auth=true参数了,默认会开启认证的。然后重启复制集各个节点就完成认证了。

另外在复制集模式下,在整个认证配置完成前不要创建任何用户,当整个认证好了之后,下面就可以创建用户了。

MongoDB创建和删除用户

以下讲解都是基本MongoDB 3.0+以上的版本。

一、不开启认证,进行用户创建

1)首先,我们需要在不认证的情况下在admin库中创建一个高权限用户,也就是需要在不认证情况下启动MongoDB

给出一个简单的配置文件,具体安装配置MongoDB可以看MongoDB安装(安装包版)MongoDB安装(二进制版)

启动MongoDB

2)打开mongo shell

接着,在命令窗口中输入:

看到只有一个local数据库,admin是不存在的(这是3.0以上版本改变了的),我们需要自己给他创建个admin数据库。

3)添加管理用户

user:指定用户名。

pwd:指定用户密码。

roles:指定角色名称以及角色的认证库。

4)切换到admin下,查看刚才创建的用户:

怎么关闭mongoDB?千万不要 kill -9 pid,可以kill -2 pid 或 db.shutdownServer()。

二、开启认证,进行用户认证

1)使用–auth参数启动MongoDB,当添加完一个高权限用户后就可以开启认证了。

在配置文件中添加auth参数,然后再开启mongod。

2)打开mongo shell进行认证

进行认证,需要注意的是我们在哪个库创建的用户就需要在那个库进行认证。

此时

报错

因为,用户admin只有用户管理的权限。

3)下面创建用户,用户都跟着库走,创建的用户都是

4)查看刚刚创建的用户

5)查看整个mongoDB全部的用户。

6)创建完毕,验证一下。

显然没有权限,那我们就先进行认证。

完毕!

三、查看用户

四、用户密码修改

利用db.changeUserPassword()就可以修改用户的密码,如下:

五、删除用户

使用db.dropUser(<user_name>)进行指定用户删除,如下:

还可以使用db.dropAllUsers()删除当前库的所有用户,如下:

就可以把admin库的所有用户都删除了。

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

如果既想实现精细化权限控制又想简化用户管理,原则上建议只给开发创建一个账户,并且使用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/


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (5)or分享 (0)
关于作者:

您必须 登录 才能发表评论!