Skip to main content
emnode / learn
Compliance Medium severity

AWS Security Hub · S3

S3.5: S3 is accepting unencrypted HTTP requests

Written and reviewed by Emnode · Last reviewed

What does AWS Security Hub S3.5 check?

S3.5 evaluates whether a bucket policy denies requests that do not use SSL/TLS. It reports FAILED when no policy statement enforces the aws:SecureTransport condition, meaning the bucket will still answer plaintext HTTP requests.

Why does S3.5 matter?

Without the deny, an old client or a misconfigured SDK can send credentials and object data over unencrypted HTTP, where it is open to interception or tampering on the wire. The control is one of the most common failing findings precisely because the failure is silent — nothing breaks, the bucket just quietly accepts insecure traffic until an audit notices.

How do I fix S3.5?

  1. Add a bucket-policy Deny statement on s3:* for Principal "*" with a condition of aws:SecureTransport=false.
  2. Merge it into any existing policy rather than overwriting, so current Allow statements survive.
  3. Re-run the control or check Security Hub to confirm it flips to PASSED, then enforce it estate-wide with AWS Config or an SCP.

Remediation script · bash

# 1. The canonical statement Security Hub S3.5 looks for (merge into the existing policy).
cat <<'EOF'
{
  "Sid": "DenyInsecureTransport",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::acme-prod-logs",
    "arn:aws:s3:::acme-prod-logs/*"
  ],
  "Condition": { "Bool": { "aws:SecureTransport": "false" } }
}
EOF
aws s3api put-bucket-policy --bucket acme-prod-logs --policy file://acme-prod-logs-policy.json

# 2. Swap a load balancer listener onto a recommended TLS policy (closes ELB.17).
aws elbv2 modify-listener \
  --listener-arn arn:aws:elasticloadbalancing:eu-west-1:123456789012:listener/app/web-prod/abc/def \
  --ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06

Full walkthrough (console steps, edge cases and verification) in the lesson Require TLS for storage and remaining services.

Is S3.5 a false positive?

Teams assume bucket-default encryption at rest satisfies this — it does not. S3.5 is about transport, so only an aws:SecureTransport deny clears it.

Part of the learning path Encrypt everything
  • S3.1 Account-level S3 public access is not fully blocked
  • S3.2 Public S3 buckets expose data to anyone on the internet
  • S3.3 Buckets can be written to by anyone on the internet
  • S3.6 Bucket policy grants broad access to other AWS accounts
  • S3.8 Buckets can still be made public; Block Public Access is off
  • S3.9 No S3 access logs, so reads and writes go unaudited
  • S3.10 Versioned buckets should have lifecycle configurations
  • S3.11 Buckets should have event notifications enabled
  • S3.12 ACLs should not be used to manage bucket access
  • S3.13 Buckets have no lifecycle rules and grow forever
  • S3.15 Buckets should have Object Lock enabled
  • S3.17 Buckets should be encrypted at rest with KMS keys