S3 access point has all Block Public Access settings enabled
Amazon S3 access points have Block Public Access configured with all settings enabled: block_public_acls, ignore_public_acls, block_public_policy, and restrict_public_buckets.
The evaluation inspects each access point's public access block configuration.
Risk
Without block public access on an access point, ACLs or policies can expose objects publicly despite intended restrictions. This enables unauthorized reads (confidentiality loss), writes or deletions (integrity/availability impact), and supports bulk data exfiltration or destructive actions.
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks s3_access_point_public_access_blockRecommendation
Enable all access-point Block Public Access settings (block_public_acls, ignore_public_acls, block_public_policy, restrict_public_buckets).
Apply least privilege, prefer VPC-only access points, and layer account and bucket blocks for defense in depth. Regularly audit for public principals like Principal: *.
Remediation
Terraform
# Terraform: S3 Access Point with all Block Public Access settings enabled
resource "aws_s3_access_point" "<example_resource_name>" {
name = "<example_resource_name>"
bucket = "<example_bucket_name>"
public_access_block_configuration {
block_public_acls = true # Critical: block public ACLs
ignore_public_acls = true # Critical: ignore any public ACLs
block_public_policy = true # Critical: block public policies
restrict_public_buckets = true # Critical: restrict public buckets
}
}NativeIaC
# CloudFormation: S3 Access Point with all Block Public Access settings enabled
Resources:
<example_resource_name>:
Type: AWS::S3::AccessPoint
Properties:
Bucket: <example_bucket_name>
PublicAccessBlockConfiguration:
BlockPublicAcls: true # Critical: block public ACLs
IgnorePublicAcls: true # Critical: ignore any public ACLs
BlockPublicPolicy: true # Critical: block public policies
RestrictPublicBuckets: true # Critical: restrict public bucketsOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.s3.s3control_client import s3control_client
class s3_access_point_public_access_block(Check):
def execute(self):
findings = []
for access_point in s3control_client.access_points.values():
report = Check_Report_AWS(metadata=self.metadata(), resource=access_point)
report.status = "PASS"
report.status_extended = f"Access Point {access_point.name} of bucket {access_point.bucket} does have Public Access Block enabled."
if not (
access_point.public_access_block.block_public_acls
and access_point.public_access_block.ignore_public_acls
and access_point.public_access_block.block_public_policy
and access_point.public_access_block.restrict_public_buckets
):
report.status = "FAIL"
report.status_extended = f"Access Point {access_point.name} of bucket {access_point.bucket} does not have Public Access Block enabled."
findings.append(report)
return findings