<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Atestacion on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/atestacion/</link><description>Recent content in Atestacion on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sun, 26 Jul 2026 17:00:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/atestacion/index.xml" rel="self" type="application/rss+xml"/><item><title>Cadena de confianza del modelo (4/4): quién sirve el modelo y en qué máquina confías</title><link>https://blog.lo0.es/posts/identidad-aislamiento-spiffe-confidential-containers/</link><pubDate>Sun, 26 Jul 2026 17:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/identidad-aislamiento-spiffe-confidential-containers/</guid><description>&lt;p>Los tres artículos anteriores han cerrado preguntas sobre el artefacto: qué contrato expone el modelo servido, de dónde salen sus bytes y por qué te fías de ellos. Queda la que casi nadie se hace hasta que la formula un auditor: &lt;strong>el proceso que ahora mismo devuelve tokens por el puerto 8000, ¿es de verdad el motor de inferencia, o es algo que se ha colado en el clúster y ha heredado su token?&lt;/strong> Y una segunda, peor: &lt;strong>la máquina en la que corre, ¿es de fiar, y frente a quién?&lt;/strong>&lt;/p>
&lt;p>Son problemas distintos con proyectos distintos. La &lt;strong>identidad de carga&lt;/strong> la resuelve SPIFFE/SPIRE, graduado en la CNCF desde 2022. El &lt;strong>aislamiento del entorno&lt;/strong> lo recorren Kata Containers y Confidential Containers, promovido este último a &lt;em>incubating&lt;/em> de la CNCF el 22 de julio de 2026, cuatro días antes de publicarse este artículo. Lo primero es barato y casi siempre rentable; lo segundo es caro —más de lo que sugiere la nota de prensa del fabricante— y solo se justifica ante un modelo de amenaza concreto.&lt;/p>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Identidad de usuario ≠ identidad de carga.&lt;/strong> OIDC dice qué persona hay detrás de una petición; no dice qué proceso la atiende. Tokens de &lt;code>ServiceAccount&lt;/code>, claves estáticas y API keys del gateway son credenciales &lt;em>portador&lt;/em>: quien las tiene, las es.&lt;/li>
&lt;li>&lt;strong>SPIFFE&lt;/strong> define un identificador URI (&lt;code>spiffe://dominio/ruta&lt;/code>) y un documento verificable (&lt;strong>SVID&lt;/strong>, X.509 o JWT) entregado por una &lt;strong>Workload API&lt;/strong> que no exige que la carga posea secreto previo alguno. &lt;strong>SPIRE&lt;/strong> lo implementa con atestación de nodo y de carga; defaults: &lt;code>default_x509_svid_ttl&lt;/code> 1 h, &lt;code>default_jwt_svid_ttl&lt;/code> 5 min, &lt;code>ca_ttl&lt;/code> 24 h.&lt;/li>
&lt;li>La identidad solo vale si algo la &lt;strong>aplica&lt;/strong>: Istio/Envoy vía SDS, Cilium con autenticación mutua (con reservas serias) o un &lt;code>ext_authz&lt;/code> con OPA delante del gateway.&lt;/li>
&lt;li>&lt;strong>Tres peldaños de aislamiento&lt;/strong>: contenedor con kernel compartido → &lt;strong>Kata Containers&lt;/strong> (kernel y VM propios; v3.32.0 de junio de 2026) → &lt;strong>Confidential Containers&lt;/strong> (TEE de hardware, hipervisor fuera de la base de confianza, atestación remota con Trustee según RFC 9334).&lt;/li>
&lt;li>&lt;strong>El sobrecoste del modo confidencial va del ~0 % al ~28 %&lt;/strong> según qué se mida: solo GPU en CC con lotes grandes ronda el 4-8 %, mientras que el stack completo (CVM con Intel TDX más H100 en CC), medido de forma independiente en 2026, da &lt;strong>+21,8 % a +27,8 % de TTFT y −17,7 % a −21,1 % de throughput&lt;/strong>. Heurística honesta: &lt;strong>reservar un 15-25 % de capacidad extra&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>MIG y vGPU están prohibidos en modo CC&lt;/strong> según la arquitectura de referencia de NVIDIA, y todas las GPU de un nodo van en el mismo modo.&lt;/li>
&lt;li>&lt;strong>Criterio de cierre&lt;/strong>: el orden es contrato → digest → firma verificada en admisión → identidad de carga → TEE.&lt;/li>
&lt;/ul>
&lt;h2 id="la-analogía-el-laboratorio-de-bioseguridad">La analogía: el laboratorio de bioseguridad&lt;/h2>
&lt;p>Un laboratorio que manipula patógenos resuelve dos problemas parecidos a los nuestros, por separado.&lt;/p>
&lt;p>El primero es &lt;strong>quién entra&lt;/strong>. No basta la tarjeta de la empresa: en la esclusa hay una acreditación específica, de vigencia corta y renovación automática —si se pierde, caduca sola en una hora—, y no se entrega a quien la pida, sino tras comprobar de forma independiente que el solicitante está donde dice y es quien dice. Esa acreditación es el &lt;strong>SVID&lt;/strong>; la comprobación previa, la &lt;strong>atestación&lt;/strong>.&lt;/p>
&lt;p>El segundo es &lt;strong>en qué sala se trabaja&lt;/strong>, y aquí hay niveles de contención. En la poyata abierta el aire es común y lo que se aerosoliza afecta a todos: el contenedor normal, con un kernel compartido por todos los vecinos. Un peldaño arriba, la &lt;strong>cabina de seguridad biológica&lt;/strong>, con barrera física y flujo de aire propio: Kata Containers. Arriba del todo, el &lt;strong>laboratorio de máxima contención&lt;/strong>, donde el personal de mantenimiento cambia filtros sin ver jamás la muestra: el TEE, donde el operador mantiene la máquina pero no puede leer la memoria. Y antes de abrir la esclusa alguien verifica que la integridad del traje y de la sala es la esperada: la atestación remota con liberación condicionada de secretos.&lt;/p>
&lt;p>La lección incómoda: &lt;strong>el nivel máximo de contención no es &amp;ldquo;más seguridad&amp;rdquo;, es una decisión de coste&lt;/strong>. Nadie monta un BSL-4 para cultivar levadura. La pregunta no es cuánto aísla, sino de quién.&lt;/p>
&lt;h2 id="parte-a--identidad-de-carga">Parte A — Identidad de carga&lt;/h2>
&lt;h3 id="el-problema-seis-servicios-que-se-hablan-y-ninguno-sabe-quién-es-el-otro">El problema: seis servicios que se hablan y ninguno sabe quién es el otro&lt;/h3>
&lt;p>En un clúster de inferencia serio, como el de &lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">siete capas&lt;/a>, el gateway habla con el motor de serving, el motor consulta la base vectorial, el recolector de trazas recibe &lt;em>spans&lt;/em> de todos y los agentes con MCP invocan herramientas que a su vez llaman al gateway. Muchas conexiones este-oeste y, en la mayoría de despliegues, &lt;strong>ninguna autenticada de verdad&lt;/strong>.&lt;/p>
&lt;p>La &lt;strong>identidad de usuario&lt;/strong> dice qué persona hay detrás de la petición y se resuelve con OIDC, como al &lt;a href="https://blog.lo0.es/posts/mcp-crece-autenticacion-keycloak/">poner Keycloak delante de MCP&lt;/a>. La &lt;strong>identidad de carga&lt;/strong> dice qué &lt;strong>proceso&lt;/strong> la emite: no hay humano al otro lado, ni navegador, ni consentimiento, y el proceso nace y muere en segundos. Sus tres sustitutos habituales fallan por razones distintas:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mecanismo&lt;/th>
&lt;th>Dónde falla&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Token de &lt;code>ServiceAccount&lt;/code> proyectado&lt;/td>
&lt;td>Granularidad de SA, no de carga: dos pods con el mismo SA son indistinguibles. No cruza el borde del clúster ni federa. Es un &lt;em>bearer token&lt;/em> en el sistema de ficheros&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Clave estática&lt;/td>
&lt;td>No rota, se comparte por Slack, no distingue emisor de portador; filtrada, vale hasta que alguien lo note&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>API key del gateway&lt;/td>
&lt;td>Autentica al &lt;em>cliente&lt;/em>, no al proceso. Las claves virtuales de LiteLLM sirven para cuota y presupuesto, no para probar identidad&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>No hay vínculo criptográfico entre credencial y proceso: copiada la credencial, copiada la identidad. En un clúster multi-tenant como el del &lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">clúster H100&lt;/a>, el aislamiento real depende entonces de la topología de red y no de la identidad.&lt;/p>
&lt;h3 id="spiffe-el-estándar">SPIFFE: el estándar&lt;/h3>
&lt;p>&lt;a href="https://spiffe.io/docs/latest/spiffe-about/spiffe-concepts/">SPIFFE&lt;/a> y su implementación &lt;a href="https://github.com/spiffe/spire">SPIRE&lt;/a> &lt;strong>graduaron juntos en la CNCF el 20 de septiembre de 2022&lt;/strong>. A julio de 2026 son infraestructura asentada, no una apuesta.&lt;/p>
&lt;p>&lt;strong>El SPIFFE ID&lt;/strong> es una URI de la forma &lt;code>spiffe://&amp;lt;trust-domain&amp;gt;/&amp;lt;workload-identifier&amp;gt;&lt;/code>, por ejemplo &lt;code>spiffe://inferencia.example/ns/inferencia/sa/vllm&lt;/code>: un nombre, no una credencial. &lt;strong>El trust domain&lt;/strong> es la raíz de confianza —organización, entorno o sede—, y la guía recomienda separar en dominios distintos las cargas de emplazamientos o entornos de seguridad diferentes.&lt;/p>
&lt;p>&lt;strong>El SVID&lt;/strong> es la credencial que prueba ese ID. El &lt;strong>X509-SVID&lt;/strong> lleva el SPIFFE ID en el SAN de tipo URI —no en el &lt;code>CN&lt;/code>, que la especificación desaconseja como fuente de identidad— y es el formato preferente. El &lt;strong>JWT-SVID&lt;/strong> existe para cuando hay proxies L7 que terminan TLS en medio, con el riesgo de repetición que la documentación advierte:&lt;/p>
&lt;pre tabindex="0">&lt;code>Certificate:
Issuer: C=ES, O=SPIFFE
Validity
Not Before: Jul 26 08:00:00 2026 GMT
Not After : Jul 26 09:00:00 2026 GMT
Subject: C=ES, O=SPIRE, CN=vllm.inferencia
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Alternative Name:
URI:spiffe://inferencia.example/ns/inferencia/sa/vllm
&lt;/code>&lt;/pre>&lt;p>Una hora de validez, y lo que autentica es el SAN URI: el &lt;code>CN&lt;/code> es decorativo.&lt;/p>
&lt;p>&lt;strong>La Workload API&lt;/strong> es la pieza elegante: un socket UNIX local del que la carga obtiene su SVID, su clave privada y el paquete de confianza, &lt;strong>sin presentar ningún secreto&lt;/strong>. La documentación es explícita: &amp;ldquo;la Workload API no exige que la carga que la invoca tenga ningún conocimiento de su propia identidad ni posea ningún token de autenticación&amp;rdquo;. Eso resuelve el arranque en frío de toda la criptografía de identidad: el secreto que necesitarías para obtener el primer secreto.&lt;/p>
&lt;h3 id="spire-cómo-se-emite-ese-documento">SPIRE: cómo se emite ese documento&lt;/h3>
&lt;p>SPIRE tiene un &lt;strong>servidor&lt;/strong> (la autoridad que firma) y un &lt;strong>agente&lt;/strong> por nodo (que expone la Workload API), y encadena dos comprobaciones.&lt;/p>
&lt;p>La &lt;strong>atestación de nodo&lt;/strong> verifica que el agente corre donde dice. En Kubernetes el atestador de referencia es &lt;code>k8s_psat&lt;/code>, que valida contra el API server un token proyectado con audiencia; en bare metal hay atestadores basados en TPM. Nota de honestidad: &lt;strong>SPIRE v1.15.1, del 28 de mayo de 2026, es un parche de seguridad&lt;/strong> sobre una validación incorrecta de PKCS7 en el atestador &lt;code>azure_imds&lt;/code> que permitía falsificar documentos atestados y suplantar una máquina virtual.&lt;/p>
&lt;p>La &lt;strong>atestación de carga&lt;/strong> responde a nuestra pregunta inicial. El &lt;a href="https://github.com/spiffe/spire/blob/main/doc/plugin_agent_workloadattestor_k8s.md">atestador &lt;code>k8s&lt;/code>&lt;/a> recibe el PID del proceso que abre el socket, deduce el pod por su pertenencia a cgroups y consulta al &lt;strong>kubelet&lt;/strong> los metadatos. De ahí salen los &lt;strong>selectores&lt;/strong>: namespace, service account, nombre y UID de pod, etiquetas, propietario, nodo y —crítico— &lt;strong>contenedor e imagen por tag o por digest&lt;/strong>. Desde SPIRE v1.15.0 (19 de mayo de 2026) el soporte de &lt;strong>Sigstore dejó de ser experimental&lt;/strong>, habilitando selectores por estado de verificación de firma, sujeto y emisor del certificado y registro de transparencia. Eso cierra el círculo de la serie: se puede exigir que &lt;strong>solo el contenedor cuya imagen tiene firma cosign válida del emisor esperado&lt;/strong> —lo verificado en el &lt;a href="https://blog.lo0.es/posts/firma-procedencia-aibom-cadena-suministro-modelo/">artículo 3/4&lt;/a>— reciba el SVID del motor. La procedencia pasa de comprobación de admisión única a precondición de la identidad en ejecución.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">spire-server entry create &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -parentID spiffe://inferencia.example/spire/agent/k8s_psat/prod/nodo-gpu-a &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -spiffeID spiffe://inferencia.example/ns/inferencia/sa/vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -selector k8s:ns:inferencia &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -selector k8s:sa:vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -selector k8s:container-name:vllm &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -selector k8s:container-image:vllm/vllm-openai@sha256:aa11bb22cc33 &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -x509SVIDTTL &lt;span class="m">3600&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -federatesWith spiffe://sede-b.example
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Los selectores son &lt;strong>conjuntivos&lt;/strong>: un pod en otro namespace, con otro SA o con otra imagen no obtiene ese SVID aunque comparta nodo.&lt;/p>
&lt;p>Los TTL por defecto tienen tres consecuencias. &lt;strong>La rotación es continua, no un evento&lt;/strong>: el código que carga el certificado una vez al arrancar se romperá exactamente una hora después. &lt;strong>La caída del servidor tiene reloj&lt;/strong>: veinte minutos son invisibles, dos horas tumban las comunicaciones autenticadas del clúster, y la &lt;a href="https://spiffe.io/docs/latest/planning/scaling_spire/">guía de escalado&lt;/a> admite que &amp;ldquo;una única instancia de servidor SPIRE representa un punto único de fallo&amp;rdquo;, con el almacén de datos como cuello de botella y cifras orientativas que van de dos réplicas de 1 CPU y 1 GB para 10 agentes a ocho de 16 CPU y 16 GB para 5000 agentes y 10 000 cargas. Y &lt;strong>los selectores por tag son frágiles&lt;/strong>: el runtime puede reportar un tag u otro según el nodo y el momento, así que &lt;strong>usar digest&lt;/strong>, como en el &lt;a href="https://blog.lo0.es/posts/registro-distribucion-modelos-oci-oras/">artículo 2/4&lt;/a>.&lt;/p>
&lt;h3 id="federación-entre-trust-domains">Federación entre trust domains&lt;/h3>
&lt;p>Dos sedes con clústeres independientes, o un socio externo que expone un &lt;em>reranker&lt;/em>, no deben compartir autoridad. La &lt;a href="https://spiffe.io/docs/latest/spiffe-specs/spiffe_federation/">federación SPIFFE&lt;/a> hace que cada dominio publique un &lt;strong>bundle endpoint&lt;/strong> con su material público de confianza y que el otro lo consulte periódicamente: el perfil &lt;code>https_web&lt;/code> lo autentica con PKI web y &lt;code>https_spiffe&lt;/code> con un X509-SVID del propio dominio, habilitando rotación y revocación automáticas de la raíz. La relación es &lt;strong>unidireccional&lt;/strong>, los paquetes de dominios distintos &lt;strong>no deben fusionarse nunca&lt;/strong> y el refresco es por sondeo con sugerencia por defecto de cinco minutos. En la práctica: el gateway de la sede A acepta peticiones del motor de la sede B &lt;strong>sin compartir CA ni base de identidades&lt;/strong>, y cortar la relación es borrar un paquete, no revocar certificados.&lt;/p>
&lt;h3 id="de-identidad-a-autorización-efectiva">De identidad a autorización efectiva&lt;/h3>
&lt;p>Un SVID no bloquea nada por sí solo; alguien tiene que comparar el ID presentado contra una política.&lt;/p>
&lt;p>&lt;strong>Istio + SPIRE&lt;/strong> es la integración más rodada: Istio detecta un socket UNIX que implementa la API SDS de Envoy y el proxy obtiene de ahí sus identidades en lugar de de &lt;code>istiod&lt;/code>, montado con el &lt;strong>SPIFFE CSI Driver&lt;/strong> (recomendado sobre &lt;code>hostMount&lt;/code>). Dos condiciones rompen despliegues: &lt;strong>el trust domain de SPIRE y el de Istio deben coincidir exactamente&lt;/strong>, y &lt;strong>SPIRE solo emite a cargas registradas previamente&lt;/strong>, incluidos los componentes de Istio. Con eso, la política se escribe en identidad y no en IP:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">security.istio.io/v1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AuthorizationPolicy&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm-solo-desde-gateway&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inferencia&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">selector&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">matchLabels&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">app&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ALLOW&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">source&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">principals&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;inferencia.example/ns/inferencia/sa/gateway&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">to&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">operation&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">methods&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">paths&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;/v1/chat/completions&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;/v1/completions&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Es una capa sobre la &lt;code>NetworkPolicy&lt;/code> de &lt;a href="https://blog.lo0.es/posts/hardening-secretos-stack-llm-soberano/">hardening por capas&lt;/a>: allí cerrábamos pares de comunicación por topología; aquí exigimos además &lt;strong>quién&lt;/strong> llama y &lt;strong>a qué ruta&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cilium&lt;/strong> ofrece autenticación mutua apoyada en SPIRE, tentadora si ya se usa eBPF para la &lt;a href="https://blog.lo0.es/posts/ebpf-cilium-tcp-ip-bypass/">red de datos&lt;/a>. Toca ser crítico: sigue marcada como &lt;strong>beta&lt;/strong> en la documentación estable, y The New Stack publicó una crítica argumentada de que el diseño no preserva las propiedades de mTLS durante la vida de la conexión —usa el &lt;em>handshake&lt;/em> solo para autenticar y descarta las claves de sesión— y de que el modelo de identidad se apoya en cachés IP-identidad &lt;strong>eventualmente consistentes&lt;/strong> por nodo, lo que puede permitir tráfico que la política debería denegar.&lt;/p>
&lt;p>&lt;strong>El gateway de inferencia y LiteLLM&lt;/strong> no hablan SPIFFE de forma nativa a fecha de este artículo, y conviene decirlo en lugar de sugerir una integración inexistente. El patrón que sí funciona es el que documenta el propio proyecto: un Envoy delante que termina mTLS con X509-SVID o valida un JWT-SVID y delega en &lt;strong>OPA vía &lt;code>ext_authz&lt;/code>&lt;/strong>. El gateway sigue con lo suyo —cuota, presupuesto, enrutado, como vimos al &lt;a href="https://blog.lo0.es/posts/elegir-gateway-oss-inferencia-llm/">elegir gateway OSS&lt;/a> y en el &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">router L7&lt;/a>— y la identidad de carga se resuelve un salto antes.&lt;/p>
&lt;h3 id="agentes-de-ia-y-mcp-la-pieza-que-faltaba">Agentes de IA y MCP: la pieza que faltaba&lt;/h3>
&lt;p>Un agente que invoca herramientas por MCP es &lt;strong>un secreto compartido con patas&lt;/strong>: se le entrega una credencial estática, el servidor MCP no puede saber si quien llama es el agente legítimo o cualquier proceso con la misma cadena, y el radio de impacto es el conjunto entero de herramientas expuestas. El &lt;a href="https://blog.lo0.es/posts/aislar-agentes-ia-cliente-cluster/">modelo de amenaza del aislamiento de agentes&lt;/a> advertía de que un permiso concedido es un permiso usable; con credenciales portador es además &lt;strong>transferible&lt;/strong>.&lt;/p>
&lt;p>SPIFFE aporta lo que falta: el agente presenta un SVID de vida corta obtenido por atestación y el servidor MCP autoriza contra el SPIFFE ID. En 2026 ha dejado de ser teoría —hay trabajo en el IETF sobre registro dinámico de cliente OAuth basado en emisores de confianza SPIFFE, y Google publicó en junio de 2026 una &lt;em>Agent Identity&lt;/em> basada en SPIFFE en su IAM—, aunque nada está estandarizado del todo.&lt;/p>
&lt;p>Dos honestidades. &lt;strong>SPIFFE responde &amp;ldquo;quién&amp;rdquo;, no &amp;ldquo;por qué&amp;rdquo;&lt;/strong>: para saber si la acción es la que el usuario pidió hacen falta trazabilidad (&lt;a href="https://blog.lo0.es/posts/mcp-observability-otel/">MCP con OTel&lt;/a>) y detección en ejecución con &lt;a href="https://blog.lo0.es/posts/tetragon-runtime-security/">Tetragon&lt;/a>. Y ambas identidades deben &lt;strong>componerse&lt;/strong>: el agente prueba la suya con un SVID y &lt;strong>propaga&lt;/strong> la del usuario delegante en el token, autorizando sobre el par. Colapsarlas en una es cómo se acaba con agentes capaces de hacer, en nombre del sistema, cosas que ningún usuario podría.&lt;/p>
&lt;h2 id="parte-b--aislamiento-del-entorno-de-ejecución">Parte B — Aislamiento del entorno de ejecución&lt;/h2>
&lt;div class="diagram" style="max-width:820px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 820 300" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Tres peldaños de aislamiento: contenedor con kernel compartido, sandbox de máquina virtual con Kata Containers, y entorno de ejecución confiable con Confidential Containers, indicando qué componentes quedan dentro de la base de cómputo de confianza en cada caso">
&lt;text x="410" y="22" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="700" fill="currentColor">Qué queda DENTRO de la base de cómputo de confianza (TCB)&lt;/text>
&lt;rect x="20" y="44" width="240" height="200" rx="10" fill="none" stroke="currentColor" stroke-width="1.6"/>
&lt;text x="140" y="68" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="700" fill="currentColor">1. Contenedor (runc)&lt;/text>
&lt;text x="140" y="92" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">namespaces + cgroups + seccomp&lt;/text>
&lt;line x1="40" y1="106" x2="240" y2="106" stroke="currentColor" stroke-width="1"/>
&lt;text x="140" y="126" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">kernel del host (compartido)&lt;/text>
&lt;text x="140" y="146" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">runtime de contenedor&lt;/text>
&lt;text x="140" y="166" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">hipervisor / firmware&lt;/text>
&lt;text x="140" y="186" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">operador de la plataforma&lt;/text>
&lt;text x="140" y="216" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">arranque: ~1-6 s&lt;/text>
&lt;text x="140" y="234" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">coste: cero&lt;/text>
&lt;rect x="290" y="44" width="240" height="200" rx="10" fill="none" stroke="currentColor" stroke-width="1.6"/>
&lt;text x="410" y="68" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="700" fill="currentColor">2. Kata Containers&lt;/text>
&lt;text x="410" y="92" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">kernel propio + VM ligera&lt;/text>
&lt;line x1="310" y1="106" x2="510" y2="106" stroke="currentColor" stroke-width="1"/>
&lt;text x="410" y="126" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">kernel del host: FUERA&lt;/text>
&lt;text x="410" y="146" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">runtime de contenedor: FUERA&lt;/text>
&lt;text x="410" y="166" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">hipervisor / firmware: dentro&lt;/text>
&lt;text x="410" y="186" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">operador de la plataforma: dentro&lt;/text>
&lt;text x="410" y="216" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">arranque: +1-2 s sobre runc&lt;/text>
&lt;text x="410" y="234" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">coste: memoria de la VM&lt;/text>
&lt;rect x="560" y="44" width="240" height="200" rx="10" fill="none" stroke="currentColor" stroke-width="2.2"/>
&lt;text x="680" y="68" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="700" fill="currentColor">3. Confidential Containers&lt;/text>
&lt;text x="680" y="92" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">TEE (SEV-SNP / TDX) + GPU en CC&lt;/text>
&lt;line x1="580" y1="106" x2="780" y2="106" stroke="currentColor" stroke-width="1"/>
&lt;text x="680" y="126" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">kernel del host: FUERA&lt;/text>
&lt;text x="680" y="146" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">hipervisor: FUERA&lt;/text>
&lt;text x="680" y="166" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">operador de la plataforma: FUERA&lt;/text>
&lt;text x="680" y="186" text-anchor="middle" font-family="sans-serif" font-size="10.5" fill="currentColor">CPU/GPU y su firmware: dentro&lt;/text>
&lt;text x="680" y="216" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">arranque: +10 s o más&lt;/text>
&lt;text x="680" y="234" text-anchor="middle" font-family="sans-serif" font-size="10.5" font-style="italic" fill="currentColor">coste: 0-25 % de rendimiento&lt;/text>
&lt;text x="410" y="272" text-anchor="middle" font-family="sans-serif" font-size="11" fill="currentColor">Cada peldaño saca componentes de la TCB. Lo que sale de la TCB deja de poder leerte la memoria.&lt;/text>
&lt;text x="410" y="290" text-anchor="middle" font-family="sans-serif" font-size="11" font-style="italic" fill="currentColor">La pregunta correcta no es "cuánto aísla", sino "de quién".&lt;/text>
&lt;/svg>
&lt;/div>
### Kata Containers: el sandbox de máquina virtual
&lt;p>Kata sustituye &lt;code>runc&lt;/code> por un runtime que arranca &lt;strong>una máquina virtual ligera por pod&lt;/strong>, con kernel propio y un &lt;code>kata-agent&lt;/code> dentro; para Kubernetes es transparente vía &lt;code>RuntimeClass&lt;/code>. A julio de 2026 la rama estable es la &lt;strong>3.32.x&lt;/strong> —la 3.32.0 es de junio de 2026, con Rust 1.94, Go 1.25.11, QEMU 11.0.1, kernel invitado 6.18.35 y containerd 2.3—, y en abril de 2026 se publicó el &lt;strong>preview de la 4.0.0&lt;/strong>, que convierte el runtime en Rust (&lt;code>runtime-rs&lt;/code>) en el predeterminado y deja el de Go en depreciación hasta la 5.0.0, por huella de memoria.&lt;/p>
&lt;p>Para GPU el camino es &lt;strong>passthrough VFIO&lt;/strong>. El &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/deploy-kata-containers.html">NVIDIA GPU Operator&lt;/a> lo automatiza con &lt;code>sandboxWorkloads.enabled=true&lt;/code> y &lt;code>sandboxWorkloads.mode=kata&lt;/code>, instalando el VFIO Manager, el Sandbox Device Plugin, el Confidential Computing Manager y el Kata Manager. Requiere virtualización y ACS en BIOS, IOMMU, kata-deploy 3.29.0 o superior, containerd (no CRI-O), el &lt;em>feature gate&lt;/em> &lt;code>KubeletPodResourcesGet&lt;/code> —por defecto desde Kubernetes 1.34— y &lt;strong>quitar los drivers NVIDIA del host&lt;/strong>: la GPU se cede entera a la VM y la maneja el invitado.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">v1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Pod&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm-kata&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inferencia&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runtimeClassName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kata-qemu-nvidia-gpu&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">containers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">vllm/vllm-openai@sha256:aa11bb22cc33&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">resources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">limits&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">nvidia.com/pgpu&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;1&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Dos costes medibles. El de &lt;strong>memoria&lt;/strong>: la VM reserva la suya y hay que declararla como &lt;code>overhead&lt;/code> en la &lt;code>RuntimeClass&lt;/code> para que el planificador no sobrecomprometa el nodo. Y el de &lt;strong>arranque&lt;/strong>: según el estudio de contenedores confidenciales serverless de SESAME'24, el arranque en frío pasa de unos 6 s con &lt;code>runc&lt;/code> a unos 7 s con Kata, y el caliente de 1 s a 2 s. Aceptable para un motor que tarda minutos en cargar pesos; inaceptable para funciones efímeras.&lt;/p>
&lt;h3 id="confidential-containers-el-tee">Confidential Containers: el TEE&lt;/h3>
&lt;p>&lt;a href="https://confidentialcontainers.org/">Confidential Containers&lt;/a> (CoCo) &lt;strong>saca al hipervisor y al operador de la plataforma de la base de confianza&lt;/strong>. La CNCF lo promovió a &lt;em>incubating&lt;/em> el &lt;strong>22 de julio de 2026&lt;/strong>, con más de 150 contribuidores activos, 26 repositorios y más de 1200 &lt;em>pull requests&lt;/em> fusionadas, y con Microsoft Azure, Intel, AMD, IBM, NVIDIA, Alibaba y Red Hat detrás. Proyecto serio, pero &lt;em>incubating&lt;/em> significa que no está graduado y que su superficie de integración cambia entre versiones.&lt;/p>
&lt;p>Los componentes son los &lt;strong>pods CoCo&lt;/strong> (contenedores sin modificar ejecutados en un TEE mediante Kata) y &lt;strong>Trustee&lt;/strong>: &lt;strong>KBS&lt;/strong> (&lt;em>Key Broker Service&lt;/em>, que libera secretos condicionadamente), &lt;strong>AS&lt;/strong> (&lt;em>Attestation Service&lt;/em>, que valida la evidencia de hardware) y &lt;strong>RVPS&lt;/strong> (&lt;em>Reference Value Provider Service&lt;/em>, que custodia los valores de referencia). Dentro del invitado, el &lt;strong>Attestation Agent&lt;/strong> recoge la evidencia y el &lt;strong>Confidential Data Hub&lt;/strong> consume los secretos.&lt;/p>
&lt;p>El flujo es una instancia limpia de la arquitectura &lt;strong>RATS del RFC 9334&lt;/strong>: el agente dentro del TEE es el &lt;em>attester&lt;/em>, el Attestation Service el &lt;em>verifier&lt;/em> y el Confidential Data Hub el &lt;em>relying party&lt;/em>. La evidencia es un informe firmado por hardware con las medidas del arranque; el AS lo valida contra los valores del RVPS; y solo si cuadra, el KBS libera la clave que descifra las capas de imagen o los pesos. &lt;strong>Sin atestación válida no hay clave, y sin clave no hay modelo.&lt;/strong> Eso es lo que impide que el operador extraiga el modelo.&lt;/p>
&lt;p>Aviso de cartografía: el repositorio &lt;code>confidential-containers/operator&lt;/code> fue &lt;strong>archivado en febrero de 2026&lt;/strong> y el despliegue se movió a los charts de Helm y al &lt;code>trustee-operator&lt;/code>. A julio de 2026 la última publicación de charts es la &lt;strong>v0.21.0&lt;/strong>, alineada con kata-deploy 3.31.0, y &lt;strong>Trustee v0.20.0&lt;/strong>, con TLS 1.3 y criptografía post-cuántica, complementos externos para el KBS y soporte multi-GPU vía Intel Trust Authority y NVIDIA NVSwitch.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">apiVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">confidentialcontainers.org/v1alpha1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">kind&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">TrusteeConfig&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">metadata&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">trusteeconfig&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">operators&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">profileType&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Restrictive&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">httpsSpec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tlsSecretName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">trustee-tls-cert&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El perfil &lt;code>Permissive&lt;/code> existe para desarrollo y &lt;strong>no debe salir de ahí&lt;/strong>: es el modo en el que la atestación no bloquea.&lt;/p>
&lt;h3 id="el-hardware-cpu-y-gpu">El hardware: CPU y GPU&lt;/h3>
&lt;p>Del lado de CPU los dos TEE relevantes son &lt;strong>AMD SEV-SNP&lt;/strong> e &lt;strong>Intel TDX&lt;/strong>; la arquitectura de referencia de NVIDIA fija como base EPYC Milan/Genoa y Xeon Emerald/Granite Rapids. El soporte de host ya no es la parte difícil.&lt;/p>
&lt;p>Del lado de GPU, la &lt;a href="https://cacm.acm.org/practice/creating-the-first-confidential-gpus/">descripción técnica del diseño de las primeras GPU confidenciales&lt;/a> explica qué se compra con el modo CC de una H100. La memoria se parte en una &lt;strong>Compute Protected Region&lt;/strong> a la que cortafuegos de hardware impiden acceder tanto a la CPU por PCIe como a otras GPU por NVLink. Todo lo que cruza la frontera CPU-GPU pasa por &lt;strong>bounce buffers cifrados con AES-GCM-256&lt;/strong>, y los búferes de comandos y los kernels CUDA se cifran y firman antes de cruzar el bus. Hay &lt;strong>cadena de confianza desde el arranque de la GPU&lt;/strong> con informe de atestación firmado, y solo firmware firmado por NVIDIA se ejecuta en modo CC, validado contra NRAS o localmente en entornos aislados. Y &lt;strong>los contadores de rendimiento quedan deshabilitados por hardware&lt;/strong> como mitigación de canales laterales: es la telemetría de la que depende buena parte de la &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad con DCGM&lt;/a>.&lt;/p>
&lt;p>Qué &lt;strong>no&lt;/strong> protege: la memoria HBM del paquete &lt;strong>no está cifrada&lt;/strong> —se considera resistente a interposadores, lo que es una afirmación sobre dificultad física y no una garantía criptográfica—; nada frente a &lt;strong>denegación de servicio&lt;/strong>, porque el operador que no puede leerte sí puede apagarte; nada frente a &lt;strong>canales laterales de tiempo o de patrón de acceso&lt;/strong>; y nada frente a un bug en tu propio código dentro del enclave o la inyección de prompt, que sigue siendo trabajo de &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a>.&lt;/p>
&lt;p>En &lt;strong>Blackwell&lt;/strong>, NVIDIA anuncia (2 de julio de 2026) cifrado de NVLink que extiende la computación confidencial a &lt;strong>hasta 8 GPU&lt;/strong>, inexistente en Hopper y que marca la diferencia entre poder servir un modelo grande con paralelismo de tensor o no. La arquitectura de referencia lista H100, H200, RTX Pro 6000 Blackwell Server Edition y B200 en passthrough de una GPU, y H100/H200 en modo PPCIe y B200 para multi-GPU.&lt;/p>
&lt;h3 id="los-números-del-sobrecoste-con-fuente-y-con-criterio">Los números del sobrecoste, con fuente y con criterio&lt;/h3>
&lt;p>Aquí conviene desconfiar de todo el mundo, papers incluidos. La dispersión publicada va del 0 % al 28 %, y &lt;strong>no es contradicción: es que no miden lo mismo&lt;/strong>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fuente (fecha)&lt;/th>
&lt;th>Qué mide&lt;/th>
&lt;th>Resultado&lt;/th>
&lt;th>Naturaleza&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>NVIDIA, blog Blackwell (jul. 2026)&lt;/td>
&lt;td>B200 con CC activado&lt;/td>
&lt;td>−1,0 % a −7,5 % de throughput; latencia por token bajo el 8 %; &amp;ldquo;hasta el 98 % del rendimiento nativo&amp;rdquo;&lt;/td>
&lt;td>&lt;strong>Claim de fabricante&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Corvex, HGX B200 con TDX (2026)&lt;/td>
&lt;td>Despliegue &amp;ldquo;verificado&amp;rdquo;, NVSwitch cifrado&lt;/td>
&lt;td>&amp;ldquo;Rendimiento casi nativo&amp;rdquo;, sin cifras propias&lt;/td>
&lt;td>&lt;strong>Claim comercial&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>arXiv 2409.03992 (2024)&lt;/td>
&lt;td>Solo GPU H100 en CC, Llama-3.1 8B/70B&lt;/td>
&lt;td>−0,36 % a 6,85 % de throughput; TTFT hasta +19 %; overhead → 0 al crecer el modelo&lt;/td>
&lt;td>Independiente, parcial&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>arXiv 2509.18886 (sep. 2025)&lt;/td>
&lt;td>TEE de CPU (TDX/SGX) y de GPU (H100), Llama2 7B/13B/70B&lt;/td>
&lt;td>CPU TEE: bajo 10 % de throughput y 20 % de latencia. GPU TEE: 4-8 %&lt;/td>
&lt;td>Independiente&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>arXiv 2607.19353 (may. 2026)&lt;/td>
&lt;td>&lt;strong>Stack completo&lt;/strong>: H100 en CC dentro de CVM con TDX, Mistral-7B y Qwen3-30B-A3B bajo carga&lt;/td>
&lt;td>TTFT +21,8 % y +27,8 %; throughput −17,7 % y −21,1 %; en lazo cerrado, 11,5-20,2 %&lt;/td>
&lt;td>Independiente, &lt;strong>completo&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>La reconciliación: &lt;strong>la penalización no está en el cómputo de la GPU, está en el camino de datos&lt;/strong>. La propia NVIDIA cuantifica el cuello: el ancho de banda efectivo del interconexionado CPU-GPU en modo CC queda limitado por el rendimiento de cifrado de la CPU, &amp;ldquo;en torno a 4 GB/s&amp;rdquo;. De ahí, tres reglas: &lt;strong>cuanto mayor la relación cómputo/E-S, menor el sobrecoste&lt;/strong> —un 70B con lotes grandes y secuencias largas amortiza el peaje casi por completo, un 7B con lotes pequeños y prompts cortos lo paga entero—; &lt;strong>añadir el TEE de CPU suma su propio coste&lt;/strong>, y ahí está la mayor parte de la diferencia entre el 4-8 % y el 20 %; y &lt;strong>la carga del modelo y el arranque en frío son los peores casos&lt;/strong>, con decenas de gigabytes cruzando un bus cifrado a 4 GB/s, lo que vuelve más importante todo lo discutido en &lt;a href="https://blog.lo0.es/posts/del-disco-a-la-hbm-cold-start-carga-modelo/">del disco a la HBM&lt;/a> y en &lt;a href="https://blog.lo0.es/posts/acelerar-cold-start-carga-modelos-tensorizer/">acelerar el cold start&lt;/a>.&lt;/p>
&lt;p>La recomendación de los autores del estudio de 2026 —&lt;strong>reservar entre un 15 % y un 25 % de capacidad adicional&lt;/strong>— es la cifra que llevaría yo a un ejercicio de &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">capacity planning&lt;/a>, y no el &amp;ldquo;98 % del rendimiento nativo&amp;rdquo; del fabricante. Ambas pueden ser ciertas a la vez; solo una es prudente para dimensionar.&lt;/p>
&lt;h3 id="cuándo-merece-la-pena-de-verdad">Cuándo merece la pena de verdad&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Escenario&lt;/th>
&lt;th>Kata&lt;/th>
&lt;th>CoCo (TEE)&lt;/th>
&lt;th>Razón&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Tenants que no confían entre sí&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>Depende&lt;/td>
&lt;td>Kata elimina el kernel compartido, vector real de escape&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Código o modelos de terceros no auditados&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>Opcional&lt;/td>
&lt;td>Un kernel compartido es demasiada superficie para código ajeno&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Propiedad intelectual del modelo frente al &lt;strong>operador de la infraestructura&lt;/strong>&lt;/td>
&lt;td>No basta&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>Caso canónico: hospedaje ajeno, nube, socio que aporta el hierro&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Datos regulados de terceros en infraestructura que no controlas&lt;/td>
&lt;td>No basta&lt;/td>
&lt;td>&lt;strong>Sí&lt;/strong>&lt;/td>
&lt;td>Ver &lt;a href="https://blog.lo0.es/posts/infra-cumplimiento-normativo-defensa-ia/">defensa&lt;/a> y &lt;a href="https://blog.lo0.es/posts/infra-cumplimiento-normativo-sanidad-ia/">sanidad&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>On-premise soberano, un tenant, operador de confianza&lt;/td>
&lt;td>Útil&lt;/td>
&lt;td>&lt;strong>Sobre-ingeniería cara&lt;/strong>&lt;/td>
&lt;td>Protege de un adversario que no tienes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Baja latencia con lotes pequeños&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>&lt;strong>Mala idea&lt;/strong>&lt;/td>
&lt;td>Peor punto de la curva coste/beneficio del cifrado del bus&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El matiz que más dinero ahorra: &lt;strong>los dos ejes son independientes&lt;/strong>. Kata sin TEE es barato y aporta la mayor parte del aislamiento entre tenants; CoCo solo aporta algo si tu modelo de amenaza incluye al operador. Si montas una factoría soberana con tu hierro y tu personal y respondes &amp;ldquo;no&amp;rdquo; a esa pregunta, &lt;strong>el TEE es un coste sin contrapartida&lt;/strong>.&lt;/p>
&lt;h3 id="trampas-operativas">Trampas operativas&lt;/h3>
&lt;p>&lt;strong>MIG y vGPU frente al modo confidencial.&lt;/strong> La arquitectura de referencia GA 1.0.0 de NVIDIA es tajante: &lt;strong>MIG y vGPU están prohibidos en modo CC&lt;/strong> y &lt;strong>los nodos en modo mixto no están soportados&lt;/strong> —todas las GPU de un host van en CC o ninguna—. Los foros muestran la contradicción típica de un área en movimiento: en febrero de 2026 un moderador afirma que MIG+CC no está soportado y en abril un usuario cita la página de MIG sugiriendo que Hopper y Blackwell ya lo permiten. A fecha de este artículo la arquitectura de referencia manda sobre la página de producto: si tu multi-tenancy se apoyaba en &lt;a href="https://blog.lo0.es/posts/compartir-gpu-time-slicing-mps-mig/">particionar la GPU con MIG&lt;/a>, activar CC te devuelve a &amp;ldquo;una GPU entera por tenant&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>El arranque se alarga de forma no lineal.&lt;/strong> SESAME'24 desglosa dónde: la provisión de memoria SEV añade en torno a un segundo por cada 2 GB de invitado —SEV &lt;strong>fija todas las páginas por adelantado&lt;/strong>, y una VM de inferencia asigna mucha—, el firmware OVMF unos tres segundos y el descifrado de capas otros tres a cinco. Escalar de 0 a 16 instancias pasa de 16 s con &lt;code>runc&lt;/code> a 190 s: irrelevante para un &lt;code>Deployment&lt;/code> estable, cambio de diseño para autoescalado agresivo con &lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">KEDA&lt;/a>.&lt;/p>
&lt;p>&lt;strong>El acoplamiento de versiones es brutal.&lt;/strong> Kata, kata-deploy, GPU Operator, containerd, QEMU con parches propios, kernel del invitado, driver NVIDIA y Trustee son una matriz que hay que tratar como unidad: la arquitectura de referencia fija Kubernetes 1.32 o superior, Kata 3.29, GPU Operator 26.3.1 o superior, containerd 2.2.2 o superior y QEMU 10.1. Súmalo al peso que ya arrastran los &lt;a href="https://blog.lo0.es/posts/operators-llm-kubernetes/">operators del stack&lt;/a>.&lt;/p>
&lt;p>&lt;strong>La atestación falla tras actualizar firmware, y es lo normal.&lt;/strong> Los valores de referencia del RVPS describen un estado de arranque concreto. Al parchear el firmware SEV-SNP, el microcódigo o el firmware de la GPU, la versión de TCB cambia, la evidencia deja de cuadrar y &lt;strong>el KBS no libera claves, así que los pods no arrancan&lt;/strong>. Como estas actualizaciones suelen responder a un boletín de seguridad, el escenario típico es &amp;ldquo;aplicamos el parche crítico un viernes y el sábado no arranca la inferencia&amp;rdquo;. El procedimiento correcto invierte el orden: actualizar primero los valores de referencia con ventana de solapamiento, y después parchear el hierro.&lt;/p>
&lt;p>&lt;strong>El servicio de atestación es un punto único de fallo por diseño.&lt;/strong> Si el KBS no responde, ningún pod confidencial nuevo obtiene su clave; los arrancados sobreviven, pero cualquier reprogramación o escalado, no. Misma dependencia que el servidor SPIRE y mismo tratamiento: alta disponibilidad real, alerta propia y degradación ensayada.&lt;/p>
&lt;h2 id="cierre-de-serie-la-cadena-completa">Cierre de serie: la cadena completa&lt;/h2>
&lt;p>El &lt;a href="https://blog.lo0.es/posts/kserve-open-inference-protocol-plano-control/">artículo 1/4&lt;/a> fijó &lt;strong>el contrato&lt;/strong>: qué expone el endpoint y qué plano de control lo gobierna de forma reproducible. El &lt;a href="https://blog.lo0.es/posts/registro-distribucion-modelos-oci-oras/">2/4&lt;/a> fijó &lt;strong>la procedencia de los bytes&lt;/strong>: de qué registro salen, por digest inmutable y no por un tag móvil. El &lt;a href="https://blog.lo0.es/posts/firma-procedencia-aibom-cadena-suministro-modelo/">3/4&lt;/a> fijó &lt;strong>la prueba criptográfica de qué son&lt;/strong>: firma, atestaciones de construcción y AIBOM, verificadas en admisión. Y este 4/4 fija &lt;strong>quién los ejecuta y dónde&lt;/strong>: un SVID que prueba la identidad del proceso servidor y un peldaño de aislamiento elegido para el adversario que de verdad tienes. Rota cualquiera de las cuatro, las otras tres valen menos de lo que parece: un modelo firmado impecablemente que sirve un proceso no identificado en una máquina que un tercero puede volcar sigue siendo un problema.&lt;/p>
&lt;p>Con presupuesto limitado, el orden responde a coste por unidad de riesgo eliminado. Primero, &lt;strong>digest en todas partes&lt;/strong>: casi gratis, elimina una familia entera de ataques de sustitución. Segundo, &lt;strong>firma verificada en admisión&lt;/strong>: coste bajo y es lo primero que un auditor pide ver. Tercero, &lt;strong>contrato y plano de control declarativos&lt;/strong>, que hacen auditable lo demás. Cuarto, &lt;strong>identidad de carga con SPIFFE/SPIRE&lt;/strong>: caro en operación, pero es lo único que convierte el tráfico este-oeste en algo autorizable, e &lt;strong>imprescindible en cuanto entran agentes con MCP&lt;/strong>. Y último, el &lt;strong>TEE&lt;/strong>, &lt;strong>solo si el operador de la infraestructura está en tu modelo de amenaza&lt;/strong>; Kata sin TEE puede adelantarse al cuarto puesto si hay tenants que no confían entre sí.&lt;/p>
&lt;h3 id="mapeo-de-la-serie-a-ens-isoiec-42001-y-eu-ai-act">Mapeo de la serie a ENS, ISO/IEC 42001 y EU AI Act&lt;/h3>
&lt;p>El detalle está en &lt;a href="https://blog.lo0.es/posts/controles-tecnicos-ens-42001-eu-ai-act/">controles técnicos ENS × ISO 42001 × EU AI Act&lt;/a>; esta tabla es el resumen por eslabón.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Eslabón&lt;/th>
&lt;th>Medida ENS (RD 311/2022)&lt;/th>
&lt;th>ISO/IEC 42001 (Anexo A)&lt;/th>
&lt;th>EU AI Act&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1/4 Contrato y plano de control&lt;/td>
&lt;td>&lt;code>op.exp.2&lt;/code>; &lt;code>op.mon.1&lt;/code>&lt;/td>
&lt;td>A.6 ciclo de vida&lt;/td>
&lt;td>Art. 12 (registro); Art. 13 (transparencia)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2/4 Registro y distribución por digest&lt;/td>
&lt;td>&lt;code>op.ext.3&lt;/code>&lt;/td>
&lt;td>A.10 terceros&lt;/td>
&lt;td>Art. 11 y Anexo IV (documentación técnica)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3/4 Firma, atestaciones y AIBOM&lt;/td>
&lt;td>&lt;code>op.exp.6&lt;/code>; &lt;code>op.ext.3&lt;/code>&lt;/td>
&lt;td>A.6.2 y A.7 datos y trazabilidad&lt;/td>
&lt;td>Art. 15(5), envenenamiento de datos y de modelo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4/4-A Identidad de carga&lt;/td>
&lt;td>&lt;code>op.acc.1/2/5&lt;/code>; &lt;code>op.exp.11&lt;/code>; &lt;code>mp.com.2-3&lt;/code>&lt;/td>
&lt;td>A.9 uso del sistema de IA&lt;/td>
&lt;td>Art. 15(5), terceros no autorizados&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4/4-B Aislamiento y TEE&lt;/td>
&lt;td>&lt;code>mp.info.3&lt;/code>; &lt;code>op.exp.2&lt;/code>; &lt;code>mp.com.4&lt;/code>&lt;/td>
&lt;td>A.6 controles del ciclo de vida&lt;/td>
&lt;td>Art. 15(4) robustez; Art. 15(5)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El Art. 15(5) es el que más carga soporta: exige que los sistemas de alto riesgo sean &amp;ldquo;resilientes frente a intentos de terceros no autorizados de alterar su uso, salidas o rendimiento&amp;rdquo;, y enumera el envenenamiento de datos y de modelo y los ataques a la confidencialidad. Los eslabones 3 y 4 son su implementación técnica. Para el marco de gestión, ver &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">ISO/IEC 42001 como AIMS&lt;/a> y el &lt;a href="https://blog.lo0.es/posts/eu-ai-act-mapeo-arquitectura-llm-on-premise/">mapeo del AI Act&lt;/a>.&lt;/p>
&lt;h2 id="para-una-factoría-de-inferencia">Para una factoría de inferencia&lt;/h2>
&lt;p>&lt;strong>Empieza la identidad de carga por el par gateway↔motor y por los agentes, no por todo el clúster.&lt;/strong> Registrar las cuarenta cargas el primer día es la forma más fiable de abandonar el proyecto: registra dos entradas, monta la política de Istio que exige el principal del gateway y vive con ella un par de semanas para aprender qué se rompe al rotar el certificado. Después, los agentes con MCP, donde las credenciales estáticas son el modelo de amenaza entero.&lt;/p>
&lt;p>&lt;strong>Separa la decisión de Kata de la de TEE, y tómalas en ese orden.&lt;/strong> Kata es un cambio de &lt;code>RuntimeClass&lt;/code> con un segundo de arranque y algo de memoria. CoCo es un rediseño: pierdes MIG y los contadores de rendimiento de la GPU, ganas diez segundos o más de arranque, pagas un 15-25 % de capacidad y añades dos dependencias cuya caída impide arrancar cargas. Evalúa lo segundo con un modelo de amenaza escrito, no con una diapositiva.&lt;/p>
&lt;p>&lt;strong>Si vas a CoCo, ensaya el día del parche antes de necesitarlo.&lt;/strong> El fallo que tumbará tu inferencia no será un ataque, será una actualización de firmware que desalinea los valores de referencia del RVPS. Escribe el runbook —actualizar RVPS con solapamiento, parchear, retirar el valor antiguo—, ensáyalo en un nodo y monitoriza la tasa de éxito de atestación como métrica de primera clase, igual que para SPIRE: alerta sobre fallos de atestación antes de que se conviertan en 401 en el gateway.&lt;/p>
&lt;p>Con esto se cierra la serie: del contrato al artefacto, del artefacto a su prueba, y de la prueba al proceso y a la máquina. Lo que queda por debajo ya no es cadena de confianza sino explotación diaria: ver qué hace cada proceso con &lt;a href="https://blog.lo0.es/posts/tetragon-runtime-security/">Tetragon&lt;/a> y medir si lo servido sigue siendo bueno con &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">evals&lt;/a>. La confianza se establece una vez; la vigilancia es continua.&lt;/p>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/kserve-open-inference-protocol-plano-control/">Cadena de confianza del modelo (1/4): KServe y el Open Inference Protocol&lt;/a> — el contrato de API que abre la serie.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/registro-distribucion-modelos-oci-oras/">Cadena de confianza del modelo (2/4): registro y distribución con OCI y ORAS&lt;/a> — por qué el digest lo es todo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/firma-procedencia-aibom-cadena-suministro-modelo/">Cadena de confianza del modelo (3/4): firma, procedencia y AIBOM&lt;/a> — la prueba que los selectores Sigstore vuelven precondición de identidad.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mcp-crece-autenticacion-keycloak/">MCP crece: autenticación con Keycloak&lt;/a> — la identidad de usuario con la que componer la de carga.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/aislar-agentes-ia-cliente-cluster/">Aislar agentes de IA: del workstation al clúster&lt;/a> — el modelo de amenaza al que SPIFFE pone credencial no transferible.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tetragon-runtime-security/">Tetragon: seguridad en runtime&lt;/a> — la vigilancia que empieza donde acaba la cadena de confianza.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/infra-cumplimiento-normativo-defensa-ia/">Infraestructura y cumplimiento normativo en defensa&lt;/a> — donde el TEE deja de ser sobre-ingeniería.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cluster-h100-plataforma-multi-tenant/">Clúster H100: plataforma multi-tenant&lt;/a> — donde MIG y modo confidencial chocan de frente.&lt;/li>
&lt;/ul>
&lt;h2 id="fuentes">Fuentes&lt;/h2>
&lt;ul>
&lt;li>CNCF, &lt;em>SPIFFE and SPIRE Projects Graduate from CNCF Incubator&lt;/em> (20 sep. 2022) — &lt;a href="https://www.cncf.io/announcements/2022/09/20/spiffe-and-spire-projects-graduate-from-cloud-native-computing-foundation-incubator/">https://www.cncf.io/announcements/2022/09/20/spiffe-and-spire-projects-graduate-from-cloud-native-computing-foundation-incubator/&lt;/a>&lt;/li>
&lt;li>SPIFFE, &lt;em>SPIFFE Concepts&lt;/em> (SPIFFE ID, trust domain, SVID, Workload API) — &lt;a href="https://spiffe.io/docs/latest/spiffe-about/spiffe-concepts/">https://spiffe.io/docs/latest/spiffe-about/spiffe-concepts/&lt;/a>&lt;/li>
&lt;li>SPIFFE, &lt;em>SPIFFE Federation specification&lt;/em> — &lt;a href="https://spiffe.io/docs/latest/spiffe-specs/spiffe_federation/">https://spiffe.io/docs/latest/spiffe-specs/spiffe_federation/&lt;/a>&lt;/li>
&lt;li>SPIFFE, &lt;em>Scaling SPIRE&lt;/em> (dimensionamiento y punto único de fallo) — &lt;a href="https://spiffe.io/docs/latest/planning/scaling_spire/">https://spiffe.io/docs/latest/planning/scaling_spire/&lt;/a>&lt;/li>
&lt;li>spiffe/spire, &lt;em>Releases&lt;/em> (v1.15.0 de 19 may. 2026; v1.15.1 de 28 may. 2026, parche de &lt;code>azure_imds&lt;/code>) — &lt;a href="https://github.com/spiffe/spire/releases">https://github.com/spiffe/spire/releases&lt;/a>&lt;/li>
&lt;li>spiffe/spire, &lt;em>Kubernetes Workload Attestor plugin&lt;/em> (selectores, kubelet, cgroups, Sigstore) — &lt;a href="https://github.com/spiffe/spire/blob/main/doc/plugin_agent_workloadattestor_k8s.md">https://github.com/spiffe/spire/blob/main/doc/plugin_agent_workloadattestor_k8s.md&lt;/a>&lt;/li>
&lt;li>spiffe/spire, &lt;em>SPIRE Server configuration reference&lt;/em> (&lt;code>default_x509_svid_ttl&lt;/code>, &lt;code>default_jwt_svid_ttl&lt;/code>, &lt;code>ca_ttl&lt;/code>) — &lt;a href="https://github.com/spiffe/spire/blob/main/doc/spire_server.md">https://github.com/spiffe/spire/blob/main/doc/spire_server.md&lt;/a>&lt;/li>
&lt;li>Istio, &lt;em>SPIRE integration&lt;/em> (Envoy SDS, SPIFFE CSI Driver, trust domain) — &lt;a href="https://istio.io/latest/docs/ops/integrations/spire/">https://istio.io/latest/docs/ops/integrations/spire/&lt;/a>&lt;/li>
&lt;li>SPIFFE, &lt;em>OPA Authorization with Envoy and JWT-SVIDs&lt;/em> — &lt;a href="https://spiffe.io/docs/latest/microservices/envoy-jwt-opa/readme/">https://spiffe.io/docs/latest/microservices/envoy-jwt-opa/readme/&lt;/a>&lt;/li>
&lt;li>The New Stack, &lt;em>How Cilium&amp;rsquo;s Mutual Authentication Can Compromise Security&lt;/em> — &lt;a href="https://thenewstack.io/how-ciliums-mutual-authentication-can-compromise-security/">https://thenewstack.io/how-ciliums-mutual-authentication-can-compromise-security/&lt;/a>&lt;/li>
&lt;li>Riptides, &lt;em>Bringing SPIFFE to OAuth for MCP&lt;/em> — &lt;a href="https://riptides.io/blog/bringing-spiffe-to-oauth-for-mcp-secure-identity-for-agentic-workloads/">https://riptides.io/blog/bringing-spiffe-to-oauth-for-mcp-secure-identity-for-agentic-workloads/&lt;/a>&lt;/li>
&lt;li>CNCF, &lt;em>Confidential Containers becomes a CNCF incubating project&lt;/em> (22 jul. 2026) — &lt;a href="https://www.cncf.io/blog/2026/07/22/confidential-containers-becomes-a-cncf-incubating-project/">https://www.cncf.io/blog/2026/07/22/confidential-containers-becomes-a-cncf-incubating-project/&lt;/a>&lt;/li>
&lt;li>Confidential Containers, &lt;em>Attestation with Trustee&lt;/em> (KBS, AS, RVPS, CDH) — &lt;a href="https://confidentialcontainers.org/docs/attestation/">https://confidentialcontainers.org/docs/attestation/&lt;/a>&lt;/li>
&lt;li>Confidential Containers, &lt;em>Deploy Trustee in Kubernetes&lt;/em> (11 feb. 2026) — &lt;a href="https://confidentialcontainers.org/blog/2026/02/11/deploy-trustee-in-kubernetes/">https://confidentialcontainers.org/blog/2026/02/11/deploy-trustee-in-kubernetes/&lt;/a>&lt;/li>
&lt;li>confidential-containers/trustee, &lt;em>Releases&lt;/em> (v0.20.0: TLS 1.3, PQC, multi-GPU ITA, NVSwitch) — &lt;a href="https://github.com/confidential-containers/trustee/releases">https://github.com/confidential-containers/trustee/releases&lt;/a>&lt;/li>
&lt;li>IETF, &lt;em>RFC 9334 — Remote ATtestation procedureS (RATS) Architecture&lt;/em> — &lt;a href="https://www.rfc-editor.org/info/rfc9334/">https://www.rfc-editor.org/info/rfc9334/&lt;/a>&lt;/li>
&lt;li>Kata Containers, &lt;em>Kata Containers 4.0.0 Preview&lt;/em> (28 abr. 2026, &lt;code>runtime-rs&lt;/code> por defecto) — &lt;a href="https://katacontainers.io/blog/release-4-0-0-preview/">https://katacontainers.io/blog/release-4-0-0-preview/&lt;/a>&lt;/li>
&lt;li>kata-containers, &lt;em>Release 3.32.0&lt;/em> — &lt;a href="https://github.com/kata-containers/kata-containers/releases/tag/3.32.0">https://github.com/kata-containers/kata-containers/releases/tag/3.32.0&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>Deploy with Kata Containers — GPU Operator&lt;/em> — &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/deploy-kata-containers.html">https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/deploy-kata-containers.html&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>Deploying Proprietary Models Securely with Confidential Computing on Self-Hosted Kubernetes&lt;/em> (GA 1.0.0; MIG y vGPU prohibidos en CC) — &lt;a href="https://docs.nvidia.com/enterprise-reference-architectures/deploying-proprietary-models-confidential-compute-self-hosted-kubernetes/latest/reference-implementations.html">https://docs.nvidia.com/enterprise-reference-architectures/deploying-proprietary-models-confidential-compute-self-hosted-kubernetes/latest/reference-implementations.html&lt;/a>&lt;/li>
&lt;li>CACM, &lt;em>Creating the First Confidential GPUs&lt;/em> (CPR, bounce buffers, contadores deshabilitados, HBM no cifrada) — &lt;a href="https://cacm.acm.org/practice/creating-the-first-confidential-gpus/">https://cacm.acm.org/practice/creating-the-first-confidential-gpus/&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>Confidential Computing on H100 GPUs for Secure and Trustworthy AI&lt;/em> (límite de ~4 GB/s, NRAS) — &lt;a href="https://developer.nvidia.com/blog/confidential-computing-on-h100-gpus-for-secure-and-trustworthy-ai/">https://developer.nvidia.com/blog/confidential-computing-on-h100-gpus-for-secure-and-trustworthy-ai/&lt;/a>&lt;/li>
&lt;li>NVIDIA, &lt;em>Hardware-Rooted AI Security That Won&amp;rsquo;t Slow You Down&lt;/em> (2 jul. 2026; Blackwell, NVLink cifrado hasta 8 GPU) — &lt;a href="https://developer.nvidia.com/blog/hardware-rooted-ai-security-that-wont-slow-you-down">https://developer.nvidia.com/blog/hardware-rooted-ai-security-that-wont-slow-you-down&lt;/a>&lt;/li>
&lt;li>Corvex, &lt;em>Confidential Computing Meets NVIDIA HGX B200&lt;/em> (claim comercial) — &lt;a href="https://www.corvex.ai/blog/confidential-computing-meets-nvidia-hgxtm-b200-secure-ai-without-the-performance-trade-off">https://www.corvex.ai/blog/confidential-computing-meets-nvidia-hgxtm-b200-secure-ai-without-the-performance-trade-off&lt;/a>&lt;/li>
&lt;li>arXiv 2409.03992, &lt;em>Confidential Computing on NVIDIA Hopper GPUs: A Performance Benchmark Study&lt;/em> — &lt;a href="https://arxiv.org/html/2409.03992v1">https://arxiv.org/html/2409.03992v1&lt;/a>&lt;/li>
&lt;li>arXiv 2509.18886, &lt;em>Confidential LLM Inference: Performance and Cost Across CPU and GPU TEEs&lt;/em> (23 sep. 2025) — &lt;a href="https://arxiv.org/abs/2509.18886">https://arxiv.org/abs/2509.18886&lt;/a>&lt;/li>
&lt;li>arXiv 2607.19353, &lt;em>Benchmarking Confidential GPU Inference on NVIDIA H100 under Intel TDX&lt;/em> (may. 2026; heurística del 15-25 %) — &lt;a href="https://arxiv.org/html/2607.19353">https://arxiv.org/html/2607.19353&lt;/a>&lt;/li>
&lt;li>Segarra et al., &lt;em>Serverless Confidential Containers: Challenges and Opportunities&lt;/em> (SESAME'24) — &lt;a href="https://carlossegarra.com/assets/papers/sesame24-serverlesscoco.pdf">https://carlossegarra.com/assets/papers/sesame24-serverlesscoco.pdf&lt;/a>&lt;/li>
&lt;li>EU Artificial Intelligence Act, &lt;em>Article 15: Accuracy, Robustness and Cybersecurity&lt;/em> — &lt;a href="https://artificialintelligenceact.eu/article/15/">https://artificialintelligenceact.eu/article/15/&lt;/a>&lt;/li>
&lt;li>EU Artificial Intelligence Act, &lt;em>Article 12: Record-Keeping&lt;/em> — &lt;a href="https://artificialintelligenceact.eu/article/12/">https://artificialintelligenceact.eu/article/12/&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>