【九】MongoDB管理之安全性
要保证一个安全的MongoDB运行环境,DBA需要实施一些控制保证用户或应用程序仅仅访问它们需要的数据。这些措施包括但不限于:
- 认证机制
- 基于角色的访问控制
- 加密
- 审计
一、认证机制
认证是验证客户端用户身份的过程。开启访问控制后,MongoDB需要所有客户端认证它们自己身份以决定它们的访问权限。尽管认证和授权比较相近,但是认证是区别于授权的,认证是证明身份,授权是决定它们访问的资源和操作。
1、用户
为了认证客户端,你必须要添加一个对应的用户到MongoDB.
- 用户管理接口:db.createUser()方法可以创建一个用户,添加完成后可以分配角色给用户,第一个用户必须是管理员,用来管理其他用户。你也可以更新存在的用户,必须修改密码和权限。
- 认证数据库:当添加一个用户后,你在某个指定的数据库中添加该用户,那么这个数据库对于该用户就是个认证数据库。一个用户可以有权限访问多个数据库,通过分配角色权限来做到。
- 认证用户:为了认证用户,可以通过db.author()方法。
- 分片集群用户:为分片集群创建用户,可以通过mongos实例进行,mongodb将用户信息存储到config server的admin库中。但是有些操作需要直接连接到分片主机上进行的,这时这些用户就不行了,需要到分片主机上创建shard local管理用户
2、认证机制
1)SCRAM-SHA-1
2)MONGODB-CR
3)x.509
二、基于角色的访问控制
MongoDB默认是没有开启访问控制,你能开启通过--auth参数重启mongod服务。一旦开启了,用户连接mongod必须指定用户名和密码。
1、内建角色
MongoDB提供许多内建角色,用于不同级别的访问数据库资源。在每个数据库中都存在内建数据库用户角色和数据库管理员角色
1)数据库用户角色
每个数据库都包含以下角色:
- read:提供读权限,除了非系统集合
- readWrite:提供读写权限
2)数据库管理员角色
每个数据库都包含以下角色:
- dbAdmin:提供schema相关的操作、索引、搜集统计信息等权限,不能分配角色。
- dbOwner:这个角色包括readWrite、dbAdmin、userAdmin角色的权限
- userAdmin:提供修改和创建角色和用户的权限。由于该角色能够分配权限,包括他们自己,所以间接的提供超级用户的权限。
3)集群管理角色
- clusterAdmin:提供集群管理的最高权限,包括clusterManager、clusterMonitor、hostManager角色。此外还有删除数据库的权限
- clusterManager:能够访问config和local数据库的权限
- clusterMonitor:对于监控工具提供只读权限
- hostManager:提供监控和管理主机的权限
4)备份和恢复角色
- backup:除了system.profile集合,该角色提供足够的权限来使用MongoDB Cloud Manager、Ops Manager、mongodump等工具对所有集合进行备份。
- restore:恢复数据的权限
5)所有数据库权限
- readAnyDatabase:提供读所有数据库的权限
- readWriteAnyDatabase:同readWrite,范围是所有数据库。
- userAdminAnyDatabase:同userAdmin,范围是所有数据库
- dbAdminAnyDatabase:同dbAdmin,范围所有数据库
6)超级角色
- root:提供所有权限
7)内部角色
- __system:提供维护数据库对象的权限,一般不用分配给用户。
2、自定义角色
MongoDB提供许多内建角色,当然,如果不满足需要,你可以创建自己的角色
你可以使用db.createRole()方法创建角色,这些角色被存储在admin库的system.roles集合中。
3、基于集合级别的访问控制
基于集合级别访问控制允许DBA基于某些特定集合给用户分配权限,也就是用户只能访问某些特定的集合。
【访问级别控制实例:单机环境】
步骤一:在未启用访问级别前创建管理员用户,(如果不这样,一旦开启了访问控制,你虽然可以进入mongos,但是不具有任何增删改权限了):
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
步骤二:带--auth参数重启mongod服务(即开启访问级别控制)
mongod --dbpath=/data//db --fork --logpath=/data//log/mongodb.log --port --auth
步骤三:使用管理员登录并创建一个普通用户
[root@node1 ]# mongo --port -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" #使用管理员登录
use test
db.createUser( #在test库中创建所属用户testUser,虽然该用户属于test库,但是通过角色分配,它也可以对其他数据库有操作权限
{
user: "testUser",
pwd: "",
roles: [
{ role: "read", db: "children" }, #对children库有只读权限
{ role: "readWrite", db: "test" }, #对test库有读写权限
{ role: "readWrite", db: "HashTest" } #对HashTest库有读写权限
]
}
)
#使用新用户testUser登录测试
[root@node1 ]# mongo --port -u "testUser" -p ""
MongoDB shell version: 3.2.
connecting to: 127.0.0.1:/test
> db.user.insert({"_id":,"name":"darren"}) #向test库中插入数据,可以成功
WriteResult({ "nInserted" : })
> use children #向children库中插入数据,失败,因为只有读的权限
switched to db children
> db.user.insert({"_id":,"name":"darren"})
WriteResult({
"writeError" : {
"code" : ,
"errmsg" : "not authorized on children to execute command { insert: \"user\", documents: [ { _id: 1.0, name: \"darren\" } ], ordered: true }"
}
})
> use HashTest
switched to db HashTest
> db.user.insert({"_id":1,"name":"darren"}) #向HashTest库中插入数据,成功。
WriteResult({ "nInserted" : 1 })
总结:MongoDB一个数据库需要属于一个用户,当一个相同的用户需要访问多个数据库,不需要在每个数据库中都建立同样的用户,可以建立一个专门管理用户的库,通过角色分配达到这种目的,更加容易维护和管理。
三、加密
1、传输加密
你可以用TLS/SSL来加密MongoDB的网络流量,它们能够确保网络流量仅仅被需要的客户端读取。
2、静态加密
有两种主要的方法加密静态数据:应用程序层加密和存储层加密。你可以一起用也可以单独使用一种。V3.2中为WiredTiger存储引擎引入新的加密选项,这种特性允许你加密数据文件,如此一来只有带有解密键的那部分能够解密和读取数据。详细讲解请参考官方手册。
四、审计
MongoDB企业版包括审计功能。审计功能允许管理员和用户在部署多用户和应用程序环境时跟踪系统活动。具体请查阅官方文档。
五、其他方面安全控制
1、MongoDB配置
确保禁用http状态接口,默认mongodb是禁用的。
2、网络安全
配置操作系统防火墙控制访问系统级别或者使用VPN。
1)防火墙规则(liunx)
通过指定防火墙规则,mongodb管理员可以控制哪些主机可以连接到mongodb服务器上,从而减少mongodb服务器曝光度,限制风险。
- INPUT:控制所有进入者
- OUTPUT:控制所有输出
这个模式适用于所有到mongod实例的单机或者副本集成员主机,目的是只允许应用服务器连接到mongodb服务器上:
iptables -A INPUT -s <ip-address> -p tcp --destination-port -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d <ip-address> -p tcp --source-port -m state --state ESTABLISHED -j ACCEPT
2)VPNs
具体参考文档。
【九】MongoDB管理之安全性的更多相关文章
- mongodb管理工具rockmongo
mongodb的图像管理工具非常之多,我用的是rockmongo. RockMongo 是一个PHP5写的MongoDB管理工具. 主要特征: 使用宽松的New BSD License协议 速度快,安 ...
- MongoDB管理工具的插件系统
MongoDB管理工具 MongoCola的开发已经进入第三个年头了. 官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了. 最近准备着手插件系统的开发,简 ...
- MongoDB管理与开发精要 书摘
摘自:<MongoDB管理与开发精要> 性能优化 创建索引 限定返回结果条数 只查询使用到的字段,而不查询所有字段 采用capped collection 采用Server ...
- Nodejs mongodb 管理组件adminmongodb
强大的 nodejs的mongodb管理工具,强大到即下即用: 安装需求: 1.git命令获取组件包,git clone https://github.com/mrvautin/adminMongo. ...
- 详解MongoDB管理命令
MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一 ...
- MongoDB管理
前几篇文章都是从开发和使用的角度了解了MongoDB的各个知识点,这篇文章将从MongoDB管理的角度入手,了解MongoDB管理所要了解的基本知识. 数据库命令 在前面几篇文章中,已经接触了一些数据 ...
- MongoDB.WebIDE:升级版的Mongodb管理工具
很早以前收藏了一片文章:<强大的MongoDB数据库管理工具>.最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便.不过在使用过程中出现了一些个问题,加上更 ...
- mongodb进阶三之mongodb管理
http://blog.csdn.net/stronglyh/article/details/46827141 平时的开发环境win比較多啊,但生产环境要放到unix环境上 一:命令 安装就不少了,网 ...
- mongodb管理与安全认证
mongodb数据管理 数据的导出.数据导入数据导出 mongoexport [使用mongoexport -h查看参数] 数据导入 mongoimport [使用mongoimport -h查看参数 ...
随机推荐
- SubVersion(SVN)的安装配置使用
一. SubVersion服务器端安装 安装软件:Setup-Subversion-1.6.4.msi,下载地址:http://subversion.tigris.org/servlets/Proje ...
- 浅谈JavaScript变量声明提升
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...
- centos安装postgresql
#安装postgresqlyum -y install postgresql-server #执行数据库初始化脚本service postgresql-9.2 initdb #启动服务service ...
- https 加载问题
https的网站,加载的资源要全部https,如果里面有http的资源,很多浏览器是加载不进来 要地址栏变绿,网站内部全部引用都是https的
- linux rm -rf * 文件恢复记
手太快,肠子都毁清了.本来是删除一个文件 rm path/myfile.txt结果不知为何加了个*,变成了rm path/myfile.txt *赶紧ls,发现所有代码都化为了乌有,还没提交,还没备份 ...
- AngularJS路由 $state服务、路由事件、获取路由参数
1 ui-sref.$state.go 的区别 ui-sref 一般使用在 <a>...</a>: <a ui-sref="message-list" ...
- Java利用Axis远程调用WebService接口
准备工作: 主要依赖的包: 1.axis.jar 官网:http://axis.apache.org/axis/ 2.jaxrpc.jar 下载地址:http://www.java2s.com/Cod ...
- oracle 累加功能,累加百分比
最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...
- 谷歌宣称web组件才是web开发的未来
谷歌宣称web组件才是web开发的未来 虽然今年的谷歌I/O大会没有出现像去年谷歌眼镜发布时直播疯狂跳伞这样的活动,但是上周仍然有不少产品推出.谷歌宣布对谷歌地图.搜索.安卓,以及其他 很多产品做出更 ...
- jQuery动态加载JS以减少服务器压力
如果您要创建一个web2.0的应用程序,那么你的网页会包括大量的JavaScript文件,这些可能会拖慢您的网页.因此,动态加载JavaScript代码到您的网页是一个好主意,即只有当实用他们的时候加 ...