Cloud Misconfiguration Is Still the Quiet Risk
Public storage and overly broad roles are among the most common causes of cloud incidents, and AI tools make both easier to create at speed.

On this page
A cloud incident rarely looks like a break-in. More often it looks like a setting changed to make something work, a storage location made readable so a team could share a file, or a role widened until a deployment stopped failing. Nobody had to defeat a control, because the control was never applied or was turned off. That is why misconfiguration stays a quiet risk. It raises no alarm when it is created, and it can persist for a long time.
What misconfiguration looks like
Most cloud misconfigurations fall into a few families. Storage that should be private is reachable from the public internet. Network rules allow administrative ports from anywhere rather than from a bastion host or a corporate range. Identities carry wildcard permissions, so a role meant for reading one prefix can read everything in an account. Encryption is absent, or uses keys nobody rotates. Logging of the control plane, the layer where resources are created and permissions are changed, is off or not retained.
Many of these problems show up in a single inventory of storage locations, identities and network rules, which is why an inventory is usually the first thing to build. A list of that kind gives a review a starting point that does not depend on anyone's memory.
The role case deserves a closer look. Cloud permission systems evaluate policy statements together. A single broad allow is effective unless another statement explicitly denies the same action, so a narrow-looking policy can grant far more than its author meant. When reviewing, examine the effective permission rather than the intent written in a comment. Ask what the identity can do, on which resources, under which conditions, and whether that matches the job.
Why AI tools speed up the problem
Generated infrastructure code shows how speed can meet an old habit. When a deployment fails with an access error, the quickest repair is usually to widen the permission until the error goes away. Generated code often reflects common patterns in public examples, and permissive examples are common. A generated template may open a port for debugging and leave it open, or make a bucket public to test an upload and never restrict it again.
The risk is not that the tool is malicious. It is that review gets thinner as output gets faster, and the reviewer faces a file that looks plausible and works. Treat generated infrastructure the way you would treat a change from a new contributor. Read the diff, check the defaults and ask why each permission exists.
Check definitions before they ship
Infrastructure as code records the intended state before anything exists, which makes it valuable for review. Review it at the same point you review application code. A practical routine has three parts. Read the planned change, not only the file, so you see what will be created, modified or destroyed. Run automated policy checks in the pipeline so that known shapes are caught every time. Then ask the questions a rule cannot answer, such as whether this bucket is meant to be public at all.
Automated checks are strong on known patterns and weak on context. A rule can flag every public storage location, but it cannot tell you that one of them serves the marketing images. Use the rules to surface candidates and a person to decide. The checks most worth automating include:
- Public access settings on storage and databases
- Wildcard actions or resources in identity policies
- Administrative ports open to the whole internet
- Encryption or logging left at defaults that fall short of policy
- Credentials written into templates instead of referenced from a secret store
- Resources without an owner or a documented purpose
Exceptions deserve their own record. A public bucket can be correct for a published website, but the exception should name the content, the owner and a review date. Without that record, the next reviewer cannot tell an intended exposure from an accident.
Watch for drift after deployment
A template describes what should exist. The live environment shows what does exist, and the two diverge over time. Someone opens a port during an incident and forgets to close it. A console change fixes a problem faster than a pull request can. The gap widens quietly. Drift detection compares declared state with live state on a schedule and reports the differences. Pair it with alerts on changes to access policies, public exposure and logging settings, since those changes matter most.
Also confirm that control-plane logs exist and are kept long enough to answer a question. Teams often discover during an incident that the setting which would have recorded who changed a policy was never enabled. That check takes minutes and belongs on the same list as the others.
Practice on a template you own
Take a template your team uses, or a sample you write for a lab account, and list every resource reachable from outside the network. For each, record who should reach it and why. Then list every identity with a wildcard in its permissions and write the narrower permission the job actually needs. Compare your list with the team's documentation. Where the two disagree, you have found either a risk or a missing explanation, and both are worth raising. A useful variation is to compare two environments, such as a production account and a staging account, and ask why any difference between them exists.
Finish by writing one change you would propose, with its effect on the system and the test that would show the change is safe. A review that ends with a specific, testable change is the kind most likely to be applied.

