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

echo "mongomemberspassword" > /etc/mongod.key
echo "keyfile=/etc/mongod.key" >> /etc/mongod.conf
chown mongodb:root /etc/mongod.key
chmod 600 /etc/mongod.key
service mongod restart


· 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文档,定义了用户的如下形式:ui

{ user: "<name>",
  pwd: "<cleartext password>",
  customData: { <any information> },
  roles: [
    { role: "<role>", db: "<database>" } | "<role>",
    ...
  ]
}


user文档字段介绍:spa

user字段,用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如能够为用户全名介绍;
roles字段,指定用户的角色,能够用一个空数组给新用户设定空角色;roles字段,能够指定内置角色和用户定义的角色。
那么建立一个管理员,直接给几个全部数据库权限便可。rest

db.createUser({
user:"test",
pwd:"test.com",
roles:
[
  {
    role:"userAdminAnyDatabase",
    db:"admin"
  },
  {
    role:"readWriteAnyDatabase",
    db:"admin"
  },
  {
    role:"dbAdminAnyDatabase",
    db:"admin"
  }
]})


建立某个数据库的只读权限,该用户首先要使用”use db_name;”到对应的数据库下建立权限,不然它会建立在其余数据库下面(好比admin)。code

db.createUser({
user:"test",
pwd:"test.com",
roles:
[
  {
    role:"read",
    db:"test"
  }
]

以此类推。咱们能够经过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()

相关文章
相关标签/搜索