Role-Based Access Control (RBAC)

What you'll accomplish: Understand the role hierarchy, assign appropriate permissions, and manage API keys for teams and services.

Roles

Six roles are defined in hoziron-core-types::auth::permissions::Role:

RolePurpose
adminFull access — all operations, config changes, key and vault management
operatorAgent lifecycle, workflow management, schedule management, backup create/list, integration/catalog management
developerInstall skills/competencies, invoke agents, install catalog packages, publish packages
viewerRead-only access to most resources (not audit, security, or vault)
serviceMachine-to-machine — invoke agents, send messages, start workflow runs, read/write memory
auditorRead-only access to everything plus audit:read and security:audit — for compliance officers who must verify platform posture independently, without the ability to modify any state

auditor is a real, first-class role (Role::Auditor in code) even though it isn't listed in hoziron-cli auth create-key --help's example text — it is accepted by --role auditor the same as the other five.

Permission matrix

This table is generated from the platform's actual PERMISSION_MATRIX (crates/platform/hoziron-core-types/src/auth/permissions.rs) — every Action variant that exists is listed below with the exact roles authorized to perform it. There is no agent:create or workflow:create action: agents and workflows enter the system only via catalog:install (install-from-package), not a runtime create endpoint.

ActionAdminOperatorDeveloperViewerServiceAuditor
agent:start
agent:stop
agent:send_message
agent:list
agent:status
agent:update
agent:invoke
workflow:run
workflow:list
workflow:status
competency:install
competency:equip
competency:unequip
competency:manage
skill:install
skill:remove
config:read
config:write
config:reload
auth:key_management
vault:read
vault:manage
audit:read
audit:write
schedule:create
schedule:delete
schedule:update
package:publish
registry:publish
registry:admin
registry:download
backup:create
backup:list
backup:restore
daemon:shutdown
budget:read
memory:read
memory:write
channel:read
channel:manage
webhook:read
webhook:manage
integration:read
integration:manage
security:read
security:audit
approval:read
approval:decide
catalog:read
catalog:install
catalog:manage
trigger:read
trigger:manage
template:read
session:read
licence:read

Notable patterns:

  • The credential vault (vault:read/vault:manage) is Admin-only, deliberately excluding auditor — even a compliance role cannot list or write vault entries. This is the same bar as auth:key_management. See Credentials.
  • catalog:uninstall and destructive integration/registry removal are gated at catalog:manage/integration:manage (Operator+), separate from the lower-bar catalog:install/integration:read used for routine installs.
  • auditor never appears on a write action — it is the read-plus-audit role, not a superset of operator.
  • audit:read is defined but not currently wired to any routeGET /security/audit is gated on security:audit, not audit:read (both land on the same Admin/Auditor pair today, so this doesn't change who can do what, but don't go looking for a separate audit:read-gated endpoint).

Insufficient permissions return:

{
  "error": "forbidden",
  "message": "Role 'viewer' cannot perform 'agent:start'"
}

Key management

Create keys for different roles

# Admin key (full access)
hoziron-cli auth create-key --role admin --name "platform-admin"

# Operator key for CI/CD
hoziron-cli auth create-key --role operator --name "deploy-bot" --expires-in 90d

# Developer key for a team member
hoziron-cli auth create-key --role developer --name "alice"

# Service key for automated integrations
hoziron-cli auth create-key --role service --name "webhook-handler"

# Viewer key for monitoring dashboards
hoziron-cli auth create-key --role viewer --name "grafana-readonly"

# Auditor key for a compliance officer (read-only, plus audit trail access)
hoziron-cli auth create-key --role auditor --name "compliance-review"

Key expiration

Keys can optionally expire:

hoziron-cli auth create-key --role operator --name "temp-access" --expires-in 7d

Expired keys are treated as invalid at validation time.

Rotate keys

hoziron-cli auth rotate-key <key-id>

Rotation creates a new key and revokes the old one in a single operation.

Safety guardrails

  • The last admin key cannot be revoked (prevents lockout)
  • Key values are shown once at creation — never retrievable after
  • Only the first 12 characters are stored as a prefix for identification

Best practices

  • Use service role for automation — it has minimal permissions (invoke agents, run workflows)
  • Set expiration on all non-admin keys
  • Store keys in a secrets manager, inject via environment variables
  • Create separate keys per integration (easier to revoke individually)
  • Use OIDC for human users, local keys for service accounts

Next steps


Related: