标签:document sys 网络流 指定 dmi 方法 put god 系统
要保证一个安全的MongoDB运行环境,DBA需要实施一些控制保证用户或应用程序仅仅访问它们需要的数据。这些措施包括但不限于:
一、认证机制
认证是验证客户端用户身份的过程。开启访问控制后,MongoDB需要所有客户端认证它们自己身份以决定它们的访问权限。尽管认证和授权比较相近,但是认证是区别于授权的,认证是证明身份,授权是决定它们访问的资源和操作。
1、用户
为了认证客户端,你必须要添加一个对应的用户到MongoDB.
2、认证机制
1)SCRAM-SHA-1
2)MONGODB-CR
3)x.509
二、基于角色的访问控制
MongoDB默认是没有开启访问控制,你能开启通过--auth参数重启mongod服务。一旦开启了,用户连接mongod必须指定用户名和密码。
1、内建角色
MongoDB提供许多内建角色,用于不同级别的访问数据库资源。在每个数据库中都存在内建数据库用户角色和数据库管理员角色
1)数据库用户角色
每个数据库都包含以下角色:
2)数据库管理员角色
每个数据库都包含以下角色:
3)集群管理角色
4)备份和恢复角色
5)所有数据库权限
6)超级角色
7)内部角色
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/27019/db --fork --logpath=/data/27019/log/mongodb.log --port 27019 --auth
步骤三:使用管理员登录并创建一个普通用户
[root@node1 27019]# mongo --port 27019 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" #使用管理员登录 use test db.createUser( #在test库中创建所属用户testUser,虽然该用户属于test库,但是通过角色分配,它也可以对其他数据库有操作权限 { user: "testUser", pwd: "12345678", roles: [ { role: "read", db: "children" }, #对children库有只读权限 { role: "readWrite", db: "test" }, #对test库有读写权限 { role: "readWrite", db: "HashTest" } #对HashTest库有读写权限 ] } )
#使用新用户testUser登录测试 [root@node1 27019]# mongo --port 27019 -u "testUser" -p "12345678" MongoDB shell version: 3.2.0 connecting to: 127.0.0.1:27019/test > db.user.insert({"_id":1,"name":"darren"}) #向test库中插入数据,可以成功 WriteResult({ "nInserted" : 1 }) > use children #向children库中插入数据,失败,因为只有读的权限 switched to db children > db.user.insert({"_id":1,"name":"darren"}) WriteResult({ "writeError" : { "code" : 13, "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服务器曝光度,限制风险。
这个模式适用于所有到mongod实例的单机或者副本集成员主机,目的是只允许应用服务器连接到mongodb服务器上:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
2)VPNs
具体参考文档。
标签:document sys 网络流 指定 dmi 方法 put god 系统
原文地址:http://www.cnblogs.com/wangsicongde/p/7588630.html