Skip to main content

ADR: Permission Boundaries for Cloud Resource Isolation

  • Status: Draft
  • Date: 2026-01-19
  • Updated: 2026-03-09
  • Decision Makers: Entigo RnD Team

Context

Entigo Platform manages cloud resources within customer cloud accounts. Users grant the platform access to their cloud resources via IAM roles. Most cloud providers use role-based access control (RBAC) by default, which means a role like "Database Administrator" grants access to all databases in the account — including those not managed through Entigo Platform. This violates the principle of least privilege and may not be acceptable to security-conscious organizations.

The platform needs a mechanism to limit its own access to only the resources it manages, scoped by workspace and zone.

Design Requirements

  1. Workspace isolation: A workspace in an AWS account can not access resorces in the same account that are not part of the same workspace
  2. Zone scoping: Within a workspace, zone-scoped roles should only access resources in their assigned zone
  3. Delegated administration: The platform should be able to create new roles and policies while ensuring they remain within the workspace boundary

Tag Dependency

Permission boundaries depend on the cloud resource tagging strategy defined in Cloud Resource Tagging ADR. The tag keys used in IAM policies are:

K8s LabelAWS Tag KeyUsed In
entigo.com/workspaceentigo:workspacePermission boundary, identity policies
entigo.com/zoneentigo:zoneIdentity policies (zone scoping)

Decision

AWS Permission Boundaries with ABAC

Use AWS IAM Permission Boundaries combined with Attribute-Based Access Control (ABAC) using resource tags to enforce workspace and zone isolation.

Architecture: Workspace & Zone Boundaries

A single workspace permission boundary supports both zone-scoped and non-zone-scoped roles:

  • Workspace permission boundary: Attached to each role, defines maximum permissions. Gates access by entigo:workspace tag.
  • Zone scoping: Implemented via identity-based policies that further restrict access based on entigo:zone tag.
  • Effective permissions: The intersection of the permission boundary AND the identity-based policy (both must allow an action).

This approach:

  • Avoids AWS limitation of one boundary per principal
  • Keeps the hierarchy clean and maintainable
  • Allows roles to be either workspace-wide or zone-restricted without structural changes

Policy Examples

Workspace Permission Boundary (maximum permissions for all roles in workspace):

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowWorkspaceResources",
"Effect": "Allow",
"Action": [
"ec2:*",
"rds:*",
"s3:*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/entigo:workspace": "ws-prod-001"
}
}
},
{
"Sid": "AllowIAMActions",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:ListRolePolicies"
],
"Resource": "*"
},
{
"Sid": "DenyUntaggedResources",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"rds:CreateDBInstance",
"s3:CreateBucket"
],
"Resource": "*",
"Condition": {
"Null": {
"aws:RequestTag/entigo:workspace": "true"
}
}
}
]
}

Identity-based Policy — Zone-Agnostic Role (workspace-wide access):

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ManageWorkspaceResources",
"Effect": "Allow",
"Action": [
"ec2:*",
"rds:*",
"s3:*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/entigo:workspace": "ws-prod-001"
}
}
}
]
}

Identity-based Policy — Zone-Scoped Role (limited to zone-1):

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ManageZoneResources",
"Effect": "Allow",
"Action": [
"ec2:*",
"rds:*",
"s3:*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/entigo:workspace": "ws-prod-001",
"aws:ResourceTag/entigo:zone": "zone-1"
}
}
}
]
}

Delegated Role & Policy Creation

The platform can create new IAM roles and policies within the workspace scope, enforcing that all created roles inherit the workspace permission boundary:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowRoleCreationWithBoundary",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:PutRolePermissionsBoundary"
],
"Resource": "arn:aws:iam::ACCOUNT:role/ws-prod-001/*",
"Condition": {
"StringEquals": {
"iam:PermissionsBoundary": "arn:aws:iam::ACCOUNT:policy/workspace-boundary-ws-prod-001"
}
}
},
{
"Sid": "AllowPolicyCreation",
"Effect": "Allow",
"Action": [
"iam:CreatePolicy",
"iam:CreatePolicyVersion",
"iam:PutUserPolicy",
"iam:PutRolePolicy"
],
"Resource": [
"arn:aws:iam::ACCOUNT:policy/ws-prod-001/*",
"arn:aws:iam::ACCOUNT:role/ws-prod-001/*"
]
},
{
"Sid": "TagNewRoles",
"Effect": "Allow",
"Action": [
"iam:TagRole",
"iam:UntagRole"
],
"Resource": "arn:aws:iam::ACCOUNT:role/ws-prod-001/*",
"Condition": {
"StringEquals": {
"aws:PrincipalTag/entigo:workspace": "ws-prod-001"
}
}
}
]
}

Key enforcement mechanisms:

  • iam:PermissionsBoundary condition: Forces the workspace boundary to be attached to any created role
  • Resource ARN restrictions: All created roles/policies must be under the workspace path (ws-prod-001/*)
  • Any new role created without the boundary will be denied, preventing privilege escalation

Azure and GCP

Azure and GCP have different access control models:

  • Azure: ABAC is limited to storage data-plane actions. Workspace isolation is better achieved via resource-group-per-workspace or subscription-per-workspace with Azure RBAC scoping. Azure Policy can enforce tag inheritance.
  • GCP: GCP Tags (organization-level, IAM-integrated) can be used with IAM Conditions for tag-based access control. GCP Labels do not support IAM conditions.

Implementation for Azure and GCP is under consideration for future iterations.

Alternatives Considered

Alternative 1: Separate AWS Accounts per Workspace

Approach: Enforce one AWS account per workspace, using account-level isolation instead of tag-based ABAC.

Pros:

  • Strongest isolation — no possibility of cross-workspace access
  • No tag dependency for isolation
  • Simpler IAM policies

Cons:

  • Higher infrastructure costs — some customers want multiple workspaces in one account
  • Account proliferation management overhead
  • Does not address zone-level isolation within a workspace

Partially adopted: One workspace per account is the recommended deployment, but not enforced. Tag-based ABAC provides isolation when account is shared with resources outside of workspace scope.

Alternative 2: Resource-Name-Based Isolation

Approach: Use resource naming conventions (e.g., prefix all resources with workspace ID) and IAM policies with resource ARN patterns.

Pros:

  • Works without tags
  • ARN-based conditions are well-understood

Cons:

  • Not all AWS resources support ARN patterns in conditions
  • Naming conventions are brittle and hard to enforce
  • Does not support zone-level scoping
  • Cannot be applied to existing resources without renaming

Rejected: Tag-based ABAC is more flexible and works with existing resources.

Consequences

Positive

  1. Strong workspace isolation — Permission boundaries enforce hard limits that identity policies cannot exceed
  2. Zone-level scoping — Identity policies restrict within the boundary for fine-grained access
  3. Privilege escalation prevention — Delegated role creation is constrained to stay within the workspace boundary

Negative

  1. Tag dependency — ABAC requires consistent, correct tagging. A mis-tagged resource becomes inaccessible or over-accessible
  2. Service coverage — Not all AWS services support aws:ResourceTag conditions. A service compatibility matrix is needed.
  3. Policy complexity — IAM policies with ABAC conditions are harder to write, read, and debug
  4. Migration path — Existing resources must be tagged before ABAC enforcement is enabled

Neutral

  1. Azure and GCP require different approaches — Tag-based ABAC is AWS-specific; other providers will need separate isolation strategies
  2. One boundary per principal — AWS limitation is addressed by using a single workspace boundary with identity policies for zone scoping

References