Skip to content

HDDS-14935. [STS] Handle Latent Inconsistencies in S3 API Acl Checks#10009

Open
fmorg-git wants to merge 1 commit into
apache:HDDS-13323-stsfrom
fmorg-git:HDDS-14935
Open

HDDS-14935. [STS] Handle Latent Inconsistencies in S3 API Acl Checks#10009
fmorg-git wants to merge 1 commit into
apache:HDDS-13323-stsfrom
fmorg-git:HDDS-14935

Conversation

@fmorg-git
Copy link
Copy Markdown
Contributor

@fmorg-git fmorg-git commented Mar 31, 2026

Please describe your PR in detail:

  • Currently, S3 APIs are not consistent in how ACL checks are applied. For example, PutObject (i.e. OMKeyCreateRequest, OMAllocateBlockRequest, OMKeyCommitRequest), DeleteObject (i.e. OMKeyDeleteRequest), PutObjectTagging (i.e. S3PutObjectTaggingRequest), etc. perform their ACL checks in preExecute() which is on the OM leader RPC thread.

However, APIs like DeleteBucket (i.e. OMBucketDeleteRequest), PutBucketAcl (i.e. OMBucketSetAclRequest), etc. perform their ACL checks in validateAndUpdateCache() which is on the Ratis apply thread. This affects STS in that the STSTokenIdentifier ThreadLocal currently is not available on the Ratis apply thread, so if the STS token has an inline session policy, some ACL checks that should pass would fail. This ticket addresses the inconsistency by ensuring the ThreadLocal is always available on the Ratis apply thread via updates to OzoneManagerStateMachine.

A separate PR is already open to move the checks to the correct place (#9653 and https://issues.apache.org/jira/browse/HDDS-13855), but this ticket is a fallback in case any future API has the check in the incorrect place, so it won't break STS.

What is the link to the Apache JIRA

https://issues.apache.org/jira/browse/HDDS-14935

How was this patch tested?

unit tests, smoke tests

@fmorg-git fmorg-git marked this pull request as draft March 31, 2026 01:07
@kerneltime kerneltime requested a review from sumitagrawl March 31, 2026 05:00
@github-actions
Copy link
Copy Markdown

This PR has been marked as stale due to 21 days of inactivity. Please comment or remove the stale label to keep it open. Otherwise, it will be automatically closed in 7 days.

@github-actions github-actions Bot added the stale label Apr 22, 2026
@fmorg-git
Copy link
Copy Markdown
Contributor Author

adding comment to remove stale label

@fmorg-git
Copy link
Copy Markdown
Contributor Author

hi @ChenSammi @sodonnel - just a quick reminder that this PR is ready to review. Thanks!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Comment on lines +121 to +129
final OMRequest.Builder requestBuilder = getOmRequest().toBuilder()
.setUserInfo(getUserIfNotExists(ozoneManager))
.setLayoutVersion(layoutVersion).build();
.setLayoutVersion(layoutVersion);

if (requestBuilder.hasS3Authentication()) {
requestBuilder.setS3Authentication(
resolveS3Authentication(requestBuilder.getS3Authentication(), OzoneManager.getStsTokenIdentifier()));
}

Comment on lines +669 to +688
if (ozoneManager.isSecurityEnabled() && request.hasS3Authentication()) {
// STS token verification runs on the leader RPC path so we don't need to recheck here on the apply
// after the log is committed
STSSecurityUtil.ensureResolvedStsFieldsInvariants(request);

final OzoneManagerProtocolProtos.S3Authentication s3Auth = request.getS3Authentication();
if (s3Auth.hasSessionToken() && !s3Auth.getSessionToken().isEmpty()) {
// ThreadLocal carries session policy for OmMetadataReader
final STSTokenIdentifier rehydratedTokenIdentifier = new STSTokenIdentifier(
s3Auth.hasResolvedStsTempAccessKeyId() ? s3Auth.getResolvedStsTempAccessKeyId() : "",
s3Auth.hasResolvedStsOriginalAccessKeyId() ? s3Auth.getResolvedStsOriginalAccessKeyId() : "",
s3Auth.hasResolvedStsRoleArn() ? s3Auth.getResolvedStsRoleArn() : "",
java.time.Instant.MAX, // ensure it deterministically is not expired
"", // no secretAccessKey needed
s3Auth.hasResolvedStsSessionPolicy() ? s3Auth.getResolvedStsSessionPolicy() : "",
null // no encryption key needed
);
OzoneManager.setStsTokenIdentifier(rehydratedTokenIdentifier);
isStsThreadLocalSet = true;
}

return getOmRequest().toBuilder()
// super.preExecute resolves S3Authentication (STS) for Ratis apply. Merge SetAclRequest changes on top.
final OMRequest request = super.preExecute(ozoneManager);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mentioned OMBucketDeleteRequest in the JIRA description. Shall we call the super.preExecute in OMBucketDeleteRequest too?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are two other requests, OMBucketAddAclRequest, OMBucketRemoveAclRequest. So we should consider move this to OMBucketAclRequest.

OzoneManagerProtocolProtos.S3Authentication s3Auth, STSTokenIdentifier stsTokenIdentifier) {
final OzoneManagerProtocolProtos.S3Authentication.Builder s3AuthBuilder = s3Auth.toBuilder();

if (s3Auth.hasSessionToken() && !s3Auth.getSessionToken().isEmpty() && stsTokenIdentifier != null) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is "s3Auth.hasSessionToken() && !s3Auth.getSessionToken().isEmpty()" and null stsTokenIdentifier allowed?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants