文档章节

RGW S3 Authorize解析

linuxhunter
 linuxhunter
发布于 2016/04/18 17:46
字数 832
阅读 453
收藏 1

截止到目前为止,RGW S3的认证部分支持AWS v4认证、AWS v2认证以及匿名用户认证。这三种认证的总入口位于rgw_process.cc::process_request()函数,该函数中处理认证部分的代码如下:

rgw_process.cc::process_request()

|__RGW_Auth_S3::authorize()

    |__根据HTTP请求参数决定认证方式(AWS v4/AWS v2/匿名认证)

下面分别描述这三种认证方式:

1、AWS v2认证方式。

AWS v2认证由RGW_Auth_S3::authorize_v2()函数处理。使用AWS v2方式认证,用户首现根据用户的secret key对认证头部数据进行签名操作,与此同时将认证头部数据、签名数据、用户的access key信息加入到HTTP请求数据流中。RGW收到HTTP请求数据流后提取出上述信息,之后通过用户的access key获取到用户信息(user info)。之后使用用户信息中的secret key对HTTP请求数据流中的认证头部数据进行签名操作,最后判断由RGW计算出来的签名值是否与HTTP请求数据流中的签名值一致来实现用户的认证。

AWS v2函数处理流程如下:

RGW_Auth_S3::authorize()

|__通过HTTP请求数据流得到用户的access key(ASWAccessKeyId)、签名字符串(Signature)

|__检查是否是keystone认证,若是则走keystone认证

|__检查是否是LDAP认证,若是则走LDAP认证

|__通过用户的access_key获取到user info信息

|__rgw_create_s3_canonical_header()                    从HTTP请求数据流中获取认证头部数据

     认证头部分包括如下信息:

          req_info.method

          req_info.env[HTTP_CONTENT_MD5]

          req_info.env[CONTENT_TYPE]

          req_info.env[HTTP_DATE]

          req_info.x_meta_map

          req_info.request_uri

          req_info.args.get_sub_resources()

|__rgw_get_s3_header_digest()               

     |__ceph_armor()                    使用user info的secret key对认证头部分做签名操作并得到签名结果

|__比较计算的签名和传过来的auth_sign是否一致

2、AWS v4认证方式。

AWS v4认证由RGW_Auth_S3::authorize_v4()函数处理。根据AWS最新的认证规范,AWS v4认证要比AWS v2认证更加全面。

AWS v4认证使用的主要数据结构说明如下:

struct rgw_aws4_auth {

     string date;                                                  "X-Amz-Date"

     string expires;                                             “X-Amz-Expires"

     string credential;                                        "X-Amz-Credential"

     string signedheaders;                                “X-Amz-SignedHeaders"

     string signed_hdrs;

     string access_key_id;

     string credential_scope;

     string canonical_uri;

     string canonical_qs;

     string signature;                                         “X-Amz-Signature"

     string new_signature;

     string payload_hash;

};

AWS v4认证处理流程如下:

RGW_Auth_S3::authorize_v4()

|__创建struct rgw_aws4_auth对象

|__根据HTTP请求数据流初始化struct rgw_aws4_auth对象

|__检查struct rgw_aws4_auth::credential格式是否正确

|__从struct rgw_aws4_auth::credential中获取access key(从开始到第一个”/"为止)

|__rgw_get_user_info_by_access_key()                              通过access key得到用户信息user info

|__解析HTTP请求字符串中info.request_params字符串得到canonical_qs_map[key]=value

|__按照格式key=value&key=value将canonical_qs_map中的内容写入到struct rgw_aws4_auth::cannonical_qs中

|__解析struct rgw_aws4_auth::signedheaders字符串得到canonical_hdrs_map[token]=token_value

|__按照格式token:value\ntoken:value酱canonical_hdrs_map中的内容写入到struct rgw_aws4_auth::canonical_hdrs中

|__设置struct rgw_aws4_auth::signed_hdrs = struct rgw_aws4_auth::signedheaders

|__authorize_v4_complete()

     |__rgw_create_s3_v4_canonical_request()

          |__rgw_assemble_s3_v4_canonical_request()

          |__rgw_hash_s3_string_sha256()

     |__rgw_create_s3_v4_string_to_sign()

          |__rgw_assemble_s3_v4_string_to_sign()

     |__rgw_calculate_s3_v4_aws_signature()

|__比较struct rgw_aws4_auth::signature与经过计算后的struct rgw_aws4_auth::new_signature是否一致

3、匿名用户认证方式。

匿名用户认证方式由rgw_rest_s3.cc::init_anon_user()函数处理。匿名用户认证处理流程如下:

init_anon_user()

|__rgw_get_anon_user()

     |__设置用户信息RGWUserInfo.user_id = RGW_USER_ANON_ID

     |__清空用户信息RGWUserInfo.display_name和access_key

|__设置struct req_state::perm_mask = RGW_PERM_FULL_CONTROL


© 著作权归作者所有

上一篇: RGW Usage类解析
下一篇: RGW S3 GC解析
linuxhunter
粉丝 72
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
RadosGW框架分析

RadosGW分析。 一、RadosGW的main()函数解析。 RadosGW的main()函数位于rgwmain.cc中,该函数是RadosGW的入口函数。这里主要解析和RadosGW相关的内容,尽量省略WebServer的内容。 main()函数...

linuxhunter
2016/04/07
895
1
rgw object read and write

一、Get Object。 1、读取Object的主要处理流程。 RGWGetObj::execute() |创建RGWGetObjCB类实例,其中handledata()函数为回调函数,该函数会调用RGWGetObj::getdatacb()函数,而该函数最终会...

linuxhunter
2016/04/12
917
4
RGW S3 Multipart解析

S3分段上传技术主要应用在大文件的数据上传上,通常在S3客户端会对上传的大文件做一次分片操作。在RGW内部还会对S3客户端发送过来的数据再进行一次分片处理,RGW默认分片大小是4MB。下面就M...

linuxhunter
2016/04/13
633
1
RGW S3 CORS解析

一、RGW S3 CORS核心类关系图。 二、RGW S3 CORS处理类关系图。 三、RGW S3 CORS操作解析。 1、PUT CORS操作。 RGWPutCORS::execute() |RGWPutCORSObjStoreS3::getparams() |从HTTP请求数据流...

linuxhunter
2016/04/14
329
0
RGW S3 ACL解析

RGW ACL主要类关系图如下图所示: RGW ACL处理类关系图如下图所示: RGW ACL主要处理流程详细说明如下。 一、PUT ACL。 RGWPutACL::execute() |从HTTP请求数据流中解析出RGWAccessControlPol...

linuxhunter
2016/04/14
200
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
42分钟前
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
45分钟前
7
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
45分钟前
3
0
influxdb continuous queries(cq)从入门到放弃

从前一篇influxdb的文章prometheus基于influxdb的监控数据持久化存储方案完成之后,就一直在折腾influxdb发布测试和生产环境的问题,经过接近2个月的验证,最终发现使用influxdb自带cq的方案...

狗陈
57分钟前
7
0
7.线程通信

在现实生活中,如果一个人团队正在共同完成任务,那么他们之间应该有通信,以便正确完成任务。 同样的比喻也适用于线程。 在编程中,要减少处理器的理想时间,我们创建了多个线程,并为每个线...

Eappo_Geng
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部