Authorization and RBAC
Authentication establishes who the caller is. Authorization decides what that caller may do, and where. Zaris delegates authorization to its built-in security layer, which evaluates a role-based access-control (RBAC) model that is deny-by-default: a caller can do nothing until a role granted to it explicitly permits an operation at the relevant scope.
The model
- Permission — an operation the cluster can perform, identified by a stable id such as
data.read,data.write, orstore.create. - Role — a named set of permissions. Zaris ships a fixed catalog of preset roles; you grant these rather than individual permissions.
- Scope — where a grant applies, as a hierarchical string:
zaris:clusterfor the whole cluster, orzaris:store:<name>for one store. A grant at a higher scope covers the scopes beneath it. - Grant — the binding itself: this role, to this principal (subject), at this scope.
Why deny-by-default
A new principal can do nothing until a role is granted. This is the safe default: forgetting to configure a permission fails closed (access denied), never open (accidental access). It also makes audits tractable — a principal's capabilities are exactly the sum of its grants, with no ambient authority to reason about.
Permissions
Zaris declares its permissions in a single catalog shared by the Management Service (control plane) and every node (data plane), so both resolve token roles the same way.
Control-plane permissions (enforced by the Management Service):
store.create,store.delete,store.start,store.stop,store.config.editnode.add,node.start,node.stoprole.grant,role.revokediagnostics.read,metrics.read
Data-plane permissions (the store operations a node cares about):
data.read,data.write,data.delete,data.scan,data.clear
Preset roles
You grant these roles by name. Each role's permission set is fixed by Zaris.
| Role | Scope level | Permissions |
|---|---|---|
ClusterAdmin | cluster | Every control-plane and data-plane permission. |
StoreOperator | store | store.start, store.stop, store.config.edit, node.start, node.stop, diagnostics.read, metrics.read. |
Observer | store | diagnostics.read, metrics.read. |
DataWriter | store | data.read, data.write, data.delete, data.scan. |
DataReader | store | data.read, data.scan. |
These preset roles are the only roles a node can resolve offline. Custom (non-preset) roles are not resolvable at the data-plane connection check, so use the preset data roles (DataReader, DataWriter, or ClusterAdmin) for tokens that connect to a store.
How enforcement differs by plane
Authorization is evaluated in two places, and the granularity differs.
- Control plane (Management Service). Each management operation checks the specific permission it needs at the requested scope — for example,
store.createat the cluster scope. This is fine-grained, per-operation authorization. - Data plane (node). A node authorizes at connection time, not per operation. When a client connects to a store, the node admits the connection if the token carries a data-capable role (
DataReader,DataWriter, orClusterAdmin) whose scope covers that store. Per-operation permission checks are intentionally kept off the data-plane hot path.
The practical consequence: to let an application connect to the orders store for reads, grant it DataReader at zaris:store:orders; to also let it write, grant DataWriter.
Granting access
Grant and revoke roles through the Management Service (Console Security settings or the cmdlets). The grant fans out to every connected manager so the assignment is consistent cluster-wide.
# Let a service account read and write the orders store.
Grant-ZrRole -Subject orders-svc -Role DataWriter -Scope zaris:store:orders
# Give an operator cluster-wide read-only observability.
Grant-ZrRole -Subject alice -Role Observer -Scope zaris:cluster
# Remove a grant.
Revoke-ZrRole -Subject orders-svc -Role DataWriter -Scope zaris:store:orders
-Scopeaccepts a canonical scope (zaris:store:orders,zaris:cluster). A bare store name such asordersis normalized tozaris:store:orders; an empty scope orrootmeans the cluster-wide default.- Inspect roles with
Get-ZrRole(lists each preset role and its permissions) and audit a subject withGet-ZrGrant -Subject <subject>(its effective role, scope, and permissions).
Scopes in practice
Scopes let one cluster safely serve many teams. A grant at a higher scope covers the scopes beneath it.
| Grant | Effect |
|---|---|
DataWriter @ zaris:store:orders | read/write on orders only |
DataReader @ zaris:cluster | read on every store |
ClusterAdmin @ zaris:cluster | full cluster administration |
Next steps
- The identity side of this model → Authentication and tokens.
- The client's side of a secured cluster → Connecting a secured client.