截止到目前爲止,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