Skip to main content
emnode
Compliance Medium severity

AWS Security Hub · ELB

ELB.17: TLS policy allows weak ciphers or TLS 1.0 to 1.1

Written and reviewed by Emnode · Last reviewed

What does AWS Security Hub ELB.17 check?

ELB.17 fails when an Application or Network Load Balancer listener uses a TLS security policy that is not on AWS's recommended list, typically a legacy policy such as ELBSecurityPolicy-2016-08 that still negotiates TLS 1.0 or 1.1 and weak ciphers.

Why does ELB.17 matter?

TLS 1.0 and 1.1 were deprecated by the IETF and dropped by every major browser years ago. A listener still offering them protects no real users, only vulnerability scanners, ancient devices and attackers probing for downgrade or cipher attacks. Moving to a recommended TLS 1.3 policy closes the downgrade surface and, as a bonus, cuts handshake latency.

How do I fix ELB.17?

  1. Inventory listener policies with describe-listeners and flag any not on the recommended list.
  2. Pick the right recommended variant (standard TLS 1.3, restricted (Res), FIPS or post-quantum (PQ)) for each listener's compliance needs.
  3. Apply it online with modify-listener; the change takes effect on new handshakes with no downtime.
  4. Send HSTS from the listener and add a Config rule to prevent regression.

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 policy on ELB.17's recommended list (closes ELB.17).
#    ELBSecurityPolicy-TLS13-1-2-2021-06 is NOT on that list and still fails the control; use a -Res- or TLS13-1-3 variant.
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-Res-2021-06

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

Is ELB.17 a false positive?

A listener can fail ELB.17 while serving exactly the TLS profile you intend. The control only passes the fixed AWS-recommended list (the TLS13 and -Res restricted/FIPS/PQ policies); a custom or older-but-still-strong policy you picked for a specific cipher requirement (or a FIPS or post-quantum policy that hasn't yet been added to the recommended set) will be flagged even though it is the deliberate, correct choice. This is a known gap: AWS's own CDK SslPolicy.RECOMMENDED_TLS has at times included a value Security Hub then flags as noncompliant. If your policy is a conscious, documented decision, suppress the finding (set the workflow status to SUPPRESSED with a note recording the policy name and the reason) rather than downgrading to a recommended policy that drops the cipher you need.

Part of the learning path Encrypt everything
  • ELB.1 ALB serves HTTP without redirecting to HTTPS
  • ELB.2 CLB SSL/HTTPS listeners should use ACM certs
  • ELB.3 CLB listeners should use HTTPS/TLS termination
  • ELB.4 ALB accepts malformed HTTP headers
  • ELB.5 Load balancers are not writing access logs
  • ELB.6 Load balancers can be deleted by accident
  • ELB.7 CLBs should have connection draining
  • ELB.8 CLB SSL listeners should use strong policy
  • ELB.9 CLBs should have cross-zone balancing
  • ELB.10 CLBs should span multiple AZs
  • ELB.12 ALB desync mitigation mode
  • ELB.13 A single-AZ load balancer is a data-plane single point of failure