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

news2024/9/23 13:30:36

认证过程简介

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

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.cc
        rgw::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,    //accesskey
		                    auth_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.coloradmin.cn/o/2084727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪款伴奏提取免费软件比较好?音乐制作利器快速分离人声与伴奏

无论是在健身房挥汗如雨&#xff0c;还是在家中享受宁静的夜晚&#xff0c;一首美妙的旋律总能让人心旷神怡。但大家是否想过&#xff0c;那些动人心弦的伴奏是如何从混音中被抽离出来的呢&#xff1f; 作为一个音乐爱好者&#xff0c;我发现了5款“伴奏提取器在线”神奇工具&…

室内蓝牙导航定位技术应用优势

在错综复杂的室内环境中&#xff0c;精准导航一直是用户与管理者共同面临的难题。随着科技的进步&#xff0c;室内蓝牙导航定位技术应运而生&#xff0c;以其独特的优势正逐步改变这一现状。本文就由沧穹给大家具体介绍一下室内蓝牙导航定位技术应用优势。 首先&#xff0c;蓝牙…

[VG] TransVG++

1. BaseInfo TitleTransVG: End-to-End Visual Grounding with Language Conditioned Vision TransformerAdresshttps://arxiv.org/pdf/2206.06619Journal/Time202206 IEEE TPAMIAuthor中科大Codehttps://github.com/djiajunustc/TransVGRead20240717/ 0829TableVisonLanguage…

Linux3-Linux用户和权限

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#…

基于微信小程序的足球赛事系统设计与实现---附源码94364

摘要 本文介绍了一种基于微信小程序的足球赛事系统的设计与实现方法&#xff0c;该系统利用Spring Boot框架作为后端支持。该系统旨在提供一个便捷、高效且用户友好的平台&#xff0c;使足球爱好者能够轻松浏览赛事信息、参与赛事讨论并享受个性化的赛事推荐。 在设计方面&…

RX 8000系显卡规格曝光,全系GDDR6纯过渡产品

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; RX 8000系显卡规格首曝&#xff0c;GDDR6显存就很骨感 前天&#xff0c;我们刚刚聊过有过新一代RTX 50系消息&#xff0c;虽然是按部就班地升级&#xff0c;但好在也是在升级。50系换核心升级显…

Ascend C算子开发(入门)—— 算子开发环境搭建

文章目录 Ascend C算子开发&#xff08;入门&#xff09;—— 算子开发环境搭建在CPU上部署开发环境准备工作步骤配置环境变量配置pip源pip安装依赖包安装开发套件包 Ascend C算子开发&#xff08;入门&#xff09;—— 算子开发环境搭建 安装包解读 Ascend-cann-功能-版本-平台…

忘掉 Siri 吧:苹果可能会推出拥有自己AI“个性”的机器人设备|TodayAI

近日&#xff0c;知名科技记者 Mark Gurman 报道称&#xff0c;苹果公司&#xff08;Apple&#xff09;正计划进军机器人领域&#xff0c;推出旨在解决“第一世界问题”的新产品。据 Gurman 透露&#xff0c;苹果还可能利用生成式 AI 技术&#xff0c;为其机器人设备打造一个全…

设计模式创建型模式之原型模式

设计模式之原型模式 一、背景1、解决性能问题2、对象的创建需要运行时信息3、对象的创建过程复杂4、对象的创建与使用分离 二、介绍1、定义2、组成 三、代码实现1、实现Cloneable接口2、代码实现分析3、注意事项 四、总结1、实现Cloneable接口2、原型模式的优点包括&#xff1a…

QString 初始化

QString不用初始化&#xff0c;创建变量的时候默认就初始化了 默认构造函数&#xff1a;QString 的默认构造函数会初始化一个空的 QString 对象。具体来说&#xff0c;这是一个“空字符串”&#xff08;empty string&#xff09;&#xff0c;而不是指针为 nullptr 的情况。空字…

医疗知识图谱工程研究记录

医疗诊断知识图谱 本项目是基于知识图谱的知识问答项目。过程为对问句进行解析&#xff0c;形成若干三元组及相关的操作条件&#xff0c;转换为查询语句&#xff0c;查询数据库返回结果。 KBQA方式的问答包括意图分析、标签&#xff08;实体、操作符&#xff09;识别、条件体…

Linux2-Linux基础命令

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 练习 请根据语言描述&am…

Linux 2.6 内核进程调度队列

Linux 2.6 内核进程调度队列 运行队列&#xff08;runqueue&#xff09;蓝色区域&#xff08;活动队列&#xff09;queuebitmapnr_active总结&#xff1a;时间片还没有结束的所有进程都按照优先级放在该队列&#xff08;活动队列&#xff09; 红色区域&#xff08;过期队列&…

scrapy框架--快速了解

免责声明:本文仅做分享~ 目录 介绍: 5大核心组件: 安装scrapy: 创建到启动: 修改日志配置:settings.py 修改君子协议配置: 伪装浏览器头: 让代码去终端执行: 数据保存: 1-基于命令 2-基于管道 文档: 介绍: 5大核心组件: Scrapy是一个开源的Python框架&#xff0c…

【3.5】贪心算法-解优势洗牌(类田忌赛马问题)

一、问题 给定两个 大小相等的数组 A 和 B &#xff0c;A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列&#xff0c;使其相对于 B 的优势最大化。 二、解题思路 这个问题要求我们重新排列数组A&#xff0c;使得在相同位置上&#xf…

Ubuntu 24.04部署Wordpress

环境&#xff1a; Ubuntu 24.04 PHP 8.1.2-1ubuntu2.18 Nginx/1.18.0 (Ubuntu) WordPress 6.6.1 Mysql 8 文章目录 1. 安装php2. 配置nginx2.1. 安装nginx2.2. 配置 3. 下载wordpress3.1. 配置wordpress 4. mysql配置wordpress数据库和用户4.1. 安装和远程连接4.2. 创建wordpre…

uart16550_ip_spec

用途&#xff1a;允许与调制解调器或其他外部设备进行通信&#xff0c;例如使用串行电缆和RS232协议的另一台计算机。 核心特性&#xff1a; WISHBONE接口&#xff1a;支持32位或8位数据总线模式&#xff08;可选&#xff09;。 FIFO操作&#xff1a;仅支持FIFO&#xff08;先…

惊爆!布偶猫喂养秘籍:希喂、交响乐金罐、尾巴生活适合布偶猫吗?

我家布偶甜美可爱&#xff0c;喜欢撒娇爱粘人&#xff0c;真的特别可爱。不过想养好布偶猫喂食非常重要&#xff0c;喂食方法不对&#xff0c;食物没选择好&#xff0c;都会影响布偶猫的健康与正常生长。今天我就就拿布偶猫的选粮标准来测评三款热门主食罐&#xff0c;让大家更…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统&#xff0c;结合数据库技术、Web开发技术等&#xff0c;为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

天气分析预测系统-气象网

项目介绍 在信息科技蓬勃发展的当代&#xff0c;我们推出了一款基于Python Flask的全国上海气象数据采集、预测和可视化系统。随着气候变化越发引起全球关注&#xff0c;精准的气象数据和可视化展示变得愈发重要。该系统采用先进的技术和创新的功能&#xff0c;满足用户对实时…