Disabling insecure access: the basics
What counts as an insecure access mode across AWS?
Insecure access is not one setting. It shows up as a property in many shapes: a root access key that bypasses every guardrail, an EKS cluster whose Kubernetes API endpoint is open to the internet, a Lambda function whose resource policy lets any principal invoke it, an S3 bucket still managing access with legacy ACLs, a Transfer Family server speaking plain FTP, a Transit Gateway that auto-accepts attachment requests. Each service expresses the weakness differently, but the theme is identical: an access mode that grants more reach, to more people, than anyone deliberately chose.
AWS Security Hub turns each of these into its own control, which is why one estate can fail several insecure-access checks at once. IAM.4 covers the root access key; EKS.1 covers public cluster endpoints; Lambda.1 covers public function policies; S3.12 covers buckets using ACLs; Transfer.2 covers FTP-enabled servers; EC2.23 covers Transit Gateway auto-accept. They look like separate problems on the report, but they are one capability: close the door that was open by default or left open by habit, and replace it with an explicit, identity-aware alternative.
Most of these are the result of a default rather than a decision. A cluster spun up on the public default, a bucket created before BucketOwnerEnforced was the norm, a wildcard pasted into a function policy to unblock a deploy, a Transfer server set to FTP because the wizard offered it. The job is to find every insecure access mode, decide the small number that are genuinely intended, route those through a controlled, authenticated alternative, and turn off the rest.
In this lesson you will learn how AWS expresses insecure access across identity, compute, storage, file transfer and networking, how to find every insecure mode in an account, and how to close them without breaking the few callers that genuinely depend on a public or legacy path. The Controls this lesson covers section lists every Security Hub control in this capability, each linking to a deep page with the exact check and a copy-and-paste fix.
The key that was never meant to exist
When AWS launched, the root access key was the only way to call the API, because IAM did not exist yet. IAM arrived in 2010 and AWS has spent every year since telling customers to stop using root keys. The advice worked so well that AWS changed account creation itself: new accounts today ship with no root access key and the console actively discourages making one. The same pattern runs through this whole capability. FTP predates TCP/IP, S3 ACLs predate IAM, and EKS clusters once defaulted to public. The protocols and modes still work; the world around them changed, and the controls exist to catch the ones nobody revisited.
Finding insecure access modes across an estate
Priya is the security lead at a scale-up preparing for its first SOC 2 audit. Security Hub shows insecure-access failures spread across IAM, EKS, Lambda and Transfer Family in three accounts that pre-date the team's current guardrails.
Rather than work the findings one by one, she starts with the highest-blast-radius item, the one that bypasses every other control, before touching anything else: is there a root access key on any of these accounts?
Start with the worst case. A root access key bypasses every IAM policy and Service Control Policy, so it is the first insecure mode to confirm and close.
AccountAccessKeysPresent is binary: 1 means a root key exists and bypasses every guardrail. Close this first.
How AWS decides an access mode is insecuredeep dive
Most controls in this group resolve to one of three mechanisms. The first is a credential or principal that is too powerful: a root access key (IAM.4) that no policy can constrain, or a Lambda resource policy with a wildcard principal (Lambda.1) that lets any AWS principal invoke the function. The second is an open network or auto-accept default: an EKS cluster with endpointPublicAccess set to true (EKS.1), or a Transit Gateway that auto-accepts attachment requests (EC2.23) rather than requiring explicit approval. The third is a legacy access model or plaintext protocol: an S3 bucket still using ACLs instead of BucketOwnerEnforced (S3.12), or a Transfer Family server with FTP in its protocol set (Transfer.2).
Security Hub evaluates these through AWS Config. Some checks are change-triggered, so a remediated bucket or function clears within minutes; others, like the root-key check, are periodic, so deleting the key flips the finding on the next scheduled run rather than instantly. The control-plane change itself takes effect immediately, so query the underlying service to confirm state rather than waiting on the report when you are gathering audit evidence.
The strongest version of this capability is preventive. An organisation-wide Service Control Policy that denies root key creation, a landing-zone module that defaults EKS clusters to private and S3 buckets to BucketOwnerEnforced, an IaC guardrail that blocks FTP and wildcard function policies: these make the insecure mode impossible to reach rather than merely quick to clean up. Detective controls find the gap after the fact; preventive controls stop it shipping.
What is the impact of leaving insecure access on?
The direct impact is exposure, scaled by what the mode reaches. A leaked root key is total account compromise with no internal control able to contain it. A public Lambda or EKS endpoint is a usable entry point into the workload behind it, defended only by an authentication layer. A bucket ACL granting AllUsers makes data world-readable through a grant a normal policy review never sees. An FTP server sends credentials and files in clear text to anyone on the path. The probability per event is low, but across all modes over years it is not.
The second-order impact is blast radius and discoverability. Every public endpoint and open default is attack surface that internet-wide scanners find within hours: public EKS endpoints leak through certificate-transparency logs, leaked keys are crawled out of public repos within minutes, open Lambda functions can be hammered into a five-figure bill over a weekend. Closing insecure access shrinks the surface to the handful of authenticated front doors you actually operate.
On the compliance side, every modern framework, SOC 2, ISO 27001, HIPAA, PCI DSS and FedRAMP, expects evidence that access is authenticated, scoped and encrypted by default. A public endpoint, a root key or a plaintext protocol is a clean, demonstrable failure an auditor will write up, and it can stall a certification or a customer security review at exactly the wrong moment in a sales cycle. A passing set of these controls is among the cheapest defensible artefacts you can produce.
How do you disable insecure access safely?
Work the capability as one loop rather than chasing individual findings. The order matters: find the legitimate exceptions before you start closing things, so you do not lock yourself out of a cluster or strand a partner integration.
1. Inventory every insecure access mode
Across services, list the modes that are open or legacy: root access keys, EKS clusters with public endpoints, Lambda functions with wildcard principals, S3 buckets using ACLs, Transfer servers speaking FTP, and Transit Gateways set to auto-accept. Treat this inventory as the source of truth rather than the finding count, and rank it by blast radius. The root key and any public endpoint fronting data are the urgent ones.
2. Separate genuine exceptions from defaults
Most insecure access is unintended. For each mode, decide whether it is needed on purpose. A genuinely public endpoint belongs behind a controlled, authenticated front door, never on the open internet; a partner that must use the public path gets a CIDR-restricted endpoint or an authenticated protocol, not plain FTP. There is no legitimate exception for a root access key; the target is always zero.
3. Close the modes, highest blast radius first
Delete the root key as the root user, set EKS clusters to private after confirming a private path so you do not lock yourself out, remove wildcard principals from function policies and rescope service triggers with a fixed-value source condition, switch buckets to BucketOwnerEnforced after replicating any ACL-based grant as a policy, and migrate Transfer servers to SFTP, FTPS or AS2 after confirming the partner's client supports it. Each is a single API call per resource, but the verification before the call is what keeps a live workload online.
4. Prevent it shipping again
Closing existing modes is one-off; stopping new ones is the durable fix. Deny root key creation with an organisation-wide Service Control Policy, default EKS clusters to private and S3 buckets to BucketOwnerEnforced in your IaC modules, block FTP and wildcard function policies in the deployment pipeline, and keep the relevant AWS Config rules enabled for detection. The goal is that an insecure access mode can only exist deliberately, never by default.
# Close the highest-blast-radius mode first: confirm and remove the root access key.
# (Deletion is done as the root user via the console; an IAM identity cannot do it.)
aws iam get-account-summary --query 'SummaryMap.AccountAccessKeysPresent'
# Expect 0 after deletion.
# Close a public EKS endpoint (only after confirming a private path exists).
aws eks update-cluster-config --name svc-orders \
--resources-vpc-config endpointPublicAccess=false,endpointPrivateAccess=true
# Disable legacy ACLs on a bucket and let policy govern access.
aws s3api put-bucket-ownership-controls --bucket my-legacy-assets \
--ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'
# Migrate a Transfer Family server off plain FTP to SFTP only.
aws transfer update-server --server-id s-0a1b2c3d4e5f --protocols SFTP Quick quiz
Question 1 of 5Security Hub shows insecure-access failures across IAM, EKS, Lambda and Transfer Family. What is the most efficient way to think about them?
You scored
0 / 5
Keep learning
Go deeper on how AWS expresses insecure access across the services in this capability.
- Root user best practices for your AWS account Why the root user should have no access key and how to lock it down with MFA and break-glass access.
- Amazon EKS cluster endpoint access control The public, private and CIDR-restricted endpoint access modes and how to change them on an existing cluster.
- Controlling ownership of objects and disabling ACLs for your bucket How BucketOwnerEnforced disables legacy S3 ACLs so access is governed by policy alone.
You can now treat insecure access as one capability rather than a scatter of findings: inventory the open and legacy modes across IAM, EKS, Lambda, S3, Transfer Family and Transit Gateway, separate the genuine exceptions and route them through an authenticated front door, close the rest by blast radius, and prevent insecure defaults from shipping again with guardrails. The Controls this lesson covers section below links every control in this group to its deep page and fix.
Back to the library