【ceph学习】S3权限认证部分

认证过程简介

认证的过程是一个对用户信息进行解析并且判断前后得到的秘钥是否一致的过程。

auth_regitry的创建

在rgw_main.cc:main()中进行初始化auth_registry对象

/*rgw_main.cc*/
/* Initialize the registry of auth strategies which will coordinate
* the dynamic reconfiguration. */
auto auth_registry = \rgw::auth::StrategyRegistry::create(g_ceph_context, store);
very_request()进行认证

当请求来临的时候,对用户信息进行分析和认证。

/* rgw_process.cc */
ldpp_dout(op, 2) << "verifying requester" << dendl;
ret = op->verify_requester(auth_registry);
  1. 首选利用用户的req_state进行申请秘钥

如下述代码中:auth_data = ver_abstractor.get_auth_data(s);通过具体的策略进行秘钥(auth_data.client_signature)的计算。然后将秘钥和一些其他参数传递到下一个函数。

/* AWSEngine类型的验证。 */
AWSEngine::result_t
AWSEngine::authenticate(const DoutPrefixProvider* dpp, const req_state* const s) const
{/* Small reminder: an ver_abstractor is allowed to throw! *//* 根据req_state生成auth_data,其中含有秘钥。便于下一步中的authenticate(*****)对比 */const auto auth_data = ver_abstractor.get_auth_data(s);if (auth_data.access_key_id.empty() ||                auth_data.client_signature.empty()) {return result_t::deny(-EINVAL);} else {/*下述函数是一个多态函数,具体选择和对应的策略一致*/return authenticate(dpp,auth_data.access_key_id,auth_data.client_signature,auth_data.session_token,auth_data.string_to_sign,auth_data.signature_factory,auth_data.completer_factory,s);}
}
  1. 再次计算秘钥,进行对比

以LocalEngine::authenticate为例进行分析,signature.compare(server_signature);

/* * 执行步骤:* 1.rgw_get_user_info_by_access_key,获取用户信息* 2.server_signature_t=signature_factory(),生成签名* 3.compare,对比* */rgw::auth::Engine::result_t
rgw::auth::s3::LocalEngine::authenticate(const DoutPrefixProvider* dpp,const boost::string_view& _access_key_id,const boost::string_view& signature,const boost::string_view& session_token,const string_to_sign_t& string_to_sign,const signature_factory_t& signature_factory,const completer_factory_t& completer_factory,const req_state* const s) const
{/* get the user info */RGWUserInfo user_info;/* TODO(rzarzynski): we need to have string-view taking variant. */const std::string access_key_id = _access_key_id.to_string();const auto iter = user_info.access_keys.find(access_key_id);const RGWAccessKey& k = iter->second;/* 由签名工厂生成一个签名 */const VersionAbstractor::server_signature_t server_signature = \signature_factory(cct, k.key, string_to_sign);auto compare = signature.compare(server_signature);/* 传进来的“签名”参数和生成的签名进行对比  */if (compare != 0) {return result_t::deny(-ERR_SIGNATURE_NO_MATCH);}/* what 意思,move的蛋疼…… */auto apl = apl_factory->create_apl_local(cct, s, user_info, k.subuser, boost::none);return result_t::grant(std::move(apl), completer_factory(k.key));
}

关键数据结构介绍

engine的结构图:

engine的结构图:

authorize的结构图:

strategy的结构图:

认证流程详细分析

1.创建策略集合

这个步骤是在rgw_main.cc:main中进行。StrategyRegistry是一个策略集合,对应了几种秘钥策略。这些策略和engine相对应,engine负责进行秘钥的计算和匹配。

  /* Initialize the registry of auth strategies which will coordinate* the dynamic reconfiguration. */auto auth_registry = \rgw::auth::StrategyRegistry::create(g_ceph_context, store);
2.验证

其中涉及多次多态选择,strategy和engine相互匹配,keystone,swift,s3分别有不同的验证体系,如果想要搞清楚具体之间的关系,还需要慢慢看!

