Overcast is alpha — behaviour and APIs may change between releases. Pin your version and read the changelog before upgrading.

overcast

IAM — Identity and Access Management

Quick start, the entities and policy simulator that work, what OVERCAST_ENFORCE_IAM evaluates and the action prefixes it uses, and what is never enforced.

Users, roles, groups, policies and instance profiles, so CDK and Terraform stacks provision. Nothing is enforced unless you switch enforcement on.

Status: ⚠️ Partial

Quick start

export AWS_ENDPOINT_URL=http://localhost:4566

aws iam create-role --role-name app \
  --assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}'

aws iam attach-role-policy --role-name app \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

Any credentials work; with none configured, run eval "$(overcast env)" first — see Using AWS SDKs and CLI.

Caution

Overcast is not a security boundary. Credentials are accepted but never verified, and every call succeeds regardless of attached policies unless you opt in to enforcement below.

What works

AreaBehaviour
EntitiesUsers, roles, groups, managed and inline policies, instance profiles, access keys, tags on all of them
Policy documentsParsed before they are stored — every operation that takes one refuses a malformed document with MalformedPolicyDocument (400)
Policy usageGetPolicy and ListPolicies count real attachments in AttachmentCount, and bounded entities in PermissionsBoundaryUsageCount
TagsApplied inline at create, changed with Tag*/Untag*, and returned on the resource by GetRole, GetUser, GetPolicy and GetInstanceProfile — the List* operations omit them, as AWS does
Group membershipGetGroup resolves members into Users, paginated with Marker / MaxItems (default 100, cap 1000)
Permissions boundariesAttached at create or later, reported as AttachedPermissionsBoundary, and read by both the simulator and enforcement
Policy simulationSimulateCustomPolicy and SimulatePrincipalPolicy run a real evaluation and return AWS’s allowed / explicitDeny / implicitDeny vocabulary
Delete safetyDeleteUser, DeleteRole, DeleteGroup, DeletePolicy and DeleteInstanceProfile refuse with DeleteConflict (409) while dependencies remain
Account detailsGetAccountAuthorizationDetails

Simulation reads nothing else and changes nothing, and it works whether or not enforcement is switched on. MatchedStatements names the deciding policy and statement, with StartPosition / EndPosition pointing at that statement’s braces in the exact document text supplied, so two statements in the same document are told apart.

Request-time enforcement (opt-in)

Set OVERCAST_ENFORCE_IAM=true and every request is evaluated against the calling principal’s policies before it reaches the service handler. It is off by default, and with it off the evaluator reads nothing and decides nothing.

When it is on:

  • The caller is resolved from the SigV4 access key to an IAM user (its inline, attached and group policies) or to a role assumed through STS, plus that entity’s permissions boundary.
  • A refused request gets the calling service’s own AccessDenied-shaped error, in that service’s wire format.
  • Identity policies only. Resource-based policies — S3 bucket policies, Lambda/SQS/SNS policies — are not consulted. Pass one to the simulator explicitly to test it.
  • Enforcement is fail-closed: an unsigned request, an unparseable policy, or a construct the evaluator does not implement all deny.

The action evaluated is <prefix>:<Operation>, where the prefix is the IAM action prefix AWS itself uses — so write policies with the names the AWS documentation gives. Ten services differ from their Overcast service key:

ServiceIAM action prefix
MSKkafka:
Step Functionsstates:
EFSelasticfilesystem:
OpenSearches:
ELBv2elasticloadbalancing:
AppRegistryservicecatalog:
Cognito user poolscognito-idp:
WAFwafv2:
DynamoDB Streamsdynamodb:
AppConfig Dataappconfig:

Differences from AWS

AreaOn AWSOvercast
EnforcementAlways onOff unless OVERCAST_ENFORCE_IAM=true; identity policies only
CredentialsVerified against the signing keyAccepted without verification
Policy versionsEvery version is retained and retrievableA counter only — no GetPolicyVersion, ListPolicyVersions or DeletePolicyVersion
Policy document validationThe full policy grammarStructure only — see Limitations
Login profiles, MFA devices, SSH keys, signing certificates, Git credentialsFull APINot modelled

The policy language the evaluator does and does not cover is in Limitations.

Gotchas

Warning

A teardown script that deletes an IAM entity without unwinding it first now gets a 409 DeleteConflict, as it would against real AWS. See Troubleshooting.

Operations

All 74 listed operations are implemented. Per-operation status, notes and AWS API links: IAM operations.