Skip to content
Ironflow is pre-1.0: APIs can change between releases. Pin a version. What is ready →

Platform RBAC

Platform RBAC controls what platform users and API keys can do. Platform roles (platform_admin, platform_operator, platform_viewer) are stored in the unified roles table under org_platform and use the same RBAC infrastructure as tenant roles.


Three roles are available out of the box:

RoleDescriptionKey Capabilities
platform_adminFull platform accessAll operations including user management, write impersonation, and key management
platform_operatorOperational accessTenant management, full impersonation, freeze and thaw the instance, read access to users/keys/roles/policies/audit
platform_viewerRead-only accessView users, keys, roles, policies, tenants, the instance state and audit logs; read-only impersonation

Built-in roles cannot be deleted or modified.


Assign roles when creating a user:

Terminal window
ironflow platform users create --email ops@example.com --name "Operator" \
--role-ids role_platform_admin

Or via the API:

Terminal window
curl -X POST http://localhost:9123/api/v1/platform/users \
-H "Authorization: Bearer $PLATFORM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "ops@example.com",
"password": "secure-password",
"name": "Operator",
"role_ids": ["role_platform_admin"]
}'

Assign roles when creating a key:

Terminal window
ironflow apikey create ops-key --platform --role role_platform_operator

--role takes a role ID and can be repeated. A platform key created without --role gets no roles and therefore no permissions — the auto-assigned viewer fallback applies to tenant keys only. Role IDs passed with --platform must belong to org_platform.


Platform actions control access to specific operations:

ActionDescription
platform:users:readList and view platform users
platform:users:manageCreate, update, and delete platform users
platform:keys:readList and view platform API keys
platform:keys:manageCreate, rotate, and delete platform API keys
platform:roles:readList and view platform roles
platform:roles:manageCreate, update, and delete custom roles
platform:tenants:readList and view tenant organizations
platform:tenants:manageProvision and delete tenant organizations
platform:impersonate:readRead-only access to tenant data via impersonation
platform:impersonateWrite access to tenant data via impersonation (any endpoint whose RBAC action is not a read)
platform:policies:readView the platform policy set and its versions
platform:policies:manageWrite, validate, dry-run and roll back the platform policy set, and force a tenant set to monitor mode
platform:audit:readQuery the platform audit log
platform:instance:readRead the instance barrier and drain state
platform:instance:freezeFreeze and thaw the instance
platform:instance:reconcileReconcile one drain obligation
platform:instance:attestAttest instance coverage for a boundary
platform:bootstrapRun the one-time platform bootstrap. No built-in platform role holds it; only an admin of the default organization does
ActionAdminOperatorViewer
platform:users:readYesYesYes
platform:users:manageYes——
platform:keys:readYesYesYes
platform:keys:manageYes——
platform:roles:readYesYesYes
platform:roles:manageYes——
platform:tenants:readYesYesYes
platform:tenants:manageYesYes—
platform:impersonate:readYesYesYes
platform:impersonateYesYes—
platform:policies:readYesYesYes
platform:policies:manageYes——
platform:audit:readYesYesYes
platform:instance:readYesYesYes
platform:instance:freezeYesYes—
platform:instance:reconcileYes——
platform:instance:attestYes——

AspectPlatform RBACTenant RBAC
ScopeCross-tenant platform operationsSingle organization
Rolesplatform_admin, platform_operator, platform_vieweradmin, developer, viewer
Actionsplatform:* namespacefunctions:*, events:*, etc.
Custom rolesNamed roles; deny rules for them live in the policy setNamed roles; deny rules for them live in the policy set
Key prefixifplatform_ifkey_

Create a custom role:

Terminal window
ironflow platform roles create support-role

The server adds the platform_ prefix, so this creates platform_support-role. A custom role grants no platform:* action on its own: only the three built-in roles carry actions. A custom role is a name that a rule in the platform policy set can test, and the policy set can only deny what a built-in role allowed. To give a user or key platform access, assign a built-in role.

Deny rules that depend on a role are written in the Rego policy set. See Authorization policy sets and Custom Roles & Policy Sets.