ceph rgw:acl鉴权

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到对象
    • RGWHandler_REST::read_permissions
      • RGWHandler::do_read_permissions
        • rgw_build_object_policies :在此获取object级别的acl
          • read_obj_policy :从header对象读取attrs,并从其中解析到RGWAccessControlPolicy对象
    • RGWGetObj::verify_permission :此处调用对应操作重载的verify_permission函数
      • verify_object_permission :对象相关的acl鉴权会调用这个函数来完成
        • RGWAccessControlPolicy::verify_permission:鉴权的细节在这个函数,将用户请求的动作转换成32位无符号整数的权限码perm,然后与从rados层获取的acl对象中的acl信息得到的权限码policy_perm做与操作,判断与操作之后的acl_perm与原来的perm是否相同,不相同则鉴权不通过

你可能感兴趣的:(ceph rgw:acl鉴权)