mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-09-24 12:13:28 +00:00
48c269f58d
Expands the Azure AD provider example into a full Microsoft Entra ID walkthrough contributed by @drgimpfen in #1635: app registration (single tenant), Web platform redirect URI, Token configuration groups claim as Group ID, Enterprise Application "Assignment required = Yes", and mapping roles from the group Object ID so a rename in Entra doesn't break admin access. Corrects the contributed draft to use the provider-scoped v6 callback path (/api/oidc/<provider-id>/callback, not the legacy v5 /api/oidc/callback) and adds the issuer URL and client ID/secret steps the draft omitted. Keeps the draft's AADSTS650053 finding: Entra has no `groups` scope, so groups must come from the ID token claim rather than the scope list. Adds a warning the draft did not cover: on group overage Entra drops the groups claim for a _claim_names/_claim_sources marker that Pulse does not follow, and since a configured mapping is authoritative that login clears the user's roles. Three pre-existing doc defects fixed alongside: - OIDC.md claimed there is no environment-variable override for group role mappings, contradicting CONFIGURATION.md and RBAC.md. OIDC_GROUP_ROLE_MAPPINGS does exist (internal/config/oidc.go), it just only feeds the legacy env-configured provider. - RBAC.md claimed logins with zero matching groups do not clear existing role assignments. applySSORoleAssignments runs with mappingAuthoritative=true whenever the provider has any mappings, so it calls UpdateUserRoles with the empty set and does clear them. - Two RBAC.md links pointed at OIDC.md#group-to-role-mapping-pro, but the heading renders as #group-to-role-mapping-pro-and-above. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
194 lines
6.7 KiB
Markdown
194 lines
6.7 KiB
Markdown
# Role-Based Access Control (RBAC)
|
|
|
|
RBAC lets you define custom roles with granular permissions and assign them to users. This restricts what each user can see and do in Pulse.
|
|
|
|
**Requires:** Pro, legacy Pro+, Cloud, MSP, or Enterprise/custom license with the `rbac` capability.
|
|
|
|
For plan details, see [PULSE_PRO.md](PULSE_PRO.md). For API endpoints, see [API Reference](API.md#-rbac--role-management-pro).
|
|
|
|
---
|
|
|
|
## Concepts
|
|
|
|
### Roles
|
|
|
|
A role is a named set of permissions. Each permission is an `(action, resource)` pair:
|
|
|
|
- **action**: `read`, `write`, `delete`, or `admin`
|
|
- **resource**: A Pulse resource type (e.g., `alerts`, `settings`, `nodes`, `ai`)
|
|
|
|
Pulse ships with built-in roles: `admin` (full access), `operator` (manage alerts and resources), `viewer` (read-only), and `auditor` (audit log access). You can create additional custom roles for more granular control.
|
|
|
|
### Role Assignment
|
|
|
|
Users can hold multiple roles. Their effective permissions are combined across all assigned roles. Explicit `deny` rules take precedence over `allow` grants.
|
|
|
|
### OIDC Group Mapping
|
|
|
|
When using OIDC/SSO, roles can be automatically assigned based on group membership. See [OIDC Group-to-Role Mapping](OIDC.md#group-to-role-mapping-pro-and-above) for configuration.
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
1. Activate a Pro, grandfathered Pro+, Cloud, MSP, or Enterprise/custom license in **Settings → Plans & Billing**.
|
|
2. Go to **Settings → Security → Access Control**.
|
|
3. Create roles with the permissions you need.
|
|
4. Assign roles to users.
|
|
|
|
---
|
|
|
|
## Managing Roles
|
|
|
|
### Creating a Role
|
|
|
|
**UI:** Settings → Security → Access Control → Create Role
|
|
|
|
**API:**
|
|
```bash
|
|
curl -X POST http://localhost:7655/api/admin/roles \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"id": "operator",
|
|
"name": "Operator",
|
|
"description": "Can view and manage alerts",
|
|
"permissions": [
|
|
{"action": "read", "resource": "alerts"},
|
|
{"action": "write", "resource": "alerts"},
|
|
{"action": "read", "resource": "nodes"}
|
|
]
|
|
}'
|
|
```
|
|
|
|
### Listing Roles
|
|
|
|
```bash
|
|
curl http://localhost:7655/api/admin/roles \
|
|
-H "Authorization: Bearer $TOKEN"
|
|
```
|
|
|
|
### Updating a Role
|
|
|
|
```bash
|
|
curl -X PUT http://localhost:7655/api/admin/roles/operator \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"name": "Operator",
|
|
"description": "Updated description",
|
|
"permissions": [
|
|
{"action": "read", "resource": "alerts"},
|
|
{"action": "write", "resource": "alerts"},
|
|
{"action": "read", "resource": "nodes"},
|
|
{"action": "read", "resource": "ai"}
|
|
]
|
|
}'
|
|
```
|
|
|
|
### Deleting a Role
|
|
|
|
```bash
|
|
curl -X DELETE http://localhost:7655/api/admin/roles/operator \
|
|
-H "Authorization: Bearer $TOKEN"
|
|
```
|
|
|
|
---
|
|
|
|
## Managing User Assignments
|
|
|
|
### Listing Users and Their Roles
|
|
|
|
```bash
|
|
curl http://localhost:7655/api/admin/users \
|
|
-H "Authorization: Bearer $TOKEN"
|
|
```
|
|
|
|
### Setting Roles for a User
|
|
|
|
Role assignments are set as a complete list — the user's roles are replaced with the provided set:
|
|
|
|
```bash
|
|
curl -X PUT http://localhost:7655/api/admin/users/jane/roles \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"roleIds": ["operator", "viewer"]}'
|
|
```
|
|
|
|
To remove all custom roles from a user, send an empty list:
|
|
|
|
```bash
|
|
curl -X PUT http://localhost:7655/api/admin/users/jane/roles \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"roleIds": []}'
|
|
```
|
|
|
|
Note: Users cannot modify their own role assignments (self-escalation prevention).
|
|
|
|
---
|
|
|
|
## Automatic Role Assignment via OIDC
|
|
|
|
If you use an OIDC identity provider, Pulse can automatically assign roles based on group membership on each login.
|
|
|
|
**UI:** Settings → Security → Single Sign-On → Group Role Mappings
|
|
|
|
**Environment variable** (legacy env-configured OIDC provider only — it does not apply to providers created through the UI or the SSO provider API):
|
|
```bash
|
|
# Format: group1=role1,group2=role2
|
|
OIDC_GROUP_ROLE_MAPPINGS="oidc-admins=admin,oidc-operators=operator,oidc-viewers=viewer"
|
|
```
|
|
|
|
How it works:
|
|
- On each login, Pulse reads the user's groups from the OIDC groups claim.
|
|
- Matching groups are mapped to Pulse roles.
|
|
- A user can receive multiple roles from multiple group mappings.
|
|
- Once a provider has any group role mappings configured, the mapping is authoritative: on every login the user's role assignments are replaced with whatever the mapping resolves to. A login that matches no mapped group resolves to an empty set, which clears the user's existing role assignments. Watch for identity providers that silently drop the groups claim (see the Entra ID group overage warning in [OIDC.md](OIDC.md#microsoft-entra-id-formerly-azure-ad)) — to Pulse that looks the same as losing every group.
|
|
- Role changes are logged to the [audit log](AUDIT_LOGGING.md) as `oidc_role_assignment` events.
|
|
|
|
See [OIDC documentation](OIDC.md#group-to-role-mapping-pro-and-above) for full configuration details.
|
|
|
|
---
|
|
|
|
## Organization Roles (Enterprise/Internal Multi-Org)
|
|
|
|
In Enterprise/internal multi-organization deployments, each organization has its own role hierarchy:
|
|
|
|
| Role | Permissions |
|
|
|------|------------|
|
|
| **Owner** | Full control. Can transfer ownership and delete the org. |
|
|
| **Admin** | Manage members, shares, and org settings. Cannot transfer ownership. |
|
|
| **Editor** | Read/write access to org resources. Cannot manage members. |
|
|
| **Viewer** | Read-only access to all org data. |
|
|
|
|
These organization roles are separate from the RBAC custom roles described above. Organization roles control access within a specific internal organization, while RBAC roles control access to Pulse features globally.
|
|
|
|
Provider-hosted MSP uses a different boundary: each client workspace is its own isolated Pulse runtime. RBAC inside that runtime controls access for that client, and the provider control plane handles account-level staff access and handoff.
|
|
|
|
See [Multi-Tenant Organizations](MULTI_TENANT.md) for details.
|
|
|
|
---
|
|
|
|
## Example: Team Setup
|
|
|
|
A typical team configuration:
|
|
|
|
| User | Role | Access |
|
|
|------|------|--------|
|
|
| alice | `admin` | Full access to everything |
|
|
| bob | `operator` | Can view nodes/VMs and manage alerts |
|
|
| carol | `viewer` | Read-only access to monitoring views and metrics |
|
|
| monitoring-bot | API token with `monitoring:read` scope | Automated alert polling |
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
- [Plans and Entitlements](PULSE_PRO.md) — RBAC availability by plan
|
|
- [OIDC / SSO](OIDC.md) — Automatic role assignment from identity providers
|
|
- [Audit Logging](AUDIT_LOGGING.md) — Track role changes and access events
|
|
- [Multi-Tenant Organizations](MULTI_TENANT.md) — Organization-level roles
|
|
- [API Reference](API.md#-rbac--role-management-pro) — RBAC API endpoints
|
|
- [Security Policy](../SECURITY.md) — Core security model
|