op->verify_requester(auth_registry); //rgw_process.cc/*authorize是一个虚函数,由具体的Handler执行*/dialect_handler->authorize(this); // rgw_op.h/*其实是又是多态,具体见类分析*/RGW_Auth_S3::authorize(); //rgw_rest_s3.ccrgw::auth::Strategy::apply(dpp, auth_registry.get_s3_main(), s); //实际比较/*具体的*/auto result = auth_strategy.authenticate(dpp, s);rgw::auth::Strategy::authenticate()//还有一个匿名的调用方法,根据具体的strategy进行选择。for (const stack_item_t& kv : auth_stack)//遍历auth_stack<engine,control>engine.authenticate(dpp, s);//具体的engine进行计算认证。还是多态!AWSEngine::authenticate();/*根据req_state生成auth_data,其中含有秘钥。便于下一步中的authenticate(*****)对比*/auth_data = ver_abstractor.get_auth_data(s);/*没错!同名函数!参数不同!而且还是虚函数!!!!*/authenticate(dpp,auth_data.access_key_id,    //accesskeyauth_data.client_signature, //签名auth_data.session_token,auth_data.string_to_sign,auth_data.signature_factory, //签名工厂auth_data.completer_factory,s);/* 由签名工厂生成一个签名 */const VersionAbstractor::server_signature_t server_signature = \signature_factory(cct, k.key, string_to_sign);/* 传进来的“签名”参数和生成的签名进行对比  */auto compare = signature.compare(server_signature);

后续

个人认为:认证签名的过程属于边缘功能,但是却融合了OP、Handler和User的相互纠缠关系,真是一个错综复杂,画图分析,抽茧剥丝太难了,很难去像拎葡萄一样,一串就出来了。还需要慢慢磨~

参考文献

Amazon Simple Storage Service Developer Guide
Amazon Simple Storage Service API Reference
RGW LDAP Authentication
Ceph RGW的身份验证代码概览
Ceph浅析(中):结构、工作原理及流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411351.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器中的开源SQL可视化工具:sqliteviz

sqliteviz&#xff1a; 在浏览器中&#xff0c;即刻开启数据可视化之旅。- 精选真开源&#xff0c;释放新价值。 概览 sqliteviz是一个专为数据可视化而设计的单页离线优先PWA&#xff0c;它利用了现代浏览器技术&#xff0c;让用户无需安装任何软件即可在本地浏览器中进行SQL…

WxPython可视化编辑器

作者&#xff1a;陈炳强 WxPython是python的一个用来写桌面程序的模块,目前只写了小部分功能跟组件, 用Python写中文&#xff0c;非常方便&#xff01; 下载地址&#xff1a;https://pan.quark.cn/s/ba19b2472246

大模型提示词工程技术2-设计有效的提示词技巧、角色与上下文在提示中的应用

大模型提示词工程技术2-设计有效的提示词技巧、角色与上下文在提示中的应用。《大模型提示词工程技术》的作者&#xff1a;微学AI&#xff0c;这是一本专注于提升人工智能大模型性能的著作&#xff0c;它深入浅出地讲解了如何通过优化输入提示词来引导大模型生成高质量、准确的…

19.神经网络 - 线性层及其他层介绍

神经网络 - 线性层及其他层介绍 1.批标准化层–归一化层&#xff08;不难&#xff0c;自学看官方文档&#xff09; Normalization Layers torch.nn — PyTorch 1.10 documentation BatchNorm2d — PyTorch 1.10 documentation 对输入采用Batch Normalization&#xff0c;可…

美发店会员系统设计解读之规格选择-SAAS本地化及未来之窗行业应用跨平台架构

一、请求产品信息 $.ajax({type:"get", //请求方式async:true, //是否异步url:"服务器",dataType:"json", //跨域json请求一定是jsonpjsonp: "cwpd_showData_dy_spec", //跨域请求的参数名&#xff0c;默认是callback//js…

从学习到工作,2024年不可或缺的翻译助手精选

翻译工具利用先进的机器学习和自然语言处理技术&#xff0c;能够迅速将一种语言的文档转换为另一种语言&#xff0c;极大地促进了信息的无障碍流通。接下来&#xff0c;我们将介绍几款功能强大、操作简便的类似deepl翻译的工具&#xff0c;帮助你轻松应对各种翻译需求。 第一款…

pymysql cursor使用教程

Python之PyMySQL的使用&#xff1a; 在python3.x中&#xff0c;可以使用pymysql来MySQL数据库的连接&#xff0c;并实现数据库的各种操作&#xff0c;本次博客主要介绍了pymysql的安装和使用方法。 PyMySQL的安装 一、.windows上的安装方法&#xff1a; 在python3.6中&…

基于SpringBoot的校园闲置物品交易管理系统

基于SpringBootVue的校园闲置物品交易管理系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 基于SpringBoot与Vue的校…

Linux驱动开发—创建总线,创建属性文件

文章目录 1.什么是BUS&#xff1f;1.1总线的主要概念1.2总线的操作1.3总线的实现 2.创建总线关键结构体解析2.1注册总线到系统2.2 struct bus_type *bus 解析 3.实验结果分析1. devices 目录2. drivers 目录3. drivers_autoprobe 文件4. drivers_probe 文件5. uevent 文件 4.在…

vscode远程连接服务器并根据项目配置setting.json

vscode连接好远程服务器&#xff0c;打开项目文件&#xff0c;按下快捷键&#xff1a;CtrlShiftP 搜索setting.json 这边可以看到不同范围的setting.json&#xff0c;这边以文件夹&#xff08;项目&#xff09;为单位&#xff0c;即在打开的文件夹内创建setting.json&#xff…

axure9树形元件节点的添加

树形元件 | AxureChina 在需要添加节点处右键添加->添加子节点

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Strand of the Ancients

Call to Arms: Strand of the Ancients - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 Call to Arms: Strand of the Ancients 战斗的召唤&#xff1a;远古海滩 打掉最后一个门【古代圣物之厅】&#xff0c;人跳进去就赢了 拿【炸弹】…

SpringBoot集成kafka-监听器注解

SpringBoot集成kafka-监听器注解 1、application.yml2、生产者3、消费者4、测试类5、测试 1、application.yml #自定义配置 kafka:topic:name: helloTopicconsumer:group: helloGroup2、生产者 package com.power.producer;import com.power.model.User; import com.power.uti…

UnQLite:多语言支持的嵌入式NoSQL数据库深入解析

文章目录 1. 引言2. Key/Value 存储接口2.1 关键函数2.2 使用示例2.3 高级操作&#xff1a;批量文件存储 3. 游标的使用4. UnQLite-Python使用示例4. UnQLite数据库引擎架构5.1 Key/Value存储层5.2 文档存储层5.3 可插拔的存储引擎5.4 事务管理器与分页模块5.5 虚拟文件系统 6.…

游戏开发设计模式之模板方法模式

目录 模板方法模式在游戏开发中的具体应用案例是什么&#xff1f; 如何在不同类型的游戏&#xff08;如角色扮演游戏、策略游戏等&#xff09;中实现模板方法模式&#xff1f; 模板方法模式与其他设计模式&#xff08;如观察者模式、状态模式等&#xff09;相比&#xff0c;…

物联网平台与边缘计算平台,ThingsKit与AIoTedge

物联网平台和边缘计算平台是现代智能系统中不可或缺的组成部分&#xff0c;它们共同支撑着设备的连接、数据的收集和智能分析等功能。ThingsKit和AIoTedge是两个专注于不同层面的平台&#xff0c;它们各自具有独特的特点和优势。 ThingsKit是一个运行在云端的通用物联网平台&am…

深度学习项目实践——qq聊天机器人(transformer)(一)原理介绍

文章目录 首先第一步——QQ是如何实现实时聊天数据传输过程1. 用户发送消息的开始2. 数据封装与加密3. 建立连接&#xff1a;WebSocket协议的应用4. 消息的传输过程5. 接收者获取消息6. 双向通信与实时性保障7. 保持连接与断线重连 第二步——聊天机器人是如何来接管QQ账号的组…

论文阅读笔记:RepViT: Revisiting Mobile CNN From Vit Perspective

文章目录 RepViT: Revisiting Mobile CNN From Vit Perspective动机现状问题 贡献实现Block设置独立的token融合器和通道融合器减少膨胀并增加宽度 宏观设计stem的早期卷积简单分类器整体阶段比率 微观设计内核大小选择Squeeze-and-excitation层放置网络架构 实验ImageNet-1K上…

Jmeter(十四)Jmeter分布式部署测试

单个接口测试&#xff0c;我们使用谷歌的插件postman 多个接口测试&#xff0c;我们使用Jmeter进行测试 一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试&#xff0c;在用posman测试时候会发现的是一个接口一个接…

存储架构模式之复制架构

存储类问题处理框架图 故障&#xff1a;机器挂掉 灾难&#xff1a;自然灾害 多活&#xff1a;技术复杂度高、成本高 高可用的关键指标 stag1是正常状态&#xff0c;系统和业务都是正常的 stag2是故障状态&#xff0c;系统和业务都是异常的 stag3是系统恢复正常&#xff0c…