S3EXPRESS controls (6)
CTL.S3EXPRESS.ACCESS.EXTERNAL.001
No Unauthorized External Access to Directory Buckets
- Severity: high
- Type: unsafe_state
- Domain: exposure
- Compliance: nist_800_53_r5: AC-3; soc2: CC6.3;
Directory Bucket policies must not grant access to external AWS accounts without organization-scoping conditions. The s3express: IAM namespace is separate from s3:, so s3:-scoped RCPs that enforce data perimeters do not cover Directory Buckets.
Remediation: Remove external account access or add aws:PrincipalOrgID condition. Verify s3express:-scoped SCP/RCP coverage exists independently of s3: policies.
CTL.S3EXPRESS.ENCRYPT.001
Directory Bucket Encryption at Rest Required
- Severity: high
- Type: unsafe_state
- Domain: exposure
- Compliance: nist_800_53_r5: SC-28; pci_dss_v4.0: 3.4.1; soc2: CC6.1;
S3 Express Directory Buckets must have server-side encryption enabled. Directory Buckets support SSE-S3 (default) and SSE-KMS. This control verifies encryption is not disabled or downgraded.
Remediation: Enable default encryption using SSE-S3 or SSE-KMS on the Directory Bucket.
CTL.S3EXPRESS.POLICY.CROSSACCOUNT.001
Directory Bucket Policy Must Restrict Cross-Account Access
- Severity: high
- Type: unsafe_state
- Domain: exposure
- Compliance: nist_800_53_r5: AC-3; soc2: CC6.3;
Directory Bucket policies granting cross-account access must include an aws:PrincipalOrgID condition. The s3express: namespace is separate from s3:, so RCPs scoped to s3:* that enforce PrincipalOrgID do not cover Directory Buckets.
Remediation: Add aws:PrincipalOrgID condition to all Allow statements that grant access to external accounts. Verify SCP coverage for s3express: actions separately from s3: actions.
CTL.S3EXPRESS.POLICY.PUBLIC.001
Directory Bucket Policy Must Not Permit Public Access
- Severity: critical
- Type: unsafe_state
- Domain: exposure
- Compliance: nist_800_53_r5: AC-3; soc2: CC6.1;
S3 Express Directory Bucket policies must not grant access to anonymous or wildcard principals. Directory Buckets use the s3express: IAM namespace, which is separate from s3:. Organization-level S3 Block Public Access and RCPs scoped to s3:* do not cover s3express: actions. A public policy on a Directory Bucket is invisible to s3:-scoped defenses.
Remediation: Remove wildcard Principal statements from the Directory Bucket policy. Add aws:PrincipalOrgID condition to restrict access to your AWS Organization. Verify that any SCP or RCP covering s3express: actions is in place — s3:* SCPs do not apply.
CTL.S3EXPRESS.RESILIENCE.NOVERSIONING.001
Directory Bucket Has No Versioning or Object Lock
- Severity: medium
- Type: unsafe_state
- Domain: resilience
- Compliance: nist_800_53_r5: CP-9; soc2: A1.2;
S3 Express Directory Buckets do not support versioning, Object Lock, or cross-region replication. Data in a Directory Bucket has no S3-native ransomware resilience. This control fires on production Directory Buckets to ensure compensating controls (AWS Backup, cross-account copy, application-layer snapshots) are documented. This is a design limitation of S3 Express One Zone, not a misconfiguration.
Remediation: Implement compensating controls: AWS Backup with cross-account vault, periodic cross-account copy to a versioned S3 bucket, or application-layer snapshot mechanisms. Document the compensating control in the bucket's tags.
CTL.S3EXPRESS.SESSION.SCOPE.001
CreateSession Must Be Resource-Scoped
- Severity: high
- Type: unsafe_state
- Domain: exposure
- Compliance: nist_800_53_r5: AC-6; soc2: CC6.1;
s3express:CreateSession returns temporary data-plane credentials for a specific Directory Bucket. An IAM policy granting CreateSession with Resource: * allows the principal to obtain credentials for ANY Directory Bucket in the account. This is equivalent to granting s3:GetObject + s3:PutObject on all Directory Buckets — a broad data-access grant hidden behind a single action.
Remediation: Scope the s3express:CreateSession Allow statement to specific Directory Bucket ARNs. Use Resource conditions to limit which buckets the role can create sessions for.