Puerta de Decisión Authn/Authz + Arquitectura de Divulgación
Audience: Engineers implementing or reviewing MCP authentication, Audiencia: Ingenieros que implementan o revisan el comportamiento de autenticación, autorización y divulgación de errores de MCP.
Tabla de Contenidos
- Resumen Ejecutivo
- Contexto de Solicitud e Identidad
- Modos de Autenticación
- Autorización de Herramientas (Lista de Permisos)
- Autorización de Inquilino (Conectable)
- Medición de Uso y Cuotas (Conectable)
- Eventos de Auditoría de Autenticación
- Postura de Divulgación (JSON-RPC + HTTP)
- Limitación de tasa y respuestas de sobrecarga
- Referencia Cruzada Archivo por Archivo
Resumen Ejecutivo
La puerta de decisión MCP aplica una autenticación y autorización estrictas y de cierre por fallo para las llamadas a herramientas. La autenticación es consciente del transporte (stdio, HTTP, SSE) y se configura a través de server.auth. La autorización se aplica por cada llamada a la herramienta mediante DefaultToolAuthz, con listas de permitidos opcionales para herramientas. Una capa de autorización de inquilinos separada y conectable puede hacer cumplir el alcance de inquilinos/espacios de nombres antes de la ejecución de la herramienta. Las decisiones de autenticación emiten eventos de auditoría estructurados, y los fallos de solicitud se mapean a códigos de error JSON-RPC estables y códigos de estado HTTP para una divulgación determinista y etiquetado de métricas. F:crates/decision-gate-mcp/src/auth.rs L293-L372 F:crates/decision-gate-mcp/src/tools.rs L1436-L1454 F:crates/decision-gate-mcp/src/tools.rs L2857-L2878 F:crates/decision-gate-mcp/src/server.rs L1984-L2017
Contexto de Solicitud e Identidad
Contexto de la Solicitud
Las solicitudes entrantes se normalizan en un RequestContext que registra el transporte, la IP del par, el encabezado de autenticación, el sujeto del cliente y un identificador de solicitud opcional más metadatos de correlación. Para los transportes HTTP/SSE, el contexto se construye a partir del encabezado Authorization y el encabezado x-decision-gate-client-subject para la identidad del proxy mTLS. Los identificadores de correlación proporcionados por el cliente llegan a través de x-correlation-id y se tratan como entrada no segura: se validan estrictamente y se rechazan si son inválidos. El servidor siempre emite su propio x-server-correlation-id y lo devuelve en las respuestas, proporcionando un identificador estable y auditable incluso cuando los ID de cliente faltan o son rechazados. F:crates/decision-gate-mcp/src/auth.rs L82-L173 F:crates/decision-gate-mcp/src/server.rs L993-L1072 F:crates/decision-gate-mcp/src/server.rs L1648-L1734
Identidad Principal
AuthContext captura el método de autenticación más un sujeto explícito o una huella digital de token portador. Si una solicitud solo local no tiene sujeto, el sujeto se establece en stdio o loopback según el transporte. Para los tokens portadores, se calcula una huella digital sha256 y se utiliza como una etiqueta de identidad estable. F:crates/decision-gate-mcp/src/auth.rs L181-L216 F:crates/decision-gate-mcp/src/auth.rs L503-L517
Modos de Autenticación
El modo de autenticación se configura a través de server.auth.mode con listas de permitidos de apoyo:
local_only: se permite stdio; HTTP/SSE solo se permiten para IPs de loopback.bearer_token: el token portador debe coincidir conserver.auth.bearer_tokens.mtls: subject must be present inx-decision-gate-client-subjectand matchmtls: el sujeto debe estar presente enx-decision-gate-client-subjecty coincidir conserver.auth.mtls_subjectscuando esté configurado.
Superficie de configuración:
server.auth.mode,bearer_tokens,mtls_subjects,allowed_tools.server.auth.mode,bearer_tokens,mtls_subjects,allowed_tools. F:crates/decision-gate-config/src/config.rs L789-L937
Detalles de implementación:
- Local-only rechaza HTTP/SSE no loopback.
- Bearer tokens are parsed with size and scheme validation; invalid/missing Los tokens de portador se analizan con validación de tamaño y esquema; los encabezados inválidos/faltantes fallan en la autenticación.
- mTLS requires a subject; unauthorized subjects are rejected. mTLS requiere un sujeto; los sujetos no autorizados son rechazados. F:crates/decision-gate-mcp/src/auth.rs L479-L552
Autorización de Herramientas (Lista Permitida)
La autorización de herramientas se aplica por solicitud mediante DefaultToolAuthz. Si server.auth.allowed_tools está configurado, cualquier herramienta que no esté en la lista de permitidos es rechazada con un error de no autorizado. Los nombres de herramientas inválidos en la lista de permitidos se tratan como una configuración de fallo cerrado (lista de permitidos vacía). F:crates/decision-gate-mcp/src/auth.rs L293-L372
Los resultados de autorización de herramientas son emitidos por el enrutador de herramientas:
AuthAuditEvent::alloweden caso de éxitoAuthAuditEvent::deniedon failureAuthAuditEvent::denieden caso de fallo F:crates/decision-gate-mcp/src/tools.rs L3131-L3144 F:crates/decision-gate-mcp/src/auth.rs L379-L445
Autorización de Inquilino (Conectable)
La autorización de inquilinos/nombres de espacio se aplica mediante un gancho TenantAuthorizer intercambiable. La implementación predeterminada permite todo el acceso, pero las implementaciones empresariales pueden proporcionar un autorizador que vincula a los principales con los ámbitos de inquilino y nombre de espacio. La autorización de inquilinos se ejecuta después de las verificaciones de lista blanca de herramientas y antes de la ejecución de la herramienta. Las denegaciones de inquilinos emiten eventos de auditoría dedicados (tenant_authz).
Referencias de implementación:
- Interfaz de autorización de inquilinos: F:crates/decision-gate-mcp/src/tenant_authz.rs L29-L65
- Aplicación y auditoría de emisión: F:crates/decision-gate-mcp/src/tools.rs L2857-L2935
Medición de Uso y Cuotas (Conectable)
El control de uso y las verificaciones de cuotas son aplicados por un gancho UsageMeter intercambiable. La implementación predeterminada es una operación nula, pero las implementaciones empresariales pueden proporcionar un medidor que imponga cuotas y registre el uso de nivel de facturación. Las verificaciones de uso se ejecutan antes de la ejecución de la herramienta; las denegaciones emiten eventos usage_audit.
Referencias de implementación:
- Interfaz de medición de uso: F:crates/decision-gate-mcp/src/usage.rs L28-L105
- Emisión de auditoría y cumplimiento: F:crates/decision-gate-mcp/src/tools.rs L2937-L2999
Eventos de Auditoría de Autenticación
Las decisiones de autenticación emiten eventos de auditoría JSON estructurados con detalles de transporte, sujeto, método y razón de fallo. El sumidero de auditoría predeterminado registra líneas JSON en stderr; las pruebas pueden utilizar un sumidero sin operación. F:crates/decision-gate-mcp/src/auth.rs L379-L445
Postura de Divulgación (JSON-RPC + HTTP)
Divulgación de Comentarios (scenario_next)
Las respuestas de scenario_next son solo un resumen por defecto. Los niveles de retroalimentación opcionales (trace, evidence) están regulados por la política server.feedback.scenario_next, con verificaciones de rol/sujeto resueltas a partir de server.auth.principals. La retroalimentación de evidencia aún se filtra a través de la política de divulgación de evidencia (los valores en bruto pueden ser redactados a menos que se permita explícitamente). F:crates/decision-gate-config/src/config.rs L452-L545 F:crates/decision-gate-mcp/src/tools.rs L2144-L2257
JSON-RPC Error Envelope
El servidor MCP responde utilizando códigos de error JSON-RPC y metadatos estructurados (kind, retryable, request_id, retry_after_ms opcional). Los tipos de error son etiquetas estables utilizadas para métricas y categorización de auditoría. F:crates/decision-gate-mcp/src/server.rs L1961-L2043
Mapeo de Errores (Errores de Herramienta)
Los errores de la herramienta se mapean a códigos de estado HTTP + códigos de error JSON-RPC:
| ToolError | HTTP | JSON-RPC Code | Message |
|---|---|---|---|
| No autenticado | 401 | -32001 | no autenticado |
| No autorizado | 403 | -32003 | no autorizado |
| Parámetros inválidos | 400 | -32602 | mensaje proporcionado |
| Violación de capacidad | 400 | -32602 | code: message |
| Herramienta desconocida | 400 | -32601 | herramienta desconocida |
| Respuesta demasiado grande | 200 | -32070 | mensaje proporcionado |
| Límite de tasa | 200 | -32071 | mensaje proporcionado |
| No encontrado | 200 | -32004 | mensaje proporcionado |
| Conflicto | 200 | -32009 | mensaje proporcionado |
| Evidencia | 200 | -32020 | mensaje proporcionado |
| Plano de control | 200 | -32030 | mensaje proporcionado |
| Ejecutar paquete | 200 | -32040 | mensaje proporcionado |
| Interno | 200 | -32050 | mensaje proporcionado |
| Serialización | 200 | -32060 | la serialización falló |
Estos mapeos están implementados en jsonrpc_error. F:crates/decision-gate-mcp/src/server.rs L1984-L2015
Encabezado de Desafío de Autenticación (RFC 6750)
Las respuestas HTTP/SSE para solicitudes no autenticadas incluyen un encabezado WWW-Authenticate con un ámbito Bearer cuando la autenticación con token Bearer está habilitada. Esto se alinea con la RFC 6750 y mantiene los desafíos de autenticación explícitos sin filtrar detalles de validación del token. F:crates/decision-gate-mcp/src/auth.rs L46-L75 F:crates/decision-gate-mcp/src/server.rs L1706-L1718
Encabezados de Correlación
Las respuestas HTTP/SSE siempre incluyen un x-server-correlation-id emitido por el servidor. Si el cliente proporciona un x-correlation-id válido, se devuelve. Los IDs de correlación de cliente inválidos son rechazados antes del análisis de la solicitud y no se devuelven. El rechazo de correlación inválida utiliza HTTP 400 con el código de error JSON-RPC -32073 (invalid_correlation_id). F:crates/decision-gate-mcp/src/server.rs L993-L1072 F:crates/decision-gate-mcp/src/server.rs L1648-L1749
Fallos en el Análisis de Solicitudes
Las versiones de JSON-RPC no válidas, los métodos desconocidos y los cuerpos de solicitud mal formados son rechazados con códigos de error estándar de JSON-RPC y HTTP 400. F:crates/decision-gate-mcp/src/server.rs L1505-L1583
Limitación de tasa y respuestas de sobrecarga
El servidor impone:
- Límites de solicitudes en vuelo (rechazar con 503 y
-32072). - Limitación de tasa (rechazar con 429 y
-32071, incluyendo sugerencias de reintento). - Límites de tamaño de carga útil (rechazar con 413 y
-32070).
Estos fallos se informan con metadatos de error JSON-RPC estructurados y se marcan como reintentables cuando es apropiado. F:crates/decision-gate-mcp/src/server.rs L1505-L1568 F:crates/decision-gate-mcp/src/server.rs L2051-L2053
Referencia Cruzada Archivo por Archivo
| Área | Archivo | Notas |
|---|---|---|
| Superficie de configuración de autenticación | crates/decision-gate-config/src/config.rs | Modos de autenticación, listas de permitidos de token/sujeto, lista de permitidos de herramientas. |
| Motor de políticas de autenticación | crates/decision-gate-mcp/src/auth.rs | DefaultToolAuthz, modos de autenticación, eventos de auditoría, análisis de tokens. |
| Integración de autenticación de herramientas | crates/decision-gate-mcp/src/tools.rs | Autorización por llamada + emisión de auditoría. |
| Interfaz de autorización de inquilinos | crates/decision-gate-mcp/src/tenant_authz.rs | Costura de autorización de inquilinos/nombres de espacio intercambiable. |
| Interfaz de medición de uso | crates/decision-gate-mcp/src/usage.rs | Costura de medición de uso intercambiable + aplicación de cuotas. |
| Divulgación de JSON-RPC | crates/decision-gate-mcp/src/server.rs | Mapeo de errores y códigos de respuesta. |