All Tools View Categories About Contact Privacy

IAM Permission Boundary Generator

Build a permission boundary policy — a maximum permission ceiling, not a grant. Start from a common template, then add statements.

A permission boundary caps what an identity can ever do — it never grants permissions by itself. Effective access is the intersection with the identity's own policies. Runs entirely in your browser.
No statements added yet.
0
statements
0
allow
0
deny
-
structurally valid

  

About IAM Permission Boundary Generator

A permission boundary is one of the more misunderstood corners of IAM, largely because it looks exactly like an ordinary policy document — the same Version/Statement shape, the same Effect/Action/Resource fields — while behaving completely differently once attached. IAM Permission Boundary Generator builds that same familiar shape, but frames the whole workflow around the one fact that matters most: a boundary sets a ceiling on what an identity can ever do, and grants nothing on its own.

When a permission boundary is attached to an IAM user or role, AWS evaluates that identity's effective permissions as the intersection of two separate things: whatever its identity-based policies allow (or, for resource access, whatever the relevant resource policy allows), and whatever the boundary allows. An action only succeeds if both sides permit it. This means a boundary that allows s3:* does not by itself grant any S3 access — an identity policy still has to grant it — but it also means that no matter how permissive an identity policy someone attaches later (deliberately or by mistake), the boundary caps what can actually happen. That single property is why boundaries are the standard tool for letting a delegated administrator create and manage their own IAM users and roles without being able to escalate those identities beyond a pre-approved ceiling.

Because that intersection behavior is exactly what makes boundaries useful, this tool leads with a one-click starting point built from the pattern AWS's own documentation recommends most often: an Allow statement scoped to a single service action prefix (say, s3:* or lambda:*) as the outer limit of what the bounded identity should ever be able to touch, paired with an explicit Deny statement blocking iam:* and organizations:* — the two families of actions that would let a bounded identity manage other identities' permissions or leave the account's control plane altogether. Because IAM's evaluation logic always lets an explicit Deny win over any Allow, that second statement holds even if the identity policies eventually paired with this boundary are far more permissive than intended.

From that starting point — or from a blank slate, since the template is optional — the rest of the workflow is identical to the general-purpose IAM Policy JSON Generator: fill in a statement's Sid, Effect, one action per line, one resource per line, and an optional single condition, click Add statement, and it joins a running list with a remove button per row. Add as many statements as the boundary needs, then build the final document, which runs through the same structural validator used across these tools: Version present, Statement non-empty, and every statement carrying a valid Effect, an Action, and a Resource.

What this tool cannot check, because nothing client-side can, is the other half of the intersection: which identity policies this boundary will eventually be paired with, and therefore what the bounded identity's actual effective permissions will turn out to be. That evaluation only happens once both the boundary and the identity policies are attached in a real AWS account (or run through IAM's policy simulator). This tool's job stops at producing a correctly-shaped, structurally valid boundary document — the pairing and the resulting effective permissions are yours to reason through, and the description above is deliberately explicit about that so the boundary is never mistaken for a grant.

Features

  • "Start from boundary template" — one click pre-fills the common Allow-a-prefix-then-Deny-IAM/Organizations pattern.
  • Same Add/Remove statement workflow as the general-purpose policy generator, editable after the template loads.
  • Effect, Action, Resource and one Condition block per statement.
  • Structural validation — Version, non-empty Statement, per-statement Effect/Action/Resource checks.
  • Statement summary stat cards — total, Allow count, Deny count.
  • Explicit "boundary is a ceiling, not a grant" framing throughout the tool's copy.
  • Pretty-printed JSON output with Copy and Download .json.
  • One-click clear resets the form and statement list.
  • 100% client-side — the boundary you build is never uploaded.

How to Use

  1. Optionally click "Start from boundary template" after entering a service prefix (like s3 or lambda) — this pre-loads an Allow-prefix + Deny-IAM/Organizations pair.
  2. Edit, remove, or add statements using the same form as any other statement: Sid, Effect, actions, resources, and an optional condition, then Add statement.
  3. Repeat until the statement list reflects the ceiling you want to set.
  4. Click Build boundary policy to assemble the document and run the structural validator.
  5. Review the stat cards — total statements, Allow vs Deny counts.
  6. Copy or download the resulting JSON, then attach it as the permission boundary on the target IAM user or role.

Examples

Example 1 — S3-scoped delegated admin boundary. Service prefix s3 loaded via the template produces Allow s3:* on * plus Deny iam:*/organizations:* on * — a ceiling suitable for a role that should only ever be able to touch S3, however permissive its identity policies become.

Example 2 — Lambda developer boundary. Service prefix lambda, same template shape — caps a developer-facing role to Lambda-related actions at most, regardless of what individual project policies grant.

Example 3 — narrowing the Allow with a region condition. Editing the generated Allow statement to add condition StringEquals / aws:RequestedRegion / us-east-1 restricts the ceiling further, to one region.

Example 4 — adding a third statement. Appending an additional Deny statement for ec2:TerminateInstances on production instance ARNs on top of the template's two statements — the stat cards update to 3 statements, 1 allow, 2 deny.

Example 5 — building from scratch. Skipping the template entirely and adding a single Allow statement for dynamodb:* on a specific table ARN — a minimal, narrowly scoped boundary with no template statements at all.

Benefits

  • Leads with the ceiling-not-grant framing so the boundary's actual role is never mistaken for direct access.
  • One-click common template for the Allow-prefix-then-Deny-sensitive pattern AWS itself recommends.
  • Same familiar multi-statement workflow as the general-purpose policy builder — nothing new to learn.
  • Structural validation catches missing Effect/Action/Resource before you attach the boundary.
  • Copy or download straight into IAM or IaC.
  • Private — boundaries are assembled entirely client-side.

Frequently Asked Questions

What is a permission boundary, and how is it different from a regular IAM policy?
A permission boundary is an advanced IAM feature attached to a user or role that sets the <strong>maximum</strong> permissions that identity can ever have — it does not grant anything by itself. The identity's actual permissions are the intersection of its identity-based policies (or, for resource-based access, the applicable policies) and its boundary: an action must be allowed by both to actually work. A boundary with <code>s3:*</code> allowed cannot grant S3 access on its own if no identity policy also allows it, and an identity policy that allows <code>iam:*</code> is still blocked if the boundary denies it.
Why does the sample template start with an Allow-everything-in-a-service-prefix statement and then a Deny?
This is one of the two common boundary patterns AWS documents: allow a broad prefix (like <code>s3:*</code> or <code>lambda:*</code>) as the ceiling for what a delegated administrator or automation role is permitted to ever touch, then explicitly deny the small set of especially sensitive actions — typically <code>iam:*</code> and <code>organizations:*</code> — so that even if someone later attaches an overly broad identity policy to the bounded identity, IAM and Organizations management stays out of reach. An explicit Deny always wins over an Allow in IAM's evaluation logic, which is what makes this pattern effective.
Does clicking "Start from boundary template" lock me into that shape?
No — it pre-fills the statement list with the two-statement template (Allow a service prefix, Deny IAM/Organizations), and from there you use the exact same Add/Remove statement form as the general-purpose policy builder to edit, remove, or add further statements before building the final document.
What does "Build boundary policy" actually check?
The same structural validation used across these tools: <code>Version</code> present and recognized, <code>Statement</code> non-empty, and each statement has a valid <code>Effect</code>, an <code>Action</code>/<code>NotAction</code>, and a <code>Resource</code>/<code>NotResource</code>. It does not verify that the actions or resources you listed are real AWS API operations, and it has no way to check what identity policies this boundary will eventually be paired with — that combination is what determines the identity's effective permissions.
Can a permission boundary use Deny statements to allow things?
No — every statement here, boundary or not, follows normal IAM evaluation: Allow statements grant, Deny statements block, and an explicit Deny always overrides any Allow. A boundary is a set of statements evaluated the same way as an identity policy; its special role comes entirely from how AWS combines it with the identity's other policies, not from any different statement syntax.
Is a permission boundary the same as a Service Control Policy (SCP)?
No, though they are conceptually similar (both set ceilings, neither grants by itself). A boundary applies to one IAM user or role and is set by attaching it directly to that identity; an SCP applies at the AWS Organizations level to entire accounts or organizational units and is managed separately in Organizations. This tool only builds the policy document shape — attaching it as a boundary on a specific role or user is a separate IAM console/CLI/IaC step.
What condition support does the statement form offer?
The same single operator/key/value condition block as the general-purpose policy generator — StringEquals, StringLike, IpAddress, or Bool against one condition key, useful for scoping a boundary's Allow statement further (for example, requiring a specific region).
Is my boundary policy sent anywhere?
No — the template, the statement list, and the final JSON assembly and validation all run locally in your browser.
Can I export the result?
Yes — Copy as JSON and Download .json buttons appear once the policy is built.
What happens if I never click "Start from boundary template"?
Nothing pre-fills — you can build a boundary from scratch using the same Add-statement form, which is identical to the general-purpose IAM Policy JSON Generator's mechanics. The template button is a starting point, not a requirement.