rgw支持s3的acl機(jī)制州疾,可以通過(guò)GetAcl PutAcl獲取和設(shè)置Object和Bucket級(jí)別的acl涮雷,見(jiàn)https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Bucket級(jí)別的acl信息是存儲(chǔ)在Bucket Instance對(duì)象的attr中的妻枕;
Object級(jí)別的acl是存儲(chǔ)在Object Header對(duì)象的attr中的。
Put ACL和Get ACL操作就是簡(jiǎn)單將acl信息存入上述位置或從上述位置讀取返回ACL信息給用戶(hù)。
某操作的acl的鑒權(quán)客年,很簡(jiǎn)單,在操作之前從Bucket或Object的attr中讀取acl到內(nèi)存對(duì)象漠吻,然后判斷該操作是否能通過(guò)acl鑒權(quán)量瓜,通過(guò)后才能繼續(xù)執(zhí)行請(qǐng)求。其讀取和鑒權(quán)流程如下途乃。
在rgw的I/O路徑一文中我有寫(xiě)過(guò)绍傲,rgw的請(qǐng)求入口是process_request
函數(shù)的,然后調(diào)用rgw_process_authenticated
函數(shù)進(jìn)行各種鑒權(quán)欺劳、校驗(yàn)和請(qǐng)求執(zhí)行操作唧取。而acl的讀取和鑒權(quán)也是在這里。
- rgw_process_authenticated
- RGWHandler_REST::init_permissions
- RGWHandler::do_init_permissions
- rgw_build_bucket_policies :在此獲取bucket級(jí)別的acl划提,從bucket instance對(duì)象中讀取attrs并解析acl到內(nèi)存中的
RGWAccessControlPolicy_S3
對(duì)象中- get_bucket_instance_info:從磁盤(pán)讀取attrs
- read_bucket_policy:從attrs中解析acl到對(duì)象
- rgw_build_bucket_policies :在此獲取bucket級(jí)別的acl划提,從bucket instance對(duì)象中讀取attrs并解析acl到內(nèi)存中的
- RGWHandler::do_init_permissions
- RGWHandler_REST::read_permissions
- RGWHandler::do_read_permissions
- rgw_build_object_policies :在此獲取object級(jí)別的acl
- read_obj_policy :從header對(duì)象讀取attrs枫弟,并從其中解析到RGWAccessControlPolicy對(duì)象
- rgw_build_object_policies :在此獲取object級(jí)別的acl
- RGWHandler::do_read_permissions
- RGWGetObj::verify_permission :此處調(diào)用對(duì)應(yīng)操作重載的verify_permission函數(shù)
- verify_object_permission :對(duì)象相關(guān)的acl鑒權(quán)會(huì)調(diào)用這個(gè)函數(shù)來(lái)完成
- RGWAccessControlPolicy::verify_permission:鑒權(quán)的細(xì)節(jié)在這個(gè)函數(shù),將用戶(hù)請(qǐng)求的動(dòng)作轉(zhuǎn)換成32位無(wú)符號(hào)整數(shù)的權(quán)限碼perm鹏往,然后與從rados層獲取的acl對(duì)象中的acl信息得到的權(quán)限碼policy_perm做與操作淡诗,判斷與操作之后的acl_perm與原來(lái)的perm是否相同,不相同則鑒權(quán)不通過(guò)
- verify_object_permission :對(duì)象相關(guān)的acl鑒權(quán)會(huì)調(diào)用這個(gè)函數(shù)來(lái)完成
- RGWHandler_REST::init_permissions