From: Casey Bodley Date: Sat, 27 Jan 2024 20:56:09 +0000 (-0500) Subject: rgw: add cross-account policy evaluation X-Git-Tag: v19.1.0~99^2~86 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f917e999c2c8c41d6d5202fe16862f0b9e4b5b90;p=ceph.git rgw: add cross-account policy evaluation Signed-off-by: Casey Bodley (cherry picked from commit 9b3507c95be6128f348ca0b482646dbd7e709b3c) --- diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index cb2304802eba..c1248c2c2323 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -1356,6 +1356,25 @@ bool verify_bucket_permission(const DoutPrefixProvider* dpp, const uint64_t op) { perm_state_from_req_state ps(s); + + if (std::holds_alternative(s->owner.id)) { + if (!ps.identity->is_owner_of(s->bucket_owner.id)) { + ldpp_dout(dpp, 4) << "cross-account request for bucket owner " + << s->bucket_owner.id << " != " << s->owner.id << dendl; + // cross-account requests evaluate the identity-based policies separately + // from the resource-based policies and require Allow from both + return verify_bucket_permission(dpp, &ps, bucket, {}, {}, {}, + user_policies, session_policies, op) + && verify_bucket_permission(dpp, &ps, bucket, user_acl, + bucket_acl, bucket_policy, {}, {}, op); + } else { + // don't consult acls for same-account access. require an Allow from + // either identity- or resource-based policy + return verify_bucket_permission(dpp, &ps, bucket, {}, {}, + bucket_policy, user_policies, + session_policies, op); + } + } return verify_bucket_permission(dpp, &ps, bucket, user_acl, bucket_acl, bucket_policy, user_policies, @@ -1495,6 +1514,28 @@ bool verify_object_permission(const DoutPrefixProvider* dpp, req_state * const s const uint64_t op) { perm_state_from_req_state ps(s); + + if (std::holds_alternative(s->owner.id)) { + const rgw_owner& object_owner = !object_acl.get_owner().empty() ? + object_acl.get_owner().id : s->bucket_owner.id; + if (!ps.identity->is_owner_of(object_owner)) { + ldpp_dout(dpp, 4) << "cross-account request for object owner " + << object_owner << " != " << s->owner.id << dendl; + // cross-account requests evaluate the identity-based policies separately + // from the resource-based policies and require Allow from both + return verify_object_permission(dpp, &ps, obj, {}, {}, {}, {}, + identity_policies, session_policies, op) + && verify_object_permission(dpp, &ps, obj, + user_acl, bucket_acl, object_acl, + bucket_policy, {}, {}, op); + } else { + // don't consult acls for same-account access. require an Allow from + // either identity- or resource-based policy + return verify_object_permission(dpp, &ps, obj, {}, {}, {}, + bucket_policy, identity_policies, + session_policies, op); + } + } return verify_object_permission(dpp, &ps, obj, user_acl, bucket_acl, object_acl, bucket_policy,