Role-based access control
Built-in roles
Union.ai provides three user-assignable roles with progressively broader permissions.
| Role | Capabilities |
|---|---|
| Admin | Full access: manage users, clusters, secrets, projects, all runs |
| Contributor | Create/abort runs, deploy tasks, manage secrets within assigned projects |
| Viewer | Read-only: runs, actions, logs, reports |
Additional internal system roles exist for platform operations but are not user-visible or user-assignable.
Custom policies
Custom policies bind roles (built-in or custom) to resources scoped at org-wide, domain, or project+domain level using composable YAML bindings via uctl. This allows organizations to define fine-grained access policies that match their team structure and security requirements.
Enforcement
Every request is authenticated and authorized against the user’s role assignments before any data access occurs. Enforcement happens at two points: the control plane API gates orchestration metadata operations (run lifecycle, task definitions, RBAC management, project/domain queries), and the Envoy router inside the customer’s cluster gates every customer-data request to the dataproxy service (signed URLs, structured I/O retrieval, log fetching, auxiliary UI proxying, secret writes). Both enforcement points evaluate the same Union.ai identity against the same RBAC policy.
Least privilege
Union.ai enforces least privilege across all components. IAM roles on the data plane are scoped to minimum required permissions. Each data plane has two IAM roles: an admin role for platform services and a user role for task pods. IAM roles are bound via cloud-native workload identity federation, eliminating static credentials entirely. Presigned URLs grant single-object, operation-specific, time-limited access. Service accounts receive only the permissions needed for their specific function.
Verification
RBAC enforcement
Reviewer focus: Confirm that each role enforces the expected permissions and that custom policies correctly scope access to specific projects and domains.
How to verify:
-
Create three test users with Admin, Contributor, and Viewer roles.
-
Log in as Viewer and confirm restricted operations are denied:
uctl create run ... # Expect denied uctl create secret ... # Expect denied uctl get executions # Expect success -
Log in as Contributor scoped to project A:
uctl create run --project B ... # Expect denied uctl create run --project A ... # Expect success -
Create a custom policy scoping a user to project X, development domain only. Attempt to access the production domain. Expect denied.
-
Display all active policy bindings:
uctl get policy -
For Union.ai employee access: the customer creates an RBAC policy for Union.ai support, scoped to viewer only and time-limited.
This verification is fully self-service.