rgw支持s3的acl机制,可以通过GetAcl PutAcl获取和设置Object和Bucket级别的acl,见https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Bucket级别的acl信息是存储在Bucket Instance对象的attr中的;
Object级别的acl是存储在Object Header对象的attr中的。
Put ACL和Get ACL操作就是简单将acl信息存入上述位置或从上述位置读取返回ACL信息给用户。
某操作的acl的鉴权,很简单,在操作之前从Bucket或Object的attr中读取acl到内存对象,然后判断该操作是否能通过acl鉴权,通过后才能继续执行请求。其读取和鉴权流程如下。
在rgw的I/O路径一文中我有写过,rgw的请求入口是process_request
函数的,然后调用rgw_process_authenticated
函数进行各种鉴权、校验和请求执行操作。而acl的读取和鉴权也是在这里。
- rgw_process_authenticated
- RGWHandler_REST::init_permissions
- RGWHandler::do_init_permissions
- rgw_build_bucket_policies :在此获取bucket级别的acl,从bucket instance对象中读取attrs并解析acl到内存中的
RGWAccessControlPolicy_S3
对象中- get_bucket_instance_info:从磁盘读取attrs
- read_bucket_policy:从attrs中解析acl到对象
- rgw_build_bucket_policies :在此获取bucket级别的acl,从bucket instance对象中读取attrs并解析acl到内存中的
- RGWHandler::do_init_permissions
- RGWHandler_REST::read_permissions
- RGWHandler::do_read_permissions
- rgw_build_object_policies :在此获取object级别的acl
- read_obj_policy :从header对象读取attrs,并从其中解析到RGWAccessControlPolicy对象
- rgw_build_object_policies :在此获取object级别的acl
- RGWHandler::do_read_permissions
- RGWGetObj::verify_permission :此处调用对应操作重载的verify_permission函数
- verify_object_permission :对象相关的acl鉴权会调用这个函数来完成
- RGWAccessControlPolicy::verify_permission:鉴权的细节在这个函数,将用户请求的动作转换成32位无符号整数的权限码perm,然后与从rados层获取的acl对象中的acl信息得到的权限码policy_perm做与操作,判断与操作之后的acl_perm与原来的perm是否相同,不相同则鉴权不通过
- verify_object_permission :对象相关的acl鉴权会调用这个函数来完成
- RGWHandler_REST::init_permissions