关于Mongodb 认证鉴权你需要知道的一些事
前言
本文主要给大家介绍了Mongodb认证鉴权的一些相关内容,通过设置认证鉴权会对大家的mongodb安全进一步的保障,下面话不多说了,来一起看看详细的介绍吧。
一、Mongodb 的权限管理
认识权限管理,说明主要概念及关系
与大多数数据库一样,Mongodb同样提供了一套权限管理机制。 为了体验Mongodb 的权限管理,我们找一台已经安装好的Mongodb,可以参照这里搭建一个单节点的Mongodb。
直接打开mongo shell:
./bin/mongo --port=27017
尝试执行stats命令以查看appdb数据库的状态:
MongoDB Enterprise use appdb MongoDB Enterprise db.stats() "ok" : 0, "errmsg" : "not authorized on nscl to execute command { dbstats: 1.0, scale: undefined }", "code" : 13 }
此时的提示正是说明你当前的操作没有获得许可,使用appdb预创建的用户进行鉴权:
db.auth("appuser","yourpassword") db.stats() "db" : "appdb", "collections" : 0, "views" : 0, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 0, "numExtents" : 0, "indexes" : 0, "indexSize" : 0, "fileSize" : 0, "ok" : 1 }
可以发现,在通过验明身份之后,stats操作的鉴权获得了许可。
以上例子可能让你对数据库鉴权有了点浅显认识,那么接下来开始说点概念了,大致是叫基于角色的权限控制
[图-角色权限控制]
先解释下图中的几个实体:
Resource,资源 一个资源可以是一个数据库、集合、或者一个集群..往大了说,任何可能被操作的事物都可以被当做资源。 Action,动作 动作是指对资源的一个执行行为,比如读取表、读取数据库,其中读取便是一个动作。 Privilege,权限 权限指的是对某类或某一些资源执行某些动作的允许,与Permission的意义一致。 Role,角色 系统中的角色,通常是代表了一种权力等级的象征,比如论坛中的管理员、版主、游客等等,就是角色; 系统定义中,角色往往代表一组权限的集合。 User,用户 可登录系统的实体,一个用户通常可被赋予多个角色。噢,关于图的简单解释: 权限定义了对某些资源的某些操作,角色则可以拥有多个权限; 用户User可以被赋予多个角色,从而获得这些角色所拥有的权限以操作某些资源。
对于Mongodb来说,只要开启鉴权,所有的DB访问操作都需要通过权限检查。而大致的操作流程跟下图类似
[图-mongo鉴权]
Mongodb 的用户归属于某个数据库,用户需要在所属的数据库中进行鉴权;
一旦通过鉴权,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。
二、鉴权方式
阐述Mongodb支持的几种鉴权方式 鉴权方式是指Mongodb如何识别接入用户,如何检查权限是否合法的一系列校验机制。 SCRAM-SHA-1 SCRAM-SHA-1 是默认的鉴权机制,定义于 IETF standard, RFC 5802 是一种安全性较高的 挑战-应答 鉴权机制。关于 挑战-应答 可以参考维基百科 MongoDB Challenge and Response (MONGODB-CR) 3.0 以前采用的机制,已经废弃 x.509 Certificate Authentication. 基于证书的鉴权,采用该方式可建立 SSL/TLS 加密连接 LDAP proxy authentication 基于LDAP 系统的鉴权,仅企业版支持 Kerberos authentication 基于Kerberos 的鉴权,仅企业版支持
SCRAM-SHA-1 是当前推荐使用的鉴权方式,既然如此,有必要上图继续解释:
步骤解读
客户端发起一个SCRAM鉴权请求; 鉴权参数中带上用户名、客户端随机字符串(防止重放攻击); 服务端发出一个挑战响应; 服务侧先检查用户名,通过后生成一个salt因子、迭代数、合并字符串(包含客户端随机串和服务端随机串) 客户端响应一个proof(证明数据)和合并字符串; 响应的 proof数据根据服务所给的随机参数以及客户端密钥生成,是一个客户端签名与密钥异或计算后的结果; 服务端将存储的密钥结合随机参数,使用同样的算法生成签名并校验客户端 proof数据; 若校验通过,服务端采用类似方式发送自己的签名; 客户端校验服务端签名数据。可以看到,SCRAM鉴权时也类似SSL/TLS 的握手过程,但相比之下简单许多,同时在性能方面也要具备优势; 然后我们看看安全性的部分:
信息窃听,传输过程中全部采用动态签名,保证密码不会被传输; 重放攻击,由于使用了随机数,每次生成的数据都不一样,可避免重复数据攻击; 服务假冒,鉴权过程是双向的,即客户端会校验服务端身份,而服务端密钥也根据密码生成,中间人无法仿造; 存储安全,密码在数据库中均没有明文存储,都通过不可逆的算法加密存储。另外SCRAM-SHA-1 相比MONGODB-CR的优势还有:
A tunable work factor (iterationCount), 可灵活调整的安全系数 Per-user random salts rather than server-wide salts 每个用户有独立的随机系数 A cryptographically stronger hash function (SHA-1 rather than MD5), 更安全的hash函数 Authentication of the server to the client as well as the client to the server. 支持双向认证
对 SCRAM-SHA-1的实现感兴趣?戳这里
三、内部鉴权
副本集、分片集群内鉴权方式
内部鉴权是指 Mongo集群内部节点之间进行访问的鉴权方式,比如副本集内主备之间的访问、分片集群内Mongos 与Mongod之间的访问。 内部鉴权目前支持两种方式:
KeyFiles 密钥文件方式,采用SCAM-SHA-1 的鉴权机制,文件内包含了一个共享密钥,由集群内所有成员共同持有。 通常,密钥的长度在6-1024字符内,采用Base64编码。如何使用 X.509 证书 证书鉴权,用于SSL/TLS加密连接通道。 如何使用四、数据库角色
针对Mongodb数据库中的各种角色进行说明
数据库访问
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
基本是这些,有兴趣可看看官方的内置角色 Mongodb 的用户及角色数据一般位于当前实例的 admin数据库,system.users存放了所有数据; 存在例外的情况是分片集群,应用接入mongos节点,鉴权数据则存放于config节点。因此有时候为了方便分片集群管理,会单独为分片内部节点创建独立的管理操作用户;
五、相关操作
简单列举用户权限相关的常用操作
授权启动
./bin/mongod --auth
默认为非授权启动 也可以通过security.authorization配置指定
创建管理员用户
use admin
db.createUser({
user: admin ,pwd: admin@2016 ,roles:[
{role: clusterAdmin ,db: admin },
{role: userAdminAnyDatabase ,db: admin }
创建用户
use appdb
db.createUser({user: appuser ,pwd: appuser@2016 })
授予权限
use appdb
db.grantRolesToUser( appuser , [{role: readWrite ,db: appdb }])
删除权限
use appdb
db.revokeRolesFromUser( appuser ,[{ role: read , db: appdb }])
更多操作
六、常见问题
shell 操作提示错误
use appdb
MongoDB Enterprise db.stats()
{
ok : 0,
errmsg : not authorized on appdb to execute command { dbstats: 1.0, scale: undefined } ,
code : 13
原因:当前连接未鉴权或用户没有操作权限 解决:为用户分配适当权限,并执行auth操作,如下:
db.auth( appuser , yourpassword );
无法执行 eval 操作
db.eval() 是一个全局操作,可执行任意数据库脚本; 执行该命令需要拥有anyAction或anyResource的权限,通常不建议为数据库用户赋予这样的权限。 该命令存在安全风险,已不建议使用(mongodb 3.0之后已经过期)。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
扩展阅读
Mongodb 鉴权机制 https://docs.mongodb.com/manual/core/authentication/
Mongodb 内置角色介绍 https://docs.mongodb.com/manual/reference/built-in-roles/#database-user-roles
Mongodb 权限操作介绍 https://docs.mongodb.com/manual/reference/privilege-actions/
运维-Mongodb鉴权介绍 http://www.ywnds.com/?p=5635
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 关于Mongodb 认证鉴权你需要知道的一些事
相关文章
- 一文搞懂Linux CentOS7中关于MongoDB的认证和授权设置
- MongoDB 聚合索引如何分析和优化查询性能
- MongoDB入门到进阶笔记:03-MongoDB的客户端使用 常用操作
- window平台安装MongoDB数据库图文详解
- 及密码MongoDB用户认证:创建安全的用户名及密码(mongodb用户名)
- MongoDB:孩子集合管理技巧(mongodb子集合)
- MongoDB:实现内存限制的最佳实践(mongodb限制内存)
- MongoDB入门:学习中文教程(mongodb中文教程)
- 池配置MongoDB连接池以提升性能(mongodb连接)
- MongoDB:华丽图标让你栩栩如生(mongodb图标)
- MongoDB优势与不足分析(mongodb优缺点)
- MongoDB部署:构建跨平台高可用数据库(mongodb部署)
- MongoDB安全:如何设置用户名密码(mongodb用户名密码)
- Mongodb与Redis:改变大数据时代的双重力量(mongodb和redis)
- MongoDB:管理数据库的基础技能(mongodb数据库管理)
- Ubuntu上安装MongoDB的快速指南(ubuntu安装mongodb)
- MongoDB分片不均衡问题分析(mongodb分片不均匀)
- 深挖MongoDB:揭秘主节点的作用与运作原理(mongodb主节点)
- MongoDB查询之无空,求数据尽情挖(mongodb查询不为空)
- MongoDB:起源于2008的数据库管理系统(mongodb2008)
- Mongodb的存储方式简介:NoSQL数据库持久化存储方法详解(mongodb存储方式)
- 如何停止MongoDB数据库服务?(mongodb停止)
- MongoDB查询数组:使用简单且高效的方法完成集合中包含数组的文档查询和操作。(mongodb查询数组)
- Mongodb如何查询文档(mongodb 查询文档)
- MongoDB:高效稳定的数据库,提升数据管理效率(mongodb的使用)
- Mongodb解决中文乱码问题的方法详解(mongodb中文乱码)
- MongoDB储存文件:简单、可靠、高性能的方案(mongodb储存文件)
- 云部署 MongoDB 就在百度云(mongodb百度)
- MongoDB查询优化:让你的数据分析更有效(mongodb 查询分析)
- MongoDB内存优化:如何配置更高的性能(mongodb内存配置)