要保证一个安全的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服务器曝光度,限制风险。

在iptables规则配置分为链,这里主要控制两个链:
  • 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管理之安全性的更多相关文章

  1. mongodb管理工具rockmongo

    mongodb的图像管理工具非常之多,我用的是rockmongo. RockMongo 是一个PHP5写的MongoDB管理工具. 主要特征: 使用宽松的New BSD License协议 速度快,安 ...

  2. MongoDB管理工具的插件系统

    MongoDB管理工具  MongoCola的开发已经进入第三个年头了. 官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了. 最近准备着手插件系统的开发,简 ...

  3. MongoDB管理与开发精要 书摘

    摘自:<MongoDB管理与开发精要>         性能优化 创建索引 限定返回结果条数 只查询使用到的字段,而不查询所有字段 采用capped collection 采用Server ...

  4. Nodejs mongodb 管理组件adminmongodb

    强大的 nodejs的mongodb管理工具,强大到即下即用: 安装需求: 1.git命令获取组件包,git clone https://github.com/mrvautin/adminMongo. ...

  5. 详解MongoDB管理命令

    MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一 ...

  6. MongoDB管理

    前几篇文章都是从开发和使用的角度了解了MongoDB的各个知识点,这篇文章将从MongoDB管理的角度入手,了解MongoDB管理所要了解的基本知识. 数据库命令 在前面几篇文章中,已经接触了一些数据 ...

  7. MongoDB.WebIDE:升级版的Mongodb管理工具

    很早以前收藏了一片文章:<强大的MongoDB数据库管理工具>.最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便.不过在使用过程中出现了一些个问题,加上更 ...

  8. mongodb进阶三之mongodb管理

    http://blog.csdn.net/stronglyh/article/details/46827141 平时的开发环境win比較多啊,但生产环境要放到unix环境上 一:命令 安装就不少了,网 ...

  9. mongodb管理与安全认证

    mongodb数据管理 数据的导出.数据导入数据导出 mongoexport [使用mongoexport -h查看参数] 数据导入 mongoimport [使用mongoimport -h查看参数 ...

随机推荐

  1. window 服务(二)

    接Window服务(一) ServiceController方法调用 public partial class Service1 : ServiceBase { public Service1() { ...

  2. Maven环境下搭建SSH框架之Spring整合Hibernate

    © 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Spring:4.3.8.RELEASE Hibernate:5.1.7.Final MySQL:5.7.17 注意:其他版本在某些特性 ...

  3. ACM算法整理(不断补充ing)

    动态规划 1.背包问题 (1)01背包 ,n) DFR(v,V,C[i]) F[v]=max(F[v],F[v-C[i]]+W[i]); } //初始化时 //若背包不一定装满F全初始化为0 //若装 ...

  4. 在Ubuntu 16.04下安装 virtualbox 5.2

        sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian xenial contrib" ...

  5. The best way to predict the future is to invent it,预测未来最好的方法是创造它!

    The best way to predict the future is to invent it,预测未来最好的方法是创造它! ——Smalltalk发明人Alan Kay “预测未来的最好方法, ...

  6. Hadoop之MapReduce的两种任务模式

    http://qianshangding.iteye.com/blog/2259421 Hadoop之MapReduce的两种任务模式

  7. Vim使用技巧(1) -- 普通模式技巧 【持续更新】

    直观的来一张键盘图先 符号快捷键 . //重复上次修改 ^ //光标快速跳转到当前行开头 $ //光标快速跳转到当前行结尾 f{char} //光标快速跳转到当前行下一个{char}字符,{char} ...

  8. 【Mac系统】之Mysql数据库遇到修改数字密码的问题(SQL语法错误:ERROR 1064 (42000),密码策略等问题:ERROR 1819 (HY000))

    安装完Mysql也进行了第一次初始化密码以及修改密码规则(请参考文章),但是我想后续再改密码,出现了下面几个问题: #SQL语句错误问题 ERROR 1064 (42000): You have an ...

  9. html5-框架网站

    1.html5+:http://www.html5plus.org/ 2.hbuilder:http://www.dcloud.io/ 3.mui:http://dev.dcloud.net.cn/m ...

  10. ios输出想保留的整数位(占位符)

    int startHour=5; int startMinute=4; //输出前面补0,不管你输入的数据前面有没有0 sp;NSLog(@"====>%@",[NSStri ...