2017.09.18 19:04:25字数 1174阅读 772html
https://www.jianshu.com/p/cead54bd1e81mongodb
MongoDB认证和受权详解
MongoDB安全介绍及配置身份认证
MondoDB安全数据库
要想了解MongoDB的权限必须先了解以下一些关键字:vim
user:
用户,用于提供客户端链接MongoDB的认证帐户;centos
role:
角色,数据权限的集合,建立用户的时候必需要指定对应的角色,不然用户没法操做数据库;数组
resource:
资源,包括database或collection 也能够是database和collection的组合;
如 {db:<db>, collection:<collection>}
安全
actions:
权限操做,定义了 user 可以对 resource document 执行的操做;
如 增、删、改、查;服务器
privilege:
权限,privilege 是一组 resource 和 action的组合,对资源拥有什么操做称为权限;工具
authenticationDatabase:
认证库,及建立角色或用户时所在的库;
如,在admin下建立MongoDB用户那么登陆的时候须要指定认证库 admin;
在 test 库下建立的用户登陆的时候指定认证库 test;spa
MongodDB存储全部的用户信息在admin数据库的集合system.users中,保存数据库、密码和数据库信息。MongoDB默认不启用权限认证,只要能链接到服务器,就可链接到mongod。
若要启用安全认证,须要更改配置文件Authorization,也可简写为 auth。或者在命令行启动MongoDB时加上 -auth
参数启动,这样当MongoDB启动后就须要用户和密码进行认证了。
这是老版本MongoDB2.x中:
vim /etc/mongod.conf auth = true
MongoDB3.x中:
vim /etc/mongod.conf security: authorization:enabled
可是,不使用用户名和密码依然能够链接到数据库。可是将没有权限查看数据库。这里能够认证用户:
mongo use 库(如admin) db.auth("user","pwd")
或直接 mongo 127.0.0.1/admin -u user -p
来链接数据库。
在MongoDB受权部分,其中admin数据库中的用户名能够管理全部的数据库,其余数据库中的用户只能管理其所在的数据库。
若是在副本集机制下开启了 -auth
认证,那么此时MongoDB副本集状态就会变成不健康状态,这就须要另一个认证方式 KeyFile
。
简单来讲 KeyFile
就是用在副本集群间开启认证的状况下须要的另外一种认证方式,用来验证集群间身份的。
在各个节点的配置文件中加入KeyFile(600):
vim /etc/mongod.conf security: authorization:enabled KeyFile:/path/.KeyFile
在副本集模式下,在整个配置完成前不要建立任何用户,当认证好了以后,就能够建立用户了。
MondoDB支持基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。一个用户能够被受权一个或多个角色以决定该用户对数据库资源和操做的访问权限。在权限之外,用户是没法访问系统的。
数据库角色在建立用户的role参数中设置。角色分为內建角色和自定义角色。
MongoDB內建角色包括如下几类:
read:容许用户读取指定数据库; readWrite:容许用户读写指定数据库;
dbAdmin:容许用户进行索引建立、删除,查看统计或访问system.profile,但没有角色和用户管理的权限; userAdmin:提供了在当前数据库中建立和修改角色和用户的能力; dbOwner:提供对数据库执行任何操做的能力。这个角色组合了readWrite、dbAdmin和userAdmin角色受权的特权;
hostManager:提供监视和管理服务器的能力; clusterManager:在集群上提供管理和监视操做。能够访问配置和本地数据库,这些数据库分别用于分片和复制; clusterMonitor:提供对监控工具的只读访问; clusterAdmin:提供最强大的集群管理访问(副本集、分片、主从等)。组合了clusterManager、clusterMonitor和hostManager角色的能力,还提供了dropDatabase操做;
backup:提供备份数据所需的能力; restore: 提供使用mongorestore恢复数据的能力;
readAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的读权限; readWriteAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的读写权限; userAdminAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的userAdmin权限; dbAdminAnyDataBase:只在admin数据库中可用,赋予用户全部数据库的adAdmin权限;
root:超级权限,只能针对admin库;
__system:提供对数据库中任何对象的任何操做的特权;
MongoDB内置角色通常来讲都是够用的,但当内置角色不知足需求时就能够自定义角色了。使用 db.createRole()
方法来自定义角色。
只能在 admin库 中建立角色;
use admin db.createRole( { role:<role_name>, #定义角色名称 privilege:[ #权限集 {resource:{cluster:true, actions:[<action_name>]}, {resource: {db:<db_name>, collection:<coll_name>}, actions:[<action_name>]} #定义对这个库或集合可进行的权限操做,这是一个数组 ], roles:[{role:<role_name>, db:<db_name>}] #是否继承其余的角色
角色建立完毕后 MongoDB 会在系统库 admin 下建立一个系统 collection 名叫 system.roles,里面存储的便是角色相关的信息。使用以下命令查看:
db.system.roles.find()
查看角色
db.getRole()
角色继承
db.grantRolesToRole() #角色受权 db.revokeRolesfromRole() #角色移权
db.createUser({ user:"xxx", pwd:"xxxx", customDate:"xxx", roles:[{ #指定角色名称以及认证库 role:"xxx", db:"xxxx" }] })
认证
vim /etc/mongo.conf security: authorization:enabled
db.auth("user","passwd") #在use db后 或 mongo -u user -p passwd --authenticationDatabase xxx #在哪一个库建立的用户就须要使用哪一个库进行认证
查看用户
db.getUser("user") db.system.users.find()
删除用户
db.dropUser("user") db.dropAllUsers() #删除当前库全部用户
添加用户权限
db.grantRolesToUser()
修改密码
db.changeUserPassword("user","new_passwd")
关闭MongoDB,千万不要 kill -9 pid
,使用 db.shutdownServer()
。
在MongoDB中删除库和集合并不会级联删除对应的角色和用户。所以若是想完全删除对应的业务应该先删除库与其对应的角色和用户。
若是既想实现精细化权限控制又想简化用户管理,原则上建议只给开发建立一个帐户,而且使用admin作认证库,这样能够避免清理过时业务库而致使没法登录的问题。
2人点赞