MongoDB安全及身份认证
前面的话
本文将详细介绍MongoDB安全相关的内容
概述
MongoDB安全主要包括以下4个方面
1、物理隔离
系统不论设计的多么完善,在实施过程中,总会存在一些漏洞。如果能够把不安全的使用方与MongoDB数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护。但,通常这是不现实的。一些重要的数据可能会保存下来,放置到物理隔离的机房中
2、网络隔离
许多公司的开发机处于内网环境中。即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网
3、防火墙隔离
可以利用防火墙配置IP白名单,只允许某些IP访问数据库,也可以从一定程度上增加MongoDB的安全性
4、用户名密码鉴权
相对于以上3种方式,用户名密码鉴权机制是最常见的MongoDB安全措施。如果密码设置的比较简单,或者连接环境不是加密环境,很可能被第三方获取到用户名和密码,从而造成MongoDB数据库的危险
权限认证
mongodb存储所有的用户信息在admin数据库的集合system.users中,保存用户名、密码和数据库信息。mongodb默认不启用权限认证,只要能连接到该服务器,就可连接到mongod。若要启用安全认证,需要更改配置文件参数authorization,也可以简写为auth。

然后,重启mongod。查看日志文件,发现权限认证已经开启

但是,不使用用户名和密码依然可以连接到数据库。这是因为,我们还没有创建用户。在用户创建,并且开启权限认证之后,如果不使用用户名和密码将不能够连接到数据库
角色管理
在进行用户管理之前,首先要先了解角色管理
MongoDB支持基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。一个用户可以被授权一个或者多个:ref:角色 <roles> 以决定该用户对数据库资源和操作的访问权限。在权限以外,用户是无法访问系统的
数据库角色在创建用户中的role参数中设置。角色分为内建角色和自定义角色
【内建角色】
MongoDB内建角色包括以下几类
1、数据库用户角色
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
2、数据库管理员角色
dbAdmin:允许用户进行索引创建、删除,查看统计或访问system.profile,但没有角色和用户管理的权限
userAdmin:提供了在当前数据库中创建和修改角色和用户的能力
dbOwner: 提供对数据库执行任何管理操作的能力。这个角色组合了readWrite、dbAdmin和userAdmin角色授予的特权。
3、集群管理角色
clusterAdmin : 提供最强大的集群管理访问。组合clusterManager、clusterMonitor和hostManager角色的能力。还提供了dropDatabase操作
clusterManager : 在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制
clusterMonitor : 提供对监控工具的只读访问,例如MongoDB云管理器和Ops管理器监控代理。
hostManager : 提供监视和管理服务器的能力。
4、备份恢复角色
backup : 提供备份数据所需的能力,使用MongoDB云管理器备份代理、Ops管理器备份代理或使用mongodump
restore : 提供使用mongorestore恢复数据所需的能力
5、所有数据库角色
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
6、超级用户角色
root:提供对readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore和backup的所有资源的访问
7、内部角色
__system : 提供对数据库中任何对象的任何操作的特权
【自定义角色】
除了使用内建的角色之外,MongoDB还支持使用db.createRole()方法来自定义角色
[注意]只能在admin数据库中创建角色,否则会失败
role: 自定义角色的名称
privileges: 权限操作
roles:继承的角色。如果没有继承的角色,可以设置为空数组
use admin
db.createRole(
{
role: "myClusterwideAdmin",
privileges: [
{ resource: { cluster: true }, actions: [ "addShard" ] },
{ resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
{ resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
{ resource: { db: "", collection: "" }, actions: [ "find" ] }
],
roles: [
{ role: "read", db: "admin" }
]
},
{ w: "majority" , wtimeout: }
)

用户管理
【创建用户】
使用createUser命令来创建用户
user: 用户名 pwd: 密码
customData: 对用户名密码的说明(可选项)
roles: {role:继承自什么角色类型,db:数据库名称}
db.createUser({user: "...",pwd: "...",customDate:"...",roles:[{role: "...",db: "..."}]})
1、创建管理员用户
MongoDB没有默认管理员账号,所以要先添加管理员账号。切换到admin数据库,添加的账号才是管理员账号
  在admin数据库中,添加一个用户并赋予userAdminAnyDatabase角色
db.createUser({user: "admin",pwd: "",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})

2、重新登录数据库,并验证权限
如果auth()方法返回0则代表授权失败,返回1代表授权成功
db.auth()

3、添加普通用户
  一旦经过认证的用户管理员,可以使用db.createUser()去创建额外的用户。 可以分配mongodb内置的角色或用户自定义的角色给用户
[注意]在当前数据库下,新建用户才有效

由于该用户只有读权限,所以会写入数据失败

4、创建超级用户

【查看用户】
db.system.users.find()

【删除用户】
[注意]在当前数据库下,删除用户才有效
db.dropUser()

【添加用户权限】
db.grantRolesToUser()
给在db1数据库中只读的x用户,添加写权限

【修改密码】
db.changeUserPassword()

[注意]一定要知道的是,无论是新增用户、还是删除用户或者修改权限或密码,一定要在当前数据库下才有效
MongoDB安全及身份认证的更多相关文章
- 【mongodb用户和身份认证管理】
		
admin系统库用户管理 #移除 #查看 特定的数据库用户管理 #添加 #修改密码
 - MongoDb安全配置:简单的身份认证
		
mongod默认启动不加任何参数时,是没有身份认证的,任何人都可以登录上进行任何操作 启动时添加--auth可以使用身份验证模式 使用mongod -f mongod.conf配置文件启动时,配置文件 ...
 - "用户增长"--快速身份认证实现用户增长的技术和产品方案
		
"用户增长"--快速身份认证实现用户增长的技术和产品方案 1 引言 作为一个互联网产品,用户量的增长是一个非常重要的衡量指标. 这是一个集合了销售,市场,运营,技术的综合能力. ...
 - 基于token的多平台身份认证架构设计
		
基于token的多平台身份认证架构设计 1 概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...
 - .NET Web的身份认证
		
百度一下”asp.net身份认证“,你会得到很多相关的资料,这些资料通常上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程.初学者对此往往一头雾水,我也曾经被坑过很 ...
 - ABP源码分析四十二:ZERO的身份认证
		
ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...
 - RESTful Api 身份认证安全性设计
		
REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...
 - ASP.NET MVC 身份认证
		
身份认证的好处就是, 如果这个页面没有登录, 刷新后会自动跳到登录页要求登录,保证了应用程序的安全.而Forms 身份认证是web下最常用的,如何配置呢?见下(基于mvc 4) 1.在webconfi ...
 - C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
		
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
 
随机推荐
- POJ 3685 二分套二分
			
Matrix Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that e ...
 - Wampserver红色橙色解决思路----端口冲突是关键
			
Wampserver不是绿色:wampserver下载安装不需要配置环境,在这之前需要下载tomcat,并确保启动,不然会是红色.安装好wampserver(就是在安装过程不会弹出缺少什么文件,我的就 ...
 - gulp报错
			
这个问题网上搜索到的答案不一定能够解决问题,有可能是node版本问题,需要升级 到最新版就可以了....
 - javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
			
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
 - Spring学习(5)---Bean的定义及作用域的注解实现
			
Bean管理的注解实现 Classpath扫描与组件管理 类的自动检测与注册Bean <context:annotation-config/> @Component,@Repository ...
 - [codeforces631E]Product Sum
			
E. Product Sum time limit per test: 1 second memory limit per test: 256 megabytes input:standard inp ...
 - ThreadLocal来管理事务
			
ThreadLocal (扩展) 1 ThreadLocal API ThreadLocal类只有三个方法: l void set(T value):保存值: l T get():获取值: l ...
 - 聊聊vue组件开发的“边界把握”和“状态驱动”
			
vue有着完整的组件化开发机制,但是官网只给了开发的方式,对于开发规范以及组件化开发的最佳实践,还需要我们来摸索.本文就平时开发中的经验来谈谈“把握边界”和“状态驱动”这两个话题. 边界把握 边界把握 ...
 - JAVA web.xml中引用多个XML
			
web.xml里加<context-param><param-name>contextConfigLocation</param-name><param-va ...
 - python 标准库 -- signal
			
signal 的核心是 : 设置信号处理函数. 预定义信号 signal.SIG_DFL signal.SIGBUS signal.SIGFPE signal.SIGIO signal.SIGPOLL ...