You enforce HTTPS-only access by adding a bucket policy that denies requests when the transport is not secure. The policy should block both bucket and object actions over plain HTTP, so clients must use TLS. Test legitimate applications first, then watch for denied requests from older tools, proxies or scripts that still use non-HTTPS endpoints.
What the bucket policy is actually enforcing
A bucket policy does not “turn on HTTPS” for S3 by itself. It enforces a transport rule: if a request arrives over plain HTTP, the policy denies the action. Because the deny applies to bucket-level and object-level operations, clients cannot browse, upload, read, or delete data unless they use TLS.
For this to work cleanly, the policy must be written as a deny statement rather than a permissive allow. That matters because S3 evaluates explicit denies first, so the control remains effective even when another policy, role, or application path would otherwise allow access. This is the right pattern when the goal is to make insecure transport non-negotiable.
In practice, the policy becomes a guardrail for every consumer of the bucket: applications, scripts, SDKs, batch jobs, integration tools, and ad hoc operators. A well-formed deny policy is simple, but the operational effect is broad because it changes the acceptable connection method for every caller, not just for a single application.
How to structure the deny so it covers the full bucket
The useful design choice is scope. You want one rule that covers both the bucket ARN and the object ARN, so the control blocks insecure access to the container and to the data inside it. If you only cover one of those surfaces, callers can still reach the other through a different API action.
The condition should inspect whether the transport is secure and deny when it is false. In AWS terms, that means using the request context value that indicates whether the connection was made over HTTPS. The exact JSON shape is less important than the logic: deny any S3 action when the transport is not secure, then test both list and object operations to confirm the rule behaves as intended.
For teams standardising cloud security controls, this is part of broader AWS Security Guide practice, because S3 transport restrictions work best when they sit alongside baseline account, logging, and storage controls rather than as a one-off fix.
It is also worth testing the policy against the access paths you actually use. Old SDKs, hard-coded endpoints, proxy layers, and long-lived scripts can fail in surprising ways if they were built around legacy HTTP assumptions. A bucket policy is only successful if legitimate workloads keep functioning while insecure paths are denied.
What usually breaks after the policy is enabled
The most common failure is not in the policy logic itself, but in the caller. Older tools may still target HTTP endpoints, and some intermediate systems quietly downgrade, rewrite, or cache requests in ways that expose plain-text transport. When that happens, the deny will surface as access failures that look like application bugs until you trace the actual endpoint being used.
Misconfigured clients are the other recurring issue. A script may use the right bucket name but an outdated endpoint, or a proxy may terminate TLS upstream and then talk HTTP to S3 from its own side. That still matters, because the bucket policy evaluates the request seen by S3, not the client’s internal intent.
For a deeper look at how storage controls fail when transport and policy are not aligned, Cloud Misconfiguration Guide is useful because it treats public exposure, drift, and weak guardrails as part of the same operational problem.
If you are defending against insecure access patterns more generally, the Conditional Access Guide is a good analogue: in both cases, the control succeeds only when policy enforcement and client behaviour are tested together before rollout.
Risk and Threat Considerations
HTTPS-only enforcement reduces the chance that requests, credentials, or signed operations are exposed in transit, especially when applications still rely on older tooling or network paths that do not enforce TLS by default. The practical risk is not just interception, but silent drift back to weaker transport where legacy integrations remain in use.
Failure mechanism: A client, proxy, or integration uses an HTTP S3 endpoint, the bucket policy denies the request, and the organisation either experiences an outage or temporarily relaxes the control to restore service. That rollback path is the main control failure to watch for, because it can reopen insecure transport faster than teams expect.
Impact: If the deny is bypassed or removed, bucket access can occur over plain HTTP, which increases exposure of requests and weakens assurance that S3 traffic is protected in transit. At scale, the business impact is usually operational first, then security-related if teams start creating exceptions to keep fragile integrations alive.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
CSA Cloud Controls Matrix, NIST SP 800-53 Rev 5 and CIS Controls v8 set the technical controls, while ISO/IEC 27001:2022 defines the regulatory obligations.
| Framework | Control / Reference | Relevance |
|---|---|---|
| CSA Cloud Controls Matrix | IAM — Identity and Access Management | S3 transport enforcement is part of cloud IAM and access governance. |
| Recommendation — Apply IAM controls to deny insecure S3 access paths and enforce least-privilege bucket access. | ||
| NIST SP 800-53 Rev 5 | AC-4 — Information Flow Enforcement | The bucket policy enforces a transport rule that blocks unauthorized data flows over HTTP. |
| SC-8 — Transmission Confidentiality and Integrity | HTTPS-only access directly protects S3 data in transit from exposure and tampering. | |
| Recommendation — Use AC-4 to deny non-TLS S3 requests and enforce secure information flow paths. Apply SC-8 to require protected transmission for all S3 bucket and object requests. | ||
| ISO/IEC 27001:2022 | A.8.24 — Use of cryptography | HTTPS-only access relies on TLS to protect data in transit to S3. |
| Recommendation — Require TLS for S3 access to preserve confidentiality and integrity in transit. | ||
| CIS Controls v8 | CIS-3 — Data Protection | Blocking HTTP for S3 is a data protection measure for cloud storage traffic. |
| Recommendation — Enforce encrypted transport for S3 data flows and verify no plaintext endpoint remains. | ||
Practitioner Guidance
What to verify: Before enforcing the deny broadly, confirm that every production caller uses HTTPS end to end, including SDK defaults, batch jobs, CI tooling, and any proxy or gateway that fronts the bucket. Do not trust a single successful test from one application path as proof that the bucket is ready.
Decision rule: If a workload fails after the policy is applied, treat it as a client remediation issue first, not a reason to weaken the bucket policy. The exception should be temporary and narrowly scoped only when a business-critical dependency cannot be fixed immediately.
What practitioners underestimate: The control is easy to write but harder to operationalise because it exposes hidden dependency on legacy endpoints. The real work is inventorying every legitimate access path and proving they all negotiate TLS before you rely on the deny as a standing guardrail.
Practitioner takeaway: Enforce HTTPS-only access with a deny policy, then validate every consuming path before rollout, because the control is only durable when insecure clients are fixed rather than accommodated.
Related resources from NHI Mgmt Group
Deepen Your Knowledge
Free weekly newsletter
Subscribe to the NHI & AI Identity Journal
The latest on NHI and Agentic AI security – articles, research, breaches, news and events every week.
Bonus 33% off our NHI Course when you subscribe.
Reviewed and updated by the NHIMG editorial team on October 20, 2026.
NHI Mgmt Group — the #1 independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org