MongoDB的权限管理

MongoDB 2.4新引入了一套权限控制的机制,而旧的addUser的方法在3.0已经不再提供,这对我们管理MongoDB造成了诸多不便。本文简单总结一下新版MongoDB关于权限管控的一些技巧。
· MongoDB使用了基于角色的访问策略来管理MongoDB的安全控制。可以赋予用于一个或多个权限来让用户能访问数据库的资源并进行某项数据库的操作。如果不对用于赋予权限,用户没有任何权限。
· MongoDB默认不启用安全授权机制。在单节点环境下,你需要在启动mongod时指定–auth,或者在参数里设置auth=true来启用这个特性。如果你是一个shard集群或者RS的环境时,你就需要为每一个节点指定keyfile,这个文件内包含相同的字符串信息(不能包含符号),用于节点成员验证。如果制定了keyfile,就默认对RS/集群启用了auth。例如以此对MongoDB中的member执行:

· MongoDB提供了很多内建角色,用户通用的数据库管理。内建角色的文档在这里http://docs.mongodb.org/manual/reference/built-in-roles/。MongoDB提供了数据库管理权限和数据库用户权限两种类型,其他的权限只能作用于admin数据库上。具体如下:

(1).数据库用户角色

针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色

每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

(3).集群管理权限

admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

(4).所有数据库角色

admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限

root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。
了解权限了之后,就是赋权语句了。新版的函数比之前的要麻烦很多:
db.createUser(user, writeConcern)
user 关于用户的身份认证和访问信息(JSON);
writeConcern这个文档描述MongoDB提供写操作的成功报告。
user文档,定义了用户的以下形式:

user文档字段介绍:
user字段,用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;roles字段,可以指定内置角色和用户定义的角色。
那么创建一个管理员,直接给几个所有数据库权限即可。

创建某个数据库的只读权限,该用户首先要使用”use db_name;”到对应的数据库下创建权限,否则它会创建在其他数据库下面(比如admin)。

以此类推。我们可以通过db.auth("username","password")或者下面的方式来验证:
mongo -u test -p test.com --authenticationDatabase test
除了db.createUser(),下面几个函数也是常用的:
获得数据库的所有用户权限信息:db.getUsers()
获得某个用户的权限信息:db.getUser()
创建角色: db.createRole()
更新角色:db.updateRole()
删除角色:db.dropRole()
获得某个角色信息:db.getRole()
删除用户:db.dropUser()
删除所有用户:db.dropAllUsers()
将一个角色赋予给用户:db.grantRolesToUser()
撤销某个用户的某个角色权限:db.revokeRolesFromUser()
更改密码:db.changeUserPassword()
更多内容可以去看下reference

^^

Posted in Database, NoSQL.