关于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')
1
> 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 是当前推荐使用的鉴权方式,既然如此,有必要上图继续解释:

步骤解读

  1. 客户端发起一个SCRAM鉴权请求; 鉴权参数中带上用户名、客户端随机字符串(防止重放攻击);
  2. 服务端发出一个挑战响应; 服务侧先检查用户名,通过后生成一个salt因子、迭代数、合并字符串(包含客户端随机串和服务端随机串)
  3. 客户端响应一个proof(证明数据)和合并字符串; 响应的 proof数据根据服务所给的随机参数以及客户端密钥生成,是一个客户端签名与密钥异或计算后的结果;
  4. 服务端将存储的密钥结合随机参数,使用同样的算法生成签名并校验客户端 proof数据; 若校验通过,服务端采用类似方式发送自己的签名;
  5. 客户端校验服务端签名数据。

可以看到,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数据库中的各种角色进行说明

数据库访问

角色名称 拥有权限
read 允许读取指定数据库的角色
readWrite 允许读写指定数据库的角色

数据库管理

角色名称 拥有权限
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许管理当前数据库的用户,如创建用户、为用户授权
dbOwner 数据库拥有者(最高),集合了dbAdmin/userAdmin/readWrite角色权限

集群管理

角色名称 拥有权限
clusterAdmin 集群最高管理员,集合clusterManager/clusterMonitor/hostManager角色权限
clusterManager 集群管理角色,允许对分片和副本集集群执行管理操作,如addShard,resync等
clusterMonitor 集群监控角色,允许对分片和副本集集群进行监控,如查看serverStatus
hostManager 节点管理角色,允许监控和管理节点,比如killOp、shutdown操作

备份恢复

角色名称 拥有权限
backup 备份权限,允许执行mongodump操作
restore 恢复权限,允许执行mongoresotre操作

数据库通用角色

角色名称 拥有权限
readAnyDatabase 允许读取所有数据库
readWriteAnyDatabase 允许读写所有数据库
userAdminAnyDatabase 允许管理所有数据库的用户
dbAdminAnyDatabase 允许管理所有数据库

特殊角色

角色名称 拥有权限
root 超级管理员,拥有所有权限
__system 内部角色,用于集群间节点通讯

基本是这些,有兴趣可看看官方的内置角色 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/#security-user-actions

运维-Mongodb鉴权介绍 http://www.ywnds.com/?p=5635

(0)

相关推荐

  • 详解MongoDB数据库基础操作及实例

    详解数据库基础操作及实例 废话不多说,直接上代码,注释写的比较清楚,大家参考下, 示例代码: /** * 插入一条DB对象 */ public static void addDBObject(DBCollection collection,BasicDBObject object){ collection.insert(object); } /** * 根据id查询DBObject */ public static DBObject getDBObjectById(String value) t

  • java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且

  • vue+socket.io+express+mongodb 实现简易多房间在线群聊示例

    项目简介 主要是通过做一个多人在线多房间群聊的小项目.来练手全栈技术的结合运用. 项目源码:chat-vue-node 主要技术: vue2全家桶 + socket.io + node(express) + mongodb(mongoose) 环境配置: 需安装配置好 node,mongodb环境(参考:http://www.jb51.net/article/109449.htm); 建议安装 Robomogo 客户端来管理mongodb数据. 编译运行: 1.开启MongoDB服务,新建命令行

  • MongoDB如何查询耗时记录的方法详解

    准备 在此之前,我们先在我们的数据库中插入10万条数据.数据的格式是这样的: { "name":"your name", "age":22, "gender":"male", "grade":2 } explain explain方法是用来查看db.collecion.find()的一些查询信息的.例如: db.collectionName.find().explain() explai

  • windows7下使用MongoDB实现仓储设计

    简单的介绍一下,我使用MongoDB的场景. 我们现在的物联网环境下,有部分数据,采样频率为2000条记录/分钟,这样下来一天24*60*2000=2880000约等于300万条数据,以后必然还会增加.之前数据库使用的是mssql,对于数据库的压力很大,同时又需要保证历史查询的响应速度,这种情况下,在单表中数据量大,同时存在读写操作.不得已采用MongoDB来存储数据.如果使用MongoDB,则至少需要三台机器,两台实现读写分离,一台作为仲裁(当然条件不允许也可以不用),每台机器的内存暂时配置在

  • MongoDB 3.4 安装以 Windows 服务方式运行的详细步骤

    1.首先从https://www.mongodb.com/download-center#community 下载社区版,企业版也是类似. 2.双击运行安装,可自定义安装路径,这里采用默认路径(C:\Program Files\MongoDB\Server\3.4) 一路下一步直至安装完毕. 3.创建数据存放目录(这里我放在D:\MongoDB\data). D:\MongoDB\data创建db目录和log目录,分别用来存放数据库文件和日志文件. 4.创建配置文件mongod.cfg存放在D:

  • linux系统下MongoDB单节点安装教程

    前言 MongoDB是一个高性能.开源.无模式的.基于分布式文件存储的文档型数据库,相信对大家都不陌生,这里就不过多介绍了,本文主要介绍了关于mongo单节点(linux下)的安装教程,分享出来供大家参考学习,下面话不多说了,来一起看看详细的安装过程吧. 安装包 下载地址: (https://www.mongodb.com/download-center) 用户权限/目录 1.创建 dbuser用户 groupadd dbgroup useradd dbuser -m -d /home/dbus

  • node.js操作MongoDB的实例详解

    node.js操作MongoDB时,需要安装mongodb包 1.使用npm安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 2.使用cnpm安装mongodb包 cnpm install mongodb node.js操作MongoDB时的四种方式:插入数据.更新数据.删除数据.查找数据. 操作步骤 步骤1 创建执行文件xx.js 步骤2 终端调用执行文件 node xx.js 注意: 操作前需要启动服务

  • MongoDB TTL索引的实例详解

    MongoDB TTL索引的实例详解 TTL索引是一种特殊类型的单字段索引,主要用于当满足某个特定时间之后自动删除相应的文档.也就是说集合中的文档有一定的有效期,超过有效期的文档就会失效,会被移除.也即是数据会过期.过期的数据无需保留,这种情形适用于如机器生成的事件数据,日志和会话信息等等.本文主要描述TTL索引的使用. 一.TTL索引 创建方法 db.collection.createIndex(keys, options) options: expireAfterSeconds 指定多少秒或

  • 关于Mongodb 认证鉴权你需要知道的一些事

    前言 本文主要给大家介绍了Mongodb认证鉴权的一些相关内容,通过设置认证鉴权会对大家的mongodb安全进一步的保障,下面话不多说了,来一起看看详细的介绍吧. 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的Mongodb,可以参照这里搭建一个单节点的Mongodb. 直接打开mongo shell: ./bin/mongo --port=27017 尝

  • SpringBoot使用Filter实现签名认证鉴权的示例代码

    情景说明 鉴权,有很多方案,如:SpringSecurity.Shiro.拦截器.过滤器等等.如果只是对一些URL进行认证鉴权的话,我们完 全没必要引入SpringSecurity或Shiro等框架,使用拦截器或过滤器就足以实现需求.         本文介绍如何使用过滤器Filter实现URL签名认证鉴权. 本人测试软硬件环境:Windows10.Eclipse.SpringBoot.JDK1.8 准备工作 第一步:在pom.xml中引入相关依赖 <dependencies> <dep

  • Kubernetes 权限管理认证鉴权详解

    目录 正文 认证 认证用户 Normal Users Service Accounts 认证策略 客户端证书 不记名令牌 Static Token File Service Account Tokens OpenID Connect Tokens 鉴权 鉴权流程 鉴权模块 RBAC Role 和 ClusterRole RoleBinding 和 ClusterRoleBinding Service Account 最后 正文 Kubernetes 主要通过 API Server 对外提供服务,

  • Spring Boot 访问安全之认证和鉴权详解

    目录 拦截器 认证 鉴权 在web应用中有大量场景需要对用户进行安全校,一般人的做法就是硬编码的方式直接埋到到业务代码中,但可曾想过这样做法会导致代码不够简洁(大量重复代码).有个性化时难维护(每个业务逻辑访问控制策略都不相同甚至差异很大).容易发生安全泄露(有些业务可能不需要当前登录信息,但被访问的数据可能是敏感数据由于遗忘而没有受到保护). 为了更安全.更方便的进行访问安全控制,我们可以想到的就是使用springmvc的拦截器(HandlerInterceptor),但其实更推荐使用更为成熟

  • 浅析k8s中各组件和kube apiserver通信时的认证和鉴权问题

    目录 背景 kubectl的身份和权限 kubectl用的是什么身份? 能操作哪些资源呢? kube-scheduler的身份和权限 kube-scheduler用的是什么身份? kubelet的身份和权限 kubelet用的是什么身份? kubelet能操作哪些资源? 验证kubelet的权限 calico calico用的是什么身份? pod pod用的是什么身份? 总结 背景 和master节点kube api-server通信的组件有很多,包括: kubelet calico sched

  • nuxt框架中路由鉴权之Koa和Session的用法

    引子 博客的后台管理页面需要有登录系统,所以考虑做一下路由鉴权,实现方式也是 Nuxt 官网给出栗子来改写,顺便也将前后端路由给统一了. 路由拦截 前端方面主要通过利用 Nuxt 的中间件来做路由拦截,这里也是需要 Vuex 状态树来做. middleware middleware/auth.js export default function ({ store, redirect }) { if (!store.state.user) { return redirect('/login') }

  • koa2服务端使用jwt进行鉴权及路由权限分发的流程分析

    大体思路 后端书写REST api时,有一些api是非常敏感的,比如获取用户个人信息,查看所有用户列表,修改密码等.如果不对这些api进行保护,那么别人就可以很容易地获取并调用这些 api 进行操作. 所以对于一些api,在调用之前,我们在服务端必须先对操作者进行"身份认证",这就是所谓的鉴权. Json Web Token 简称为 JWT,它定义了一种通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名,复杂度较

  • 前后端常见的几种鉴权方式(小结)

    最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方式整理一下. 目前我们常用的鉴权有四种: HTTP Basic Authentication session-cookie Token 验证 OAuth(开放授权) 一.HTTP Basic Authentication 这种授权方式是浏览器遵守http协议实现的基本授权方式,HTTP协议进行通信的过程中,HTTP协议定义了基本认证认证允许HTTP服务器对客

  • 聊聊鉴权那些事(推荐)

    在系统级项目开发时常常会遇到一个问题就是鉴权,身为一个前端来说可能我们距离鉴权可能比较远,一般来说我们也只是去应用,并没有对权限这一部分进行深入的理解. 什么是鉴权 鉴权:是指验证用户是否拥有访问系统的权利.传统的鉴权是通过密码来验证的.这种方式的前提是,每个获得密码的用户都已经被授权.在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请.这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人

  • Node.js Koa2使用JWT进行鉴权的方法示例

    前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作.那么服务器端要如何进行鉴权呢? Json Web Token 简称为 JWT,它定义了一种用于简洁.自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名. 说得好像跟真的一样,那么到底要怎么进行认证呢? 首先用户登录时,输入用户名和密码后请求服务器登录接口

随机推荐