欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-09 09:05:24
前言 本文主要给大家介绍了mongodb认证鉴权的一些相关内容,通过设置认证鉴权会对大家的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操作的鉴权获得了许可。

以上例子可能让你对数据库鉴权有了点浅显认识,那么接下来开始说点概念了,大致是叫基于角色的权限控制

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

[图-角色权限控制]

先解释下图中的几个实体:

  • resource,资源 一个资源可以是一个数据库、集合、或者一个集群..往大了说,任何可能被操作的事物都可以被当做资源。
  • action,动作 动作是指对资源的一个执行行为,比如读取表、读取数据库,其中读取便是一个动作。
  • privilege,权限 权限指的是对某类或某一些资源执行某些动作的允许,与permission的意义一致。
  • role,角色 系统中的角色,通常是代表了一种权力等级的象征,比如论坛中的管理员、版主、游客等等,就是角色; 系统定义中,角色往往代表一组权限的集合。
  • user,用户 可登录系统的实体,一个用户通常可被赋予多个角色。

噢,关于图的简单解释: 权限定义了对某些资源的某些操作,角色则可以拥有多个权限; 用户user可以被赋予多个角色,从而获得这些角色所拥有的权限以操作某些资源

对于mongodb来说,只要开启鉴权,所有的db访问操作都需要通过权限检查。而大致的操作流程跟下图类似

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

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

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

步骤解读

  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

默认为非授权启动 也可以通过配置指定

创建管理员用户

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 操作

是一个全局操作,可执行任意数据库脚本; 执行该命令需要拥有anyaction或anyresource的权限,通常不建议为数据库用户赋予这样的权限。 该命令存在安全风险,已不建议使用(mongodb 3.0之后已经过期)。

总结

以上就是这篇文章的全部内容了,本文还有许多不足,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

扩展阅读

mongodb 鉴权机制

mongodb 内置角色介绍

mongodb 权限操作介绍

运维-mongodb鉴权介绍