Roles y permisos (RBAC)
ShieldAgent aplica control de acceso basado en roles en cada endpoint de API. Esta página documenta los roles integrados, la matriz de permisos y el permiso exacto requerido por cada endpoint.
Descripción general
Cada solicitud autenticada se comprueba contra el rol del llamador en el tenant objetivo. Los permisos siguen un patrón resource:action (p. ej. agent:write). Los administradores de plataforma omiten el ámbito del tenant y tienen todos los permisos. Los roles con ámbito de tenant se asignan por tenant, por lo que un usuario puede ser auditor en un tenant y tenant_admin en otro.
La caché de permisos tiene un TTL de 60 segundos con degradación elegante — si la base de datos no está temporalmente disponible, se sirven permisos obsoletos en lugar de denegar el acceso.
Roles integrados
ShieldAgent incluye seis roles del sistema. Los roles personalizados aún no son compatibles — las asignaciones usan estos roles integrados.
| Rol | Ámbito | Descripción |
|---|---|---|
| platform_admin | Plataforma | Acceso completo a la plataforma en todos los tenants. Reservado para operadores de ShieldAgent. |
| tenant_admin | Tenant | Gestión completa de un tenant: usuarios, configuración, facturación, todos los subrecursos. |
| security_operator | Tenant | Monitorización, triaje de incidentes, gestión de alertas, revisión de riesgos. |
| auditor | Tenant | Acceso de solo lectura a informes de cumplimiento, registro de auditoría y exportación. |
| aiops_engineer | Tenant | Ciclo de vida de agentes, configuración de servidores MCP/vínculos, autoría de políticas. |
| viewer | Tenant | Panel de solo lectura y datos de resumen. |
Matriz de permisos
La matriz siguiente muestra cada permiso y qué roles lo incluyen. platform_admin y tenant_admin tienen todos los permisos y se omiten para mayor legibilidad.
| Permiso | Descripción | sec_op | auditor | aiops | viewer |
|---|---|---|---|---|---|
| agent:read | Ver / listar agentes | ✓ | ✓ | ✓ | ✓ |
| agent:write | Crear o actualizar agentes | — | — | ✓ | — |
| agent:delete | Eliminar agentes | — | — | ✓ | — |
| agent:configure | Modificar configuración de agente / líneas base | — | — | ✓ | — |
| policy:read | Ver / listar políticas | ✓ | ✓ | ✓ | ✓ |
| policy:write | Crear o actualizar políticas | — | — | ✓ | — |
| policy:delete | Eliminar políticas | — | — | ✓ | — |
| audit:read | Ver eventos del registro de auditoría | ✓ | ✓ | ✓ | — |
| audit:export | Exportar datos de auditoría | — | ✓ | — | — |
| compliance:read | Ver informes de cumplimiento | ✓ | ✓ | — | — |
| compliance:write | Crear o actualizar registros de cumplimiento | — | — | — | — |
| compliance:export | Exportar datos de cumplimiento | — | ✓ | — | — |
| risk:read | Ver puntuaciones de riesgo y tendencias | ✓ | ✓ | ✓ | ✓ |
| risk:configure | Modificar umbrales de riesgo / sobreescrituras | ✓ | — | ✓ | — |
| incident:read | Ver incidentes | ✓ | ✓ | — | — |
| incident:write | Crear o actualizar incidentes | ✓ | — | — | — |
| incident:triage | Reconocer, asignar o resolver | ✓ | — | — | — |
| mcp_server:read | Ver registros de servidores MCP | ✓ | — | ✓ | ✓ |
| mcp_server:write | Crear o actualizar servidores MCP | — | — | ✓ | — |
| mcp_server:delete | Eliminar servidores MCP | — | — | ✓ | — |
| alert:read | Ver alertas | ✓ | ✓ | ✓ | ✓ |
| alert:write | Crear o actualizar reglas de alerta | ✓ | — | ✓ | — |
| alert:delete | Eliminar reglas de alerta | — | — | — | — |
| alert:triage | Reconocer o resolver eventos de alerta | ✓ | — | — | — |
| review:read | Ver revisiones pendientes | ✓ | ✓ | ✓ | — |
| review:triage | Aprobar o rechazar revisiones | ✓ | — | — | — |
| user:read | Ver cuentas de usuario | — | — | — | — |
| user:write | Crear o actualizar usuarios y roles | — | — | — | — |
| user:delete | Eliminar cuentas de usuario | — | — | — | — |
| tenant:read | Ver configuración del tenant | ✓ | ✓ | ✓ | ✓ |
| tenant:write | Modificar configuración del tenant / facturación | — | — | — | — |
| export:read | Ver configuraciones de exportación | — | ✓ | — | — |
| export:write | Crear o actualizar configuraciones de exportación | — | — | — | — |
| dashboard:read | Ver datos del panel agregado | ✓ | ✓ | ✓ | ✓ |
Requisitos de autenticación de endpoints
Cada endpoint con ámbito de tenant requiere un JWT válido más el permiso listado. El middleware valida tanto la pertenencia al tenant como el permiso específico antes de que se ejecute el manejador. Se devuelve un 403 Forbidden si la comprobación falla.
Agents
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/agents | agent:read |
| POST | /tenants/:tenantId/agents | agent:write |
| PUT | /tenants/:tenantId/agents/:agentId | agent:write |
| PATCH | /tenants/:tenantId/agents/:agentId | agent:configure |
| DELETE | /tenants/:tenantId/agents/:agentId | agent:delete |
Policies
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/policies | policy:read |
| POST | /tenants/:tenantId/policies | policy:write |
| PUT | /tenants/:tenantId/policies/:policyId | policy:write |
| DELETE | /tenants/:tenantId/policies/:policyId | policy:delete |
Audit Trail
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/audit | audit:read |
| GET | /tenants/:tenantId/audit/verify-chain | audit:read |
Compliance
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/compliance/report | compliance:read |
| GET | /tenants/:tenantId/compliance/controls | compliance:read |
| POST | /tenants/:tenantId/compliance/versions | compliance:write |
Incidents
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/incidents | incident:read |
| POST | /tenants/:tenantId/incidents | incident:write |
| PATCH | /tenants/:tenantId/incidents/:incidentId | incident:triage |
Users & Tenants
| Método | Ruta | Permiso |
|---|---|---|
| GET | /tenants/:tenantId/users | user:read |
| POST | /tenants/:tenantId/users/invite | user:write |
| PATCH | /tenants/:tenantId/users/:userId | user:write |
| GET | /tenants/:tenantId | tenant:read |
| PUT | /tenants/:tenantId | tenant:write |
Uso del middleware
Los manejadores de rutas adjuntan comprobaciones RBAC como hooks preHandler de Fastify. Hay dos variantes disponibles:
requireTenantPermission(...perms)
Valida que el llamador pertenece al tenant en :tenantId y tiene al menos uno de los permisos listados. Usado por todos los endpoints con ámbito de tenant.
fastify.get(
'/tenants/:tenantId/agents',
{ preHandler: [authenticate, rbac.requireTenantPermission('agent:read')] },
async (request, reply) => { /* handler */ }
);requirePermission(...perms)
Comprueba el permiso sin ámbito de tenant. Usado para endpoints a nivel de plataforma como plantillas de políticas o listado de planes de facturación.
fastify.get(
'/policy-templates',
{ preHandler: [authenticate, rbac.requirePermission('policy:read')] },
async (request, reply) => { /* handler */ }
);Endpoints públicos
Un pequeño número de endpoints omiten la autenticación por completo:
Asignación de roles
Los roles se asignan por usuario por tenant mediante la tabla user_roles. Un usuario puede tener diferentes roles en diferentes tenants. Las asignaciones rastrean quién otorgó el rol y admiten expiración opcional.
// Assign a role via the API
PATCH /tenants/:tenantId/users/:userId
{
"role": "security_operator"
}
// Requires: user:write permissionLos valores de rol heredados (admin, tenant) se normalizan automáticamente a sus equivalentes RBAC (platform_admin, tenant_admin) a nivel de middleware.