截止到目前为止,RGW S3的认证部分支持AWS v4认证、AWS v2认证以及匿名用户认证。这三种认证的总入口位于rgw_process.cc::process_request()函数,该函数中处理认证部分的代码以下:数据结构
rgw_process.cc::process_request()函数
|__RGW_Auth_S3::authorize()rest
|__根据HTTP请求参数决定认证方式(AWS v4/AWS v2/匿名认证)
对象
下面分别描述这三种认证方式:token
一、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请求数据流中的签名值一致来实现用户的认证。get
AWS v2函数处理流程以下:string
RGW_Auth_S3::authorize()hash
|__经过HTTP请求数据流获得用户的access key(ASWAccessKeyId)、签名字符串(Signature)it
|__检查是不是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是否一致
二、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是否一致
三、匿名用户认证方式。
匿名用户认证方式由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