The bucket sat there, quiet but exposed. An AWS S3 resource, open wide to a world it shouldn’t fully trust. Misconfigured access can cripple a system before anyone notices. The fix is precise: enforce read-only roles and control ingress resources like a surgeon controls a blade.
AWS S3 supports fine-grained IAM policies, but too many teams lump permissions into roles without thinking about ingress boundaries. An ingress resource is any entry point granting access, whether through an API gateway, a load balancer, or direct user credentials. If those ingress paths point to S3 with anything more than read privileges, you’ve already widened the attack surface.
To create an AWS S3 read-only role, define a policy granting only s3:GetObject and s3:ListBucket. Attach that policy to a role. Bind the role tightly: no wildcard resources, no open conditions. Map it to your ingress resource so traffic hitting your system from outside can only pull data it is allowed to see. Block PutObject, DeleteObject, or any write action. Audit the role regularly, because permissions drift faster than expected.