MongoDB权限验证流程

简介:

上篇文章说到,MongoDB的网络通讯协议流程。拿到请求对象后,会调用assemblyResonse函数处理。这部分的代码实在没什么章法可言,if-else遍地,实在不怎么优雅。可以感受到随着需求的增长,很多代码都是硬套上去的。本篇介绍的是基本的处理请求,基本请求所指的是command命令以外的处理行为。

assembleResponse

首先,获取到线程绑定(ThreadLocal)Client对象,并对权限模块初始化,更新Auth Cache中过期或者失效的权限信息。然后,根据配置记录diaglog;接着统计操作计数器。接着,调用receivedXXXX函数,执行相关请求,其间会对权限进行判断。最后,根据slowlog配置,记录Profiling数据。

Query为例:

try {
    ...
    Status status = client->getAuthorizationSession()->checkAuthForQuery(ns, q.query);
    audit::logQueryAuthzCheck(client, ns, q.query, status.code());
    uassertStatusOK(status);
    ...
catch (AssertionException& e) {
    ...
    ok = false;
}

checkAuthForQuery之后会调用isAuthorizedForActionsOnNamespace做具体的验证功能:

if (!isAuthorizedForActionsOnNamespace(ns, ActionType::find)) {
    return Status(ErrorCodes::Unauthorized,
        str::stream() << "not authorized for query on " << ns.ns());
}

isAuthorizedForActionsOnNamespace函数用来验证资源和动作的权限合法性,不同的操作都对应自己的一套动作,相关的对应关系总结如下:

OP_CODE VALUE receivedXXXX checkAuthForXXXX ActionType
OP_UPDATE 2001 receivedUpdate checkAuthForUpdate update
OP_INSERT 2002 receivedInsert checkAuthForInsert createIndex/insert
OP_QUERY 2004 receivedQuery checkAuthForQuery find
OP_GET_MORE 2005 receivedGetMore checkAuthForGetMore listCollections/listIndexes/find
OP_DELETE 2006 receivedDelete checkAuthForDelete remove
OP_KILL_CURSORS 2007 receivedKillCursors checkAuthForKillCursors killCursors

PS:

  1. 2003操作代码已经废弃,目前是保留字段
  2. command请求也是通过OP_QUERY发送过来的,对于command请求,代码上分之处理,个人不是很喜欢这个混用OP_CODE的风格,也许是伟大的历史原因造成的
  3. inprog killop unlock 不走以上流程,通过Query包封装传递过来后,调用了相应的处理函数处理
  4. command的权限验证额外说明
  5. 所有的ActionType定义在db/auth/action_types.txt中,非常多

isAuthorizedForActionsOnNamespace

主要对Action和Resource封装,然后调用_isAuthorizedForPrivilege完成功能。

简单介绍下Privilege,Action就是对数据的操作,比如Query,Insert都可以归纳为Action;Resource就是数据集合,可以是Collection,也可以是DB,那Privilege就是Action*Privilege的组合,一个Privilege可以含有多个Action,但在Privilege维度上,Action都只能与一个(或者表达式)Resource组合。Privilege的集合可以组合成Role概念,方便用户配置。

这个函数的处理算法是,遍历授权过的所有用户,和待验证的Resource比较,如果找到,则对比Action,所有的Action都找到的话,则通过验证。

for (UserSet::iterator it = _authenticatedUsers.begin();
        it != _authenticatedUsers.end(); ++it) {
    User* user = *it;
    for (int i = 0; i getActionsForResource(resourceSearchList[i]);
        unmetRequirements.removeAllActionsFromSet(userActions);
        if (unmetRequirements.empty())
            return true;
    }
}
目录
相关文章
|
JSON NoSQL MongoDB
mongodb基本操作,增删改查,查询,索引,权限机制
mongodb基本操作,增删改查,查询,索引,权限机制
|
存储 安全 NoSQL
云MongoDB网络安全策略和权限管理体系
阿里云MongoDB在市场上实际使用时,如何保障数据库安全性?又是如何防止数据库受到攻击?本文将带领你了解云数据库MongoDB云环境的网络安全策略和MongoDB自身的权限管理体系。
3349 0
|
JSON NoSQL MongoDB
MongoDB(一)——增删改查,排序分页,索引,权限机制
数据库就是用来存放数据的仓库 关系型和非关系型数据库软件的项目数据 相同点:都是数据库软件,用来存放项目数据
725 0
MongoDB(一)——增删改查,排序分页,索引,权限机制
|
存储 监控 NoSQL
🍃MongoDB结合Koa2做用户登录验证
🍃MongoDB结合Koa2做用户登录验证
551 0
🍃MongoDB结合Koa2做用户登录验证
|
NoSQL MongoDB 数据库
MongoDB 账户权限配置
MongoDB 账户权限配置
782 0
MongoDB 账户权限配置
|
NoSQL 安全 Shell
MongoDB 安全策略:验证和授权
对于新安装的 MongoDB ,它是没有开启身份验证的。需要进入 admin 数据库,创建一个 root 角色的超级管理员用户。之后再针对具体应用的数据库,使用管理员用户为其创建不同权限的用户,从而做到针对数据库安全的基本保障。
3317 0
|
NoSQL MongoDB 数据库
mongodb使用使用 SCRAM 验证客户端设置访问控制
SCRAM 验证客户端设置访问控制
334 0
|
NoSQL Java 测试技术
docker-compose部署mongodb4.4.8副本集群 + 权限 + springBoot集成测试
docker-compose部署mongodb4.4.8副本集群 + 权限 + springBoot集成测试
1252 0
|
NoSQL 关系型数据库 MySQL
全栈开发【第3期】MongoDB入门之数据库权限设置
全栈开发【第3期】MongoDB入门之数据库权限设置
731 0
|
JSON NoSQL 数据可视化
使用node+express+mongodb实现用户注册、登录和验证功能
使用node+express+mongodb实现用户注册、登录和验证功能
1863 0

推荐镜像

更多