Espacio de Nombres de Puerta de Decisión + Arquitectura RBAC/ACL del Registro
Audience: Engineers implementing or reviewing namespace policy, Asset Core namespace authority integration, and schema registry access control. This document is the canonical, implementation-aligned description of how Audiencia: Ingenieros que implementan o revisan la política de espacios de nombres, integración de la autoridad de espacio de nombres de Asset Core y control de acceso al registro de esquemas. Este documento es la descripción canónica, alineada con la implementación, de cómo Decision Gate (DG) hace cumplir los límites de los espacios de nombres y el RBAC/ACL del registro.
Tabla de Contenidos
- Resumen Ejecutivo
- Alcance y No Objetivos
- Conceptos y Tipos Fundamentales
- Namespace Policy
- Registry RBAC/ACL
- Flujos de Decisión de Autorización
- Auditoría y Observabilidad
- Almacenamiento y Persistencia
- Invariantes de Seguridad
- Pruebas y Validación
- Referencia Cruzada Archivo por Archivo
- Documentación relacionada
Resumen Ejecutivo
Decision Gate impone el aislamiento de espacios de nombres y la autorización del registro de esquemas como fronteras de seguridad de primera clase. Todas las verificaciones de espacios de nombres y registros son cerradas por defecto y se ejecutan antes de cualquier mutación del estado del registro o del escenario. El sistema es intencionadamente conservador:
- El enrutamiento de espacios de nombres requiere validación explícita; los espacios de nombres desconocidos son denegados.
- The reserved default namespace id (1) is blocked by default and allowed only
when both
namespace.allow_default = trueand the caller’s tenant appears in El id de espacio de nombres predeterminado reservado (1) está bloqueado por defecto y permitido solo cuando tantonamespace.allow_default = truecomo el inquilino del llamador aparece ennamespace.default_tenants.F:crates/decision-gate-config/src/config.rs L1025-L1052 F:crates/decision-gate-mcp/src/tools.rs L2821-L2841 - Asset Core integration is explicit and bounded to configured endpoints and La integración de Asset Core es explícita y está limitada a los puntos finales y tiempos de espera configurados; no se permite el mapeo de espacio de nombres implícito.F:crates/decision-gate-config/src/config.rs L1118-L1165 F:crates/decision-gate-mcp/src/namespace_authority.rs L103-L159
- Schema registry access is guarded by a dedicated Registry ACL layer that is El acceso al registro de esquemas está protegido por una capa dedicada de ACL de Registro que es independiente de las listas de permitidos de las herramientas; ambas deben permitir la acción.F:crates/decision-gate-mcp/src/registry_acl.rs L146-L215 F:crates/decision-gate-mcp/src/tools.rs L2881-L2910
El RBAC/ACL del registro está limitado por inquilino + espacio de nombres + sujeto y puede ser configurado como integrado o personalizado. La política integrada está definida explícitamente por los nombres de los roles con control de clase de política para el acceso de escritura.F:crates/decision-gate-mcp/src/registry_acl.rs L218-L255
Alcance y No Objetivos
En alcance:
- Validación de espacio de nombres en herramientas MCP.
- Restricciones del espacio de nombres predeterminado.
- Integración de la autoridad del espacio de nombres de Asset Core.
- Política de RBAC/ACL del registro de esquemas y requisitos de firma.
- Auditar y ejecutar el contexto de seguridad para estas decisiones.
Fuera de alcance (manejado en otro lugar o excluido intencionadamente):
- Asset Core write-path gating (explicitly out of scope in the integration Control de la ruta de escritura de Asset Core (explícitamente fuera del alcance en el contrato de integración).
- Control de acceso basado en roles a nivel de escenario o listas blancas de herramientas (cubierto en la documentación de autenticación del servidor).
- Aplicación de la confianza del proveedor de evidencia (documentado en la guía de seguridad).
Conceptos y Tipos Fundamentales
Identificadores de Espacio de Nombres y Inquilinos
Los espacios de nombres y los inquilinos se tratan como identificadores explícitos llevados por las solicitudes de herramientas. El identificador de espacio de nombres predeterminado reservado es 1 y debe pasar verificaciones adicionales antes de que se realice cualquier operación.F:crates/decision-gate-mcp/src/tools.rs L162-L168 F:crates/decision-gate-mcp/src/tools.rs L2821-L2841
Registros del Registro de Esquemas
Las entradas del registro de esquemas son valores inmutables DataShapeRecord. Cada registro está delimitado por inquilino + espacio de nombres + id de esquema + versión, y puede incluir metadatos de firma opcionales (id de clave, firma, algoritmo opcional). F:crates/decision-gate-core/src/core/data_shape.rs L49-L72
Política de Espacio de Nombres
Guardián del Espacio de Nombres Default
El espacio de nombres predeterminado es un identificador reservado codificado de forma rígida (1). Su comportamiento es intencionadamente limitado:
- If
namespace.allow_defaultis false, all requests targeting the default Sinamespace.allow_defaultes falso, todas las solicitudes dirigidas al espacio de nombres predeterminado son rechazadas. - If
namespace.allow_defaultis true,namespace.default_tenantsmust be Sinamespace.allow_defaultes verdadero,namespace.default_tenantsdebe ser no vacío y el llamador debe proporcionar untenant_iden la lista de permitidos. - La protección del espacio de nombres predeterminado se aplica antes de las verificaciones de autoridad externa.
Implementación:
- La validación de la configuración impone el requisito de la lista permitida.F:crates/decision-gate-config/src/config.rs L1025-L1052
- El enrutador de herramientas aplica la protección por solicitud.F:crates/decision-gate-mcp/src/tools.rs L2821-L2841
Modos de Autoridad de Namespace
La autoridad del espacio de nombres determina cómo DG valida la existencia del espacio de nombres:
| Modo | Comportamiento | Fuente |
|---|---|---|
none | No verifica autoridades externas (política de espacio de nombres local de DG únicamente) | NamespaceAuthorityMode::NoneF:crates/decision-gate-config/src/config.rs L1056-L1115 |
assetcore_http | Valida el espacio de nombres a través de la API HTTP del daemon de escritura de Asset Core | NamespaceAuthorityMode::AssetcoreHttpF:crates/decision-gate-config/src/config.rs L1056-L1115 F:crates/decision-gate-mcp/src/namespace_authority.rs L67-L159 |
Cuando assetcore_http está habilitado, DG valida los espacios de nombres emitiendo una solicitud GET a /{base_url}/v1/write/namespaces/{resolved_id}. HTTP 200 = permitido; 404 o 401/403 = denegado; otros estados y errores de transporte se tratan como no disponibles (fallo cerrado). F:crates/decision-gate-mcp/src/namespace_authority.rs L130-L158
Las solicitudes de autoridad de Asset Core pueden incluir un token de portador opcional y un encabezado x-correlation-id derivado del encabezado de correlación proporcionado por el cliente que es inseguro cuando está disponible (retrocediendo al id de solicitud JSON-RPC o al id de correlación emitido por el servidor). Los IDs de correlación del cliente se validan estrictamente y se rechazan cuando son inválidos; solo se reenvían valores sanitizados a la autoridad del espacio de nombres para prevenir la inyección de encabezados y el engaño de registros.F:crates/decision-gate-mcp/src/tools.rs L2821-L2852 F:crates/decision-gate-mcp/src/namespace_authority.rs L103-L126 F:crates/decision-gate-mcp/src/server.rs L1648-L1657
Restricción de integración: el modo dev-permissive está prohibido cuando namespace.authority.mode = assetcore_http para evitar debilitar la seguridad del namespace en implementaciones integradas.F:crates/decision-gate-config/src/config.rs L580-L603
Reglas del Espacio de Nombres de Asset Core
Los identificadores de espacio de nombres son numéricos en todas partes (>= 1). La validación de autoridad de Asset Core es directa y no aplica ningún mapeo o traducción. Cualquier fallo de análisis produce un error de validación de espacio de nombres (fallo cerrado).F:crates/decision-gate-config/src/config.rs L1118-L1165 F:crates/decision-gate-mcp/src/namespace_authority.rs L130-L158
La validación de configuración impone los ajustes requeridos de Asset Core (URL base, rangos de tiempo de espera) cuando la autoridad de Asset Core está habilitada.F:crates/decision-gate-config/src/config.rs L1118-L1165
Postura de Fallo
Los fallos de autoridad del espacio de nombres se mapean de la siguiente manera:
- Entrada de espacio de nombres no válida ->
InvalidParams(error del llamador) - Autoridad denegada o no disponible ->
Unauthorized(fallo cerrado)
Esto asegura que los espacios de nombres faltantes y las interrupciones en la parte superior se traten como fallos de acceso en lugar de rutas permitidas.F:crates/decision-gate-mcp/src/tools.rs L3217-L3222
Registro RBAC/ACL
Resolución Principal
La ACL del registro se basa en un principal derivado del contexto de autenticación MCP:
AuthContext.principal_id()resolves to subject, token fingerprint, or aAuthContext.principal_id()se resuelve en sujeto, huella digital del token o una etiqueta de respaldo estable (local/token/mtls).- Principal profiles are configured in
server.auth.principals, each with Los perfiles principales se configuran enserver.auth.principals, cada uno con una clase de política opcional y vinculaciones de roles. - Role bindings can be globally scoped or restricted to a tenant and/or Las vinculaciones de roles pueden tener un alcance global o estar restringidas a un inquilino y/o un espacio de nombres.
Referencias de implementación:
- Derivación del id principal.F:crates/decision-gate-mcp/src/auth.rs L181-L216
- Configuración y validación principal.F:crates/decision-gate-config/src/config.rs L802-L977
- Lógica principal de resolución de mapeo y alcance de roles.F:crates/decision-gate-mcp/src/registry_acl.rs L54-L143
Política de ACL Incorporada
La política incorporada es la predeterminada (schema_registry.acl.mode = builtin). El comportamiento es intencionadamente conservador y se basa en nombres de roles canónicos:
Leer (Lista/Obtener) permitido cuando el principal tiene cualquiera de:
- TenantAdmin, NamespaceOwner, NamespaceAdmin, NamespaceWriter, TenantAdmin, NamespaceOwner, NamespaceAdmin, NamespaceWriter, NamespaceReader, SchemaManager
Escribir (Registrar) permitido cuando:
- TenantAdmin, NamespaceOwner o NamespaceAdmin; O
- SchemaManager y la clase de política no es
prod
Si no se proporciona una clase de política, se trata como prod (cerrar en caso de fallo para las escrituras de SchemaManager).F:crates/decision-gate-mcp/src/registry_acl.rs L218-L283
Política de ACL Personalizada
La política personalizada (schema_registry.acl.mode = custom) evalúa las reglas en orden y devuelve la primera coincidencia. Una regla coincide cuando todas las dimensiones no vacías coinciden:
- acción
- inquilino
- espacio de nombres
- sujeto (id principal)
- roles (coincidencia de rol limitado)
- clase de política
Si no hay reglas que coincidan, se aplica el efecto predeterminado (allow o deny). F:crates/decision-gate-mcp/src/registry_acl.rs L287-L339 F:crates/decision-gate-config/src/config.rs L1723-L1812
Requisito de Firma
El ACL del registro puede requerir metadatos de firma de esquema:
schema_registry.acl.require_signing = trueenforces presence ofsigningschema_registry.acl.require_signing = trueimpone la presencia de metadatos designingen los registros de esquema.- Missing or empty signing metadata is rejected as unauthorized before registry Los metadatos de firma faltantes o vacíos se rechazan como no autorizados antes de la mutación del registro. F:crates/decision-gate-config/src/config.rs L1768-L1785 F:crates/decision-gate-mcp/src/tools.rs L3032-L3041
Flujos de Decisión de Autorización
Flujo de Aplicación de Espacios de Nombres (Todas las Herramientas con Ámbito de Espacio de Nombres)
Request
-> Tool auth (DefaultToolAuthz)
-> ensure_namespace_allowed
-> default namespace guard
-> namespace authority check (optional)
-> tool execution
El guardia del espacio de nombres predeterminado se ejecuta antes de las verificaciones de autoridad para prevenir cualquier retroceso o bypass implícito.F:crates/decision-gate-mcp/src/tools.rs L2821-L2841
Flujo de ACL del Registro (schemas_register/list/get)
Request
-> Tool auth (DefaultToolAuthz)
-> ensure_namespace_allowed
-> ensure_registry_access
-> resolve principal (auth context -> profile)
-> evaluate registry ACL (builtin or custom)
-> emit registry audit event
-> validate signing metadata (optional)
-> registry mutation or read
Referencias de implementación:
- Aplicación y auditoría de ACL del registro.F:crates/decision-gate-mcp/src/tools.rs L2881-L2910
- Evaluador de ACL de registro (integrado/personalizado).F:crates/decision-gate-mcp/src/registry_acl.rs L146-L339
Auditoría y Observabilidad
DG emite registros de auditoría explícitos para decisiones de acceso al registro y cambios en la postura de seguridad:
RegistryAuditEventcaptures tenant, namespace, action, allow/deny decision, reason, principal roles, schema identity, and correlation identifiers (unsafeRegistryAuditEventcaptura inquilino, espacio de nombres, acción, decisión de permitir/denegar, razón, roles del principal, identidad del esquema y identificadores de correlación (cliente inseguro + emitido por el servidor) para la trazabilidad de auditoría. F:crates/decision-gate-mcp/src/audit.rs L112-L145SecurityAuditEventrecords dev-permissive activation (and invalid correlation rejections) along with namespace authority posture; correlation identifiers are included when the event is tied to a request.SecurityAuditEventregistra la activación permisiva para desarrolladores (y rechazos de correlación inválidos) junto con la postura de autoridad del espacio de nombres; los identificadores de correlación se incluyen cuando el evento está vinculado a una solicitud. F:crates/decision-gate-mcp/src/audit.rs L204-L223 F:crates/decision-gate-mcp/src/server.rs L1739-L1749- Runpack exports embed
RunpackSecurityContextwith dev-permissive and namespace authority metadata, making security posture verifiable offline. Runpack exportaRunpackSecurityContextcon metadatos de autoridad de espacio de nombres y permisos de desarrollo, lo que hace que la postura de seguridad sea verificable sin conexión. F:crates/decision-gate-core/src/core/runpack.rs L94-L104 F:crates/decision-gate-mcp/src/server.rs L534-L543
Almacenamiento y Persistencia
Los registros del esquema de registro incluyen metadatos de firma de extremo a extremo:
DataShapeRecordincluye campos de firma opcionales.- SQLite registry persists signing metadata in dedicated columns and migrates El registro de SQLite persiste los metadatos de firma en columnas dedicadas y migra la versión del esquema de 3 a 4 para añadir las columnas de firma.
Referencias:
- Definición del tipo de forma de datos.F:crates/decision-gate-core/src/core/data_shape.rs L49-L72
- Almacenamiento y migración de registros SQLite.F:crates/decision-gate-store-sqlite/src/store.rs L318-L480 F:crates/decision-gate-store-sqlite/src/store.rs L1013-L1037
Invariantes de Seguridad
- Fail-closed namespace enforcement: Invalid, unknown, or unreachable namespace authority always denies access. Aplicación de espacio de nombres de fallo cerrado: La autoridad de espacio de nombres inválida, desconocida o inalcanzable siempre deniega el acceso. F:crates/decision-gate-mcp/src/namespace_authority.rs L130-L158 F:crates/decision-gate-mcp/src/tools.rs L3217-L3222
- No implicit default namespace: id
1requires explicit allowlist and tenant match; otherwise denied. Sin espacio de nombres predeterminado implícito: el id1requiere una lista de permitidos explícita y coincidencia de inquilino; de lo contrario, se deniega el acceso. F:crates/decision-gate-config/src/config.rs L1025-L1052 F:crates/decision-gate-mcp/src/tools.rs L2821-L2841 - Asset Core integration is strict: Asset Core config is required when
namespace.authority.mode = assetcore_http, and dev-permissive is disallowed when using Asset Core authority. La integración de Asset Core es estricta: La configuración de Asset Core es requerida cuandonamespace.authority.mode = assetcore_http, y se desautoriza el modo dev-permissive al utilizar la autoridad de Asset Core. F:crates/decision-gate-config/src/config.rs L580-L603 F:crates/decision-gate-config/src/config.rs L1118-L1165 - Registry ACL is authoritative: Tool allowlists do not bypass registry ACL; registry access is enforced and audited for every registry action. La ACL del registro es autoritativa: Las listas de herramientas permitidas no eluden la ACL del registro; el acceso al registro se aplica y audita para cada acción del registro. F:crates/decision-gate-mcp/src/tools.rs L2881-L2910
- Local-only registry access is explicit:
schema_registry.acl.allow_local_onlydefaults tofalse. When enabled, the built-in ACL can allow loopback/stdio subjects to bypass principal mapping; this does not apply to custom ACL rules. El acceso al registro solo local es explícito:schema_registry.acl.allow_local_onlytiene como valor predeterminadofalse. Cuando está habilitado, el ACL integrado puede permitir que los sujetos de bucle invertido/stdio eviten el mapeo de principales; esto no se aplica a las reglas de ACL personalizadas. F:crates/decision-gate-config/src/config.rs L1768-L1785 F:crates/decision-gate-mcp/src/registry_acl.rs L218-L230 - Schema signing enforcement is explicit: When enabled, signing metadata is mandatory for registry writes. La aplicación de la firma del esquema es explícita: Cuando está habilitada, la firma de los metadatos es obligatoria para las escrituras en el registro. F:crates/decision-gate-mcp/src/tools.rs L3032-L3041
Pruebas y Validación
Las capas de registro y espacio de nombres deben ser validadas tanto a nivel de unidad como de sistema. La cobertura recomendada incluye:
- Mapeo de autoridad de espacio de nombres (explícito vs numérico) y comportamiento de fallo cerrado.
- Aplicación de la lista de permitidos del espacio de nombres por defecto.
- Matriz de ACL del registro incorporado (lectura/escritura por rol y clase de política).
- Precedencia de coincidencia de ACL personalizada + efectos predeterminados.
- Aplicación requerida de firma y persistencia de metadatos de firma.
Los huecos en las pruebas del sistema se rastrean en system-tests/test_gaps.toml y deben ser mantenidos junto con los cambios en estas políticas.
Referencia Cruzada Archivo por Archivo
| Área | Archivo | Notas |
|---|---|---|
| Configuración y validación de espacio de nombres | crates/decision-gate-config/src/config.rs | Política de espacio de nombres + configuración y validación de autoridad de Asset Core. |
| Aplicación de espacio de nombres y autoridad por defecto | crates/decision-gate-mcp/src/tools.rs | ensure_namespace_allowed y mapeo de errores de espacio de nombres. |
| Integración de autoridad de espacio de nombres | crates/decision-gate-mcp/src/namespace_authority.rs | Validación HTTP, reglas de mapeo, semántica de fallo cerrado. |
| Motor de ACL de registro | crates/decision-gate-mcp/src/registry_acl.rs | Mapeo de principales + evaluación de ACL incorporada/personalizada. |
| Aplicación de ACL de registro | crates/decision-gate-mcp/src/tools.rs | ensure_registry_access + emisión de auditoría + comprobaciones de firma. |
| Identificadores de principales de autenticación | crates/decision-gate-mcp/src/auth.rs | IDs de principales estables para mapeo de ACL. |
| Esquemas de eventos de auditoría | crates/decision-gate-mcp/src/audit.rs | Cargas útiles de auditoría de registro + seguridad. |
| Contexto de seguridad de Runpack | crates/decision-gate-core/src/core/runpack.rs | Metadatos de seguridad incrustados en runpacks. |
| Persistencia del registro de esquemas | crates/decision-gate-store-sqlite/src/store.rs | Columnas de metadatos de firma y migraciones. |