Skip to content

Commit 0b05b34

Browse files
committed
rgw/s3: authorization ignores object acls for BucketOwnerEnforced
Signed-off-by: Casey Bodley <[email protected]>
1 parent ca1c259 commit 0b05b34

File tree

6 files changed

+42
-7
lines changed

6 files changed

+42
-7
lines changed

src/rgw/driver/rados/rgw_data_sync.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2693,6 +2693,7 @@ int RGWUserPermHandler::Bucket::init(RGWUserPermHandler *handler,
26932693
info->env,
26942694
info->identity.get(),
26952695
bucket_info,
2696+
rgw::s3::ObjectOwnership::ObjectWriter,
26962697
info->identity->get_perm_mask(),
26972698
false, /* defer to bucket acls */
26982699
nullptr, /* referer */

src/rgw/rgw_common.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,7 @@ struct perm_state_from_req_state : public perm_state_base {
11171117
_s->env,
11181118
_s->auth.identity.get(),
11191119
_s->bucket.get() ? _s->bucket->get_info() : RGWBucketInfo(),
1120+
_s->bucket_object_ownership,
11201121
_s->perm_mask,
11211122
_s->defer_to_bucket_acls,
11221123
_s->bucket_access_conf),
@@ -1624,11 +1625,12 @@ bool verify_object_permission_no_policy(const DoutPrefixProvider* dpp,
16241625
return true;
16251626
}
16261627

1627-
bool ret = object_acl.verify_permission(dpp, *ps->identity, ps->perm_mask, perm,
1628-
nullptr, /* http referrer */
1629-
ps->bucket_access_conf &&
1630-
ps->bucket_access_conf->ignore_public_acls());
1631-
if (ret) {
1628+
// object ACLs don't apply for BucketOwnerEnforced
1629+
if (ps->bucket_object_ownership != rgw::s3::ObjectOwnership::BucketOwnerEnforced &&
1630+
object_acl.verify_permission(dpp, *ps->identity, ps->perm_mask, perm,
1631+
nullptr, /* http referrer */
1632+
ps->bucket_access_conf &&
1633+
ps->bucket_access_conf->ignore_public_acls())) {
16321634
ldpp_dout(dpp, 10) << __func__ << ": granted by object acl" << dendl;
16331635
if (granted_by_acl) {
16341636
*granted_by_acl = true;
@@ -1637,7 +1639,7 @@ bool verify_object_permission_no_policy(const DoutPrefixProvider* dpp,
16371639
}
16381640

16391641
if (!ps->cct->_conf->rgw_enforce_swift_acls)
1640-
return ret;
1642+
return false;
16411643

16421644
if ((perm & (int)ps->perm_mask) != perm)
16431645
return false;

src/rgw/rgw_common.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "common/async/yield_context.h"
4444
#include "rgw_website.h"
4545
#include "rgw_object_lock.h"
46+
#include "rgw_object_ownership.h"
4647
#include "rgw_tag.h"
4748
#include "rgw_op_type.h"
4849
#include "rgw_sync_policy.h"
@@ -1383,6 +1384,7 @@ struct req_state : DoutPrefixProvider {
13831384
rgw::IAM::Environment env;
13841385
boost::optional<rgw::IAM::Policy> iam_policy;
13851386
boost::optional<PublicAccessBlockConfiguration> bucket_access_conf;
1387+
rgw::s3::ObjectOwnership bucket_object_ownership = rgw::s3::ObjectOwnership::ObjectWriter;
13861388
std::vector<rgw::IAM::Policy> iam_identity_policies;
13871389

13881390
/* Is the request made by an user marked as a system one?
@@ -1695,6 +1697,7 @@ struct perm_state_base {
16951697
const rgw::IAM::Environment& env;
16961698
rgw::auth::Identity *identity;
16971699
const RGWBucketInfo bucket_info;
1700+
rgw::s3::ObjectOwnership bucket_object_ownership;
16981701
int perm_mask;
16991702
bool defer_to_bucket_acls;
17001703
boost::optional<PublicAccessBlockConfiguration> bucket_access_conf;
@@ -1703,13 +1706,15 @@ struct perm_state_base {
17031706
const rgw::IAM::Environment& _env,
17041707
rgw::auth::Identity *_identity,
17051708
const RGWBucketInfo& _bucket_info,
1709+
rgw::s3::ObjectOwnership bucket_object_ownership,
17061710
int _perm_mask,
17071711
bool _defer_to_bucket_acls,
17081712
boost::optional<PublicAccessBlockConfiguration> _bucket_access_conf = boost::none) :
17091713
cct(_cct),
17101714
env(_env),
17111715
identity(_identity),
17121716
bucket_info(_bucket_info),
1717+
bucket_object_ownership(bucket_object_ownership),
17131718
perm_mask(_perm_mask),
17141719
defer_to_bucket_acls(_defer_to_bucket_acls),
17151720
bucket_access_conf(_bucket_access_conf)
@@ -1732,13 +1737,15 @@ struct perm_state : public perm_state_base {
17321737
const rgw::IAM::Environment& _env,
17331738
rgw::auth::Identity *_identity,
17341739
const RGWBucketInfo& _bucket_info,
1740+
rgw::s3::ObjectOwnership bucket_object_ownership,
17351741
int _perm_mask,
17361742
bool _defer_to_bucket_acls,
17371743
const char *_referer,
17381744
bool _request_payer) : perm_state_base(_cct,
17391745
_env,
17401746
_identity,
17411747
_bucket_info,
1748+
bucket_object_ownership,
17421749
_perm_mask,
17431750
_defer_to_bucket_acls),
17441751
referer(_referer),

src/rgw/rgw_object_ownership.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
#include "rgw_object_ownership.h"
17+
#include "rgw_common.h"
1718
#include "rgw_xml.h"
1819

1920
namespace rgw::s3 {
@@ -87,4 +88,22 @@ void decode(OwnershipControls& c, bufferlist::const_iterator& bl)
8788
DECODE_FINISH(bl);
8889
}
8990

91+
ObjectOwnership get_object_ownership(const sal::Attrs& attrs)
92+
{
93+
auto i = attrs.find(RGW_ATTR_OWNERSHIP_CONTROLS);
94+
if (i == attrs.end()) {
95+
// default to ObjectWriter for backward compat
96+
return ObjectOwnership::ObjectWriter;
97+
}
98+
99+
try {
100+
OwnershipControls ownership;
101+
auto p = i->second.cbegin();
102+
decode(ownership, p);
103+
return ownership.object_ownership;
104+
} catch (const buffer::error&) {
105+
return ObjectOwnership::ObjectWriter;
106+
}
107+
}
108+
90109
} // namespace rgw::s3

src/rgw/rgw_object_ownership.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <optional>
2020
#include <string>
2121
#include "include/encoding.h"
22+
#include "rgw_sal_fwd.h"
2223

2324
class XMLObj;
2425
namespace ceph { class Formatter; }
@@ -51,4 +52,8 @@ struct OwnershipControls {
5152
void encode(const OwnershipControls&, bufferlist&, uint64_t f=0);
5253
void decode(OwnershipControls&, bufferlist::const_iterator&);
5354

55+
/// Return the ObjectOwnership from RGW_ATTR_OWNERSHIP_CONTROLS,
56+
/// or default to ObjectWriter.
57+
ObjectOwnership get_object_ownership(const sal::Attrs& attrs);
58+
5459
} // namespace rgw::s3

src/rgw/rgw_op.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,8 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Driver* d
615615
return -EINVAL;
616616
}
617617

618-
s->bucket_access_conf = get_public_access_conf_from_attr(s->bucket->get_attrs());
618+
s->bucket_access_conf = get_public_access_conf_from_attr(s->bucket_attrs);
619+
s->bucket_object_ownership = rgw::s3::get_object_ownership(s->bucket_attrs);
619620
}
620621

621622
/* handle user ACL only for those APIs which support it */

0 commit comments

Comments
 (0)