• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    关于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操作的鉴权获得了许可。

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

     

    [图-角色权限控制]

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

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

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

     

    [图-mongo鉴权]

    Mongodb 的用户归属于某个数据库,用户需要在所属的数据库中进行鉴权;
    一旦通过鉴权,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。

    二、鉴权方式

    阐述Mongodb支持的几种鉴权方式 鉴权方式是指Mongodb如何识别接入用户,如何检查权限是否合法的一系列校验机制。

    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之间的访问。 内部鉴权目前支持两种方式:

    四、数据库角色

    针对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

    您可能感兴趣的文章:
    • MongoDB 3.0+安全权限访问控制详解
    • MongoDB安全及身份认证(实例讲解)
    • MongoDB开启权限认证的方法步骤详解
    • Java开发之spring security实现基于MongoDB的认证功能
    • Mongodb 3.2.9开启用户权限认证问题的步骤详解
    • mongodb 3.4下远程连接认证失败的解决方法
    • 浅析MongoDB之安全认证
    上一篇:windows7下使用MongoDB实现仓储设计
    下一篇:MongoDB TTL索引的实例详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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