By default S3 buckets are private, it means that only the bucket owner can access it.

This access control can be relaxed with ACLs or policies.

To prevent permissive policies to be set on a S3 bucket the following settings can be configured:

Ask Yourself Whether

There is a risk if you answered yes to any of those questions.

Recommended Secure Coding Practices

It’s recommended to configure:

Sensitive Code Example

By default, when not set, the aws_s3_bucket_public_access_block is fully deactivated (nothing is blocked):

resource "aws_s3_bucket" "mynoncompliantfirstbucket" { # sensitive: by default it's unsafe
  bucket = "mynoncompliantfirstbucketname"
}

This aws_s3_bucket_public_access_block allows public ACL to be set:

resource "aws_s3_bucket" "mynoncompliantsecondbucket" {  # sensitive (s6281)
  bucket = "mynoncompliantsecondbucketname"
}

resource "aws_s3_bucket_public_access_block" "mynoncompliantspublicaccess" {
  bucket = aws_s3_bucket.mynoncompliantsecondbucket.id

  block_public_acls       = false # should be true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

Compliant Solution

This aws_s3_bucket_public_access_block blocks public ACLs and policies, ignores existing public ACLs and restricts existing public policies:

resource "aws_s3_bucket" "mycompliantbucket" {
  bucket = "mycompliantbucketname"
}

resource "aws_s3_bucket_public_access_block" "mycompliantpublicaccess" {
  bucket = aws_s3_bucket.mycompliantbucket.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

See