iam.basaltic.sh, no region segment. One identity
works in every region.
Writing policies
The document format, every condition operator, and worked examples.
Roles and credentials
Access keys, trust policies, assumed roles, and workload federation.
Permission boundaries
Capping what a policy can ever grant, and safe delegation.
How a request is decided
The five steps, in the order they actually run.
The identity model
Organization
The top of the tree. Users, groups, service accounts, roles and policies
all belong to one organization and are never visible outside it.
Account
A resource container inside the organization. Instances, volumes and zones
belong to an account; identities do not.
Groups collect users and service accounts, so a policy attached to a
group reaches both. Policies attach to users, service accounts, groups and
roles.
A user is a person and does not hold an access key. Anything programmatic —
a script, a CI job, a deployed workload — is a service account or an
assumed role. See roles and credentials.
Resource names
Policies name resources by CRN:A CRN never carries an organization id. The organization comes from the
authenticated request, which makes cross-organization access impossible by
construction rather than by a check somebody has to remember to write.
* is the only wildcard, and the colon/slash layout is compared literally — a
pattern written in any other shape matches nothing.
How a request is authorized
Every service calls the same authorizer. It runs these five steps in order:1
Bind the principal to the organization
Before anything is evaluated, the principal is confirmed to belong to the
organization the request names. This is what stops a wildcard policy from
authorizing against a CRN in someone else’s organization.
2
Organization owner short-circuit
An organization owner has implicit full access, subject only to an
explicit deny. Permission boundaries do not apply to an owner. A
session policy on temporary credentials still does — credentials advertised
as scoped-down must not inherit the bypass.
3
Collect and evaluate the effective policies
Everything attached to the principal, directly and through its groups. An
assumed role authorizes as the role, so the role’s policies are what
get evaluated, not the caller’s.The result is one of three: explicit deny, explicit allow, or nothing
matched.
4
Intersect with the session policy
If the caller is using temporary credentials that carry a session policy,
an allow survives only if the session policy also allows it. This is an
intersection, never an expansion — a session policy can never grant
something the identity does not already have.
5
Apply the permission boundary
If the principal has a boundary, the action
must be allowed by the boundary as well. Same intersection rule.
The rule that decides everything
Access is otherwise denied by default: if no statement matches, the answer is no. A principal with no policies attached can do nothing.Failing closed
Two behaviours are worth knowing because they are deliberate rather than incidental:An unreadable boundary denies
An unreadable boundary denies
If a permission boundary is set but the boundary or its policy cannot be
loaded, the request is denied. A boundary that exists but cannot be read
might be capping this very action, so the safe answer is no.
A broken condition operator denies on Deny
A broken condition operator denies on Deny
An unrecognised condition operator never matches. On an allow statement
that means the statement is skipped. On a deny statement it is treated
as a hard deny when the action and resource match — otherwise a typo in a
guardrail would silently disable it.
Next
Writing policies
Statements, actions, resources, conditions, and a set of examples to start
from.
Roles and credentials
How a program gets credentials in the first place.