{"id":613,"date":"2026-03-13T09:18:00","date_gmt":"2026-03-13T08:18:00","guid":{"rendered":"https:\/\/secure-pipelines.com\/?p=613"},"modified":"2026-03-25T08:42:54","modified_gmt":"2026-03-25T07:42:54","slug":"container-image-signing-tools-compared-cosign-notation-gpg","status":"publish","type":"post","link":"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/container-image-signing-tools-compared-cosign-notation-gpg\/","title":{"rendered":"Herramientas de Firma de Im\u00e1genes Container Comparadas: Cosign vs Notation vs GPG"},"content":{"rendered":"<h2>Por Qu\u00e9 Importa la Firma de Im\u00e1genes Container<\/h2>\n<p>Cada vez que descargas una imagen container y la despliegas en producci\u00f3n, est\u00e1s depositando una confianza impl\u00edcita en ese artefacto. Pero, \u00bfc\u00f3mo <em>verificas<\/em> que la imagen no ha sido manipulada? \u00bfC\u00f3mo confirmas que fue realmente construida por tu pipeline CI\/CD y no inyectada por un atacante que comprometi\u00f3 tu registro?<\/p>\n<p>La firma de im\u00e1genes container resuelve este problema adjuntando una firma criptogr\u00e1fica a tus im\u00e1genes. Antes del despliegue, tu orquestador o controlador de admisi\u00f3n puede verificar esa firma, asegurando que solo im\u00e1genes confiables y autenticadas entren en tu entorno. Este es un pilar fundamental de la <strong>seguridad de la cadena de suministro de software<\/strong> y un requisito en marcos como <a href=\"https:\/\/slsa.dev\/\" target=\"_blank\" rel=\"noopener\">SLSA<\/a> y <a href=\"https:\/\/www.nist.gov\/itl\/executive-order-14028-improving-nations-cybersecurity\" target=\"_blank\" rel=\"noopener\">NIST SSDF<\/a>.<\/p>\n<p>Pero las herramientas de firma no son todas iguales. Los tres enfoques dominantes hoy \u2014 <strong>Cosign<\/strong> (parte del proyecto Sigstore), <strong>Notation<\/strong> (el cliente de Notary v2) y <strong>GPG<\/strong> (el enfoque tradicional) \u2014 cada uno viene con compensaciones radicalmente diferentes en gesti\u00f3n de claves, integraci\u00f3n CI\/CD y compatibilidad del ecosistema.<\/p>\n<p>En esta gu\u00eda, haremos una comparaci\u00f3n profunda y pr\u00e1ctica de los tres para que puedas tomar la decisi\u00f3n correcta para tus pipelines.<\/p>\n<h2>Cosign y el Ecosistema Sigstore<\/h2>\n<h3>Descripci\u00f3n General<\/h3>\n<p>Cosign es la herramienta de firma de im\u00e1genes container del <a href=\"https:\/\/www.sigstore.dev\/\" target=\"_blank\" rel=\"noopener\">proyecto Sigstore<\/a>, que ahora es un proyecto graduado bajo la Linux Foundation. La misi\u00f3n de Sigstore es hacer que la firma de software sea ubicua eliminando la mayor barrera: <strong>la gesti\u00f3n de claves<\/strong>.<\/p>\n<p>Cosign almacena las firmas como artefactos OCI directamente junto a la imagen firmada en el mismo registro. Esto significa que no hay un sistema separado de almacenamiento de firmas que mantener \u2014 tu registro de contenedores existente (Docker Hub, GitHub Container Registry, AWS ECR, Google Artifact Registry, etc.) cumple doble funci\u00f3n.<\/p>\n<h3>Firma Keyless con Fulcio y Rekor<\/h3>\n<p>La caracter\u00edstica m\u00e1s revolucionaria de Cosign es la <strong>firma keyless<\/strong>. En lugar de gestionar claves de firma de larga duraci\u00f3n, Cosign se integra con dos servicios:<\/p>\n<ul>\n<li><strong>Fulcio<\/strong> \u2014 Una autoridad certificadora que emite certificados de firma de corta duraci\u00f3n basados en una identidad OpenID Connect (OIDC). En un contexto CI\/CD, esta es t\u00edpicamente el token de identidad de tu proveedor de pipeline (GitHub Actions OIDC, GitLab CI OIDC, etc.).<\/li>\n<li><strong>Rekor<\/strong> \u2014 Un registro de transparencia inmutable que registra cada evento de firma. Esto proporciona una pista de auditor\u00eda a prueba de manipulaciones de qui\u00e9n firm\u00f3 qu\u00e9 y cu\u00e1ndo.<\/li>\n<\/ul>\n<p>Con la firma keyless, el flujo de trabajo se ve as\u00ed:<\/p>\n<ol>\n<li>Tu pipeline CI solicita un token OIDC del proveedor del pipeline.<\/li>\n<li>Cosign presenta ese token a Fulcio, que emite un certificado de corta duraci\u00f3n vinculando la identidad del pipeline a un par de claves ef\u00edmero.<\/li>\n<li>Cosign firma el digest de la imagen con la clave privada ef\u00edmera.<\/li>\n<li>La firma y el certificado se registran en el registro de transparencia de Rekor.<\/li>\n<li>La clave privada ef\u00edmera se descarta \u2014 solo existi\u00f3 durante segundos.<\/li>\n<\/ol>\n<p>Esto elimina toda la clase de problemas relacionados con la rotaci\u00f3n de claves, el almacenamiento de claves y el compromiso de claves. No hay ning\u00fan secreto de larga duraci\u00f3n que proteger.<\/p>\n<h3>Firma Basada en Claves<\/h3>\n<p>Cosign tambi\u00e9n soporta la firma tradicional con par de claves para entornos donde la firma keyless no es factible (redes air-gapped, requisitos regulatorios para custodia espec\u00edfica de claves). Generas un par de claves con <code>cosign generate-key-pair<\/code> y firmas con <code>cosign sign --key cosign.key<\/code>.<\/p>\n<h3>Ejemplo de Integraci\u00f3n CI\/CD: GitHub Actions<\/h3>\n<pre><code># .github\/workflows\/sign.yml\njobs:\n  sign:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write   # Required for keyless signing\n      packages: write   # Required to push signatures to GHCR\n    steps:\n      - uses: sigstore\/cosign-installer@v3\n\n      - name: Sign the container image (keyless)\n        env:\n          COSIGN_EXPERIMENTAL: 1\n        run: |\n          cosign sign --yes ghcr.io\/myorg\/myapp@sha256:abc123...\n\n      - name: Verify the signature\n        run: |\n          cosign verify \\\n            --certificate-oidc-issuer https:\/\/token.actions.githubusercontent.com \\\n            --certificate-identity-regexp https:\/\/github.com\/myorg\/myapp\/.github\/workflows\/* \\\n            ghcr.io\/myorg\/myapp@sha256:abc123...\n<\/code><\/pre>\n<p>El permiso <code>id-token: write<\/code> es la pieza cr\u00edtica \u2014 permite que GitHub Actions genere el token OIDC que Fulcio usa para emitir el certificado de firma. Sin secretos que configurar, sin claves que almacenar. Para un recorrido pr\u00e1ctico, consulta nuestro <a href=\"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/lab-signing-verifying-container-images-cosign-github-actions\/\">Laboratorio de Firma Keyless con Cosign<\/a>.<\/p>\n<h3>Fortalezas<\/h3>\n<ul>\n<li>La firma keyless elimina completamente la gesti\u00f3n de claves en CI\/CD<\/li>\n<li>El registro de transparencia (Rekor) proporciona una pista de auditor\u00eda inmutable<\/li>\n<li>Almacenamiento nativo de artefactos OCI \u2014 no se necesita un almac\u00e9n de firmas externo<\/li>\n<li>Verificaci\u00f3n de pol\u00edticas enriquecida con coincidencia de identidad de certificados<\/li>\n<li>Amplio soporte del ecosistema (Kyverno, OPA Gatekeeper, controladores de pol\u00edticas de Kubernetes)<\/li>\n<li>Comunidad open-source activa y bien financiada<\/li>\n<\/ul>\n<h3>Limitaciones<\/h3>\n<ul>\n<li>El modo keyless requiere acceso a internet para Fulcio y Rekor (desafiante para entornos air-gapped)<\/li>\n<li>La verificaci\u00f3n en entornos air-gapped requiere duplicar el registro de transparencia<\/li>\n<li>Proyecto relativamente joven comparado con GPG (aunque ahora estable y graduado)<\/li>\n<\/ul>\n<h2>Notation y Notary v2<\/h2>\n<h3>Descripci\u00f3n General<\/h3>\n<p><a href=\"https:\/\/notaryproject.dev\/\" target=\"_blank\" rel=\"noopener\">Notation<\/a> es el cliente CLI para la especificaci\u00f3n Notary v2, un proyecto CNCF respaldado principalmente por Microsoft y AWS. Donde Cosign fue construido espec\u00edficamente para el ecosistema Sigstore, Notation fue dise\u00f1ado para integrarse con infraestructura PKI empresarial y flujos de trabajo existentes de certificados X.509.<\/p>\n<p>Notation utiliza firmas <strong>COSE (CBOR Object Signing and Encryption)<\/strong> almacenadas como artefactos OCI adjuntos a la imagen firmada usando la especificaci\u00f3n <a href=\"https:\/\/oras.land\/\" target=\"_blank\" rel=\"noopener\">ORAS<\/a> (OCI Registry As Storage). Al igual que Cosign, esto significa que las firmas residen en el registro OCI junto a las im\u00e1genes.<\/p>\n<h3>Gesti\u00f3n de Claves con Plugins<\/h3>\n<p>Notation utiliza una arquitectura de plugins para la gesti\u00f3n de claves. En lugar de manejar las claves directamente, delega en plugins que se comunican con almacenes de claves externos:<\/p>\n<ul>\n<li><strong>Plugin de Azure Key Vault<\/strong> \u2014 Firma usando claves almacenadas en Azure Key Vault.<\/li>\n<li><strong>Plugin de AWS Signer<\/strong> \u2014 Utiliza AWS Signer, un servicio de firma completamente gestionado.<\/li>\n<li><strong>Plugin de HashiCorp Vault<\/strong> \u2014 Se integra con el motor de secretos transit de Vault.<\/li>\n<\/ul>\n<p>Este modelo de plugins es una opci\u00f3n natural para empresas que ya tienen gesti\u00f3n centralizada de claves e infraestructura PKI. La clave de firma nunca sale del HSM o cloud KMS \u2014 Notation env\u00eda el digest al plugin, y el plugin devuelve la firma.<\/p>\n<h3>Pol\u00edticas de Confianza y Almacenes de Confianza<\/h3>\n<p>Notation utiliza un sistema de <strong>pol\u00edticas de confianza<\/strong> basado en JSON para la verificaci\u00f3n. Defines qu\u00e9 registros, repositorios e im\u00e1genes conf\u00edas y qu\u00e9 certificados o cadenas de certificados est\u00e1n autorizados para firmarlos. Esto es poderoso para escenarios de gobernanza empresarial donde diferentes equipos tienen diferentes autoridades de firma.<\/p>\n<pre><code>\/\/ trustpolicy.json\n{\n  \"version\": \"1.0\",\n  \"trustPolicies\": [\n    {\n      \"name\": \"production-images\",\n      \"registryScopes\": [\"registry.example.com\/prod\/*\"],\n      \"signatureVerification\": {\n        \"level\": \"strict\"\n      },\n      \"trustStores\": [\"ca:production-ca\"],\n      \"trustedIdentities\": [\"x509.subject: CN=prod-signer, O=MyOrg\"]\n    }\n  ]\n}\n<\/code><\/pre>\n<h3>Ejemplo de Integraci\u00f3n CI\/CD: GitHub Actions con AWS Signer<\/h3>\n<pre><code># .github\/workflows\/notation-sign.yml\njobs:\n  sign:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write  # For AWS OIDC federation\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::123456789012:role\/signer-role\n          aws-region: us-east-1\n\n      - name: Setup Notation\n        uses: notaryproject\/notation-action\/setup@v1\n\n      - name: Install AWS Signer plugin\n        run: |\n          notation plugin install \\\n            --url https:\/\/d2hvyiie56hcat.cloudfront.net\/linux\/amd64\/plugin\/latest\/notation-aws-signer-plugin.zip\n\n      - name: Sign the container image\n        run: |\n          notation sign \\\n            --plugin com.amazonaws.signer.notation.plugin \\\n            --id arn:aws:signer:us-east-1:123456789012:\/signing-profiles\/MyProfile \\\n            registry.example.com\/myapp@sha256:abc123...\n<\/code><\/pre>\n<h3>Fortalezas<\/h3>\n<ul>\n<li>Arquitectura de plugins amigable con empresas que se integra con PKI y KMS existentes<\/li>\n<li>Marco de pol\u00edticas de confianza enriquecido para verificaci\u00f3n granular por alcance de registro<\/li>\n<li>El formato de firma COSE es un est\u00e1ndar IETF bien establecido<\/li>\n<li>Fuerte respaldo de Microsoft (Azure) y AWS<\/li>\n<li>Dise\u00f1ado para organizaciones con flujos de trabajo existentes de certificados X.509<\/li>\n<li>La verificaci\u00f3n offline es sencilla \u2014 solo necesitas los certificados del almac\u00e9n de confianza<\/li>\n<\/ul>\n<h3>Limitaciones<\/h3>\n<ul>\n<li>Sin firma keyless \u2014 debes gestionar certificados y claves (incluso si se delegan a un KMS)<\/li>\n<li>Sin equivalente de registro de transparencia integrado<\/li>\n<li>El ecosistema de plugins a\u00fan est\u00e1 creciendo; menos plugins que los puntos de integraci\u00f3n de Cosign<\/li>\n<li>Comunidad m\u00e1s peque\u00f1a y menos tutoriales comparado con Cosign<\/li>\n<li>La configuraci\u00f3n de pol\u00edticas de confianza puede ser compleja para casos de uso simples<\/li>\n<\/ul>\n<h2>GPG: El Enfoque Tradicional<\/h2>\n<h3>Descripci\u00f3n General<\/h3>\n<p>GPG (GNU Privacy Guard) es el veterano del mundo de la firma. Mucho antes de que existieran las herramientas de firma nativas para contenedores, GPG se usaba para firmar todo, desde correos electr\u00f3nicos hasta commits de Git y paquetes de Linux. Algunos equipos a\u00fan usan GPG para firmar im\u00e1genes container, particularmente a trav\u00e9s de herramientas como Docker Content Trust (DCT) o firmando manifiestos de im\u00e1genes fuera de banda.<\/p>\n<h3>C\u00f3mo Funciona la Firma GPG para Contenedores<\/h3>\n<p>La firma GPG de contenedores t\u00edpicamente sigue uno de dos patrones:<\/p>\n<ul>\n<li><strong>Firma fuera de banda:<\/strong> Exporta el manifiesto o digest de la imagen, f\u00edrmalo con <code>gpg --detach-sign<\/code>, y almacena el archivo <code>.sig<\/code> junto a la imagen (en un almac\u00e9n de artefactos separado, bucket S3 o repositorio Git).<\/li>\n<li><strong>Integraci\u00f3n con Podman\/Skopeo:<\/strong> Podman y Skopeo tienen soporte nativo de firmas GPG. Las firmas se almacenan en un servidor de firmas separado (un servidor web que sirve firmas independientes) y se verifican al momento de la descarga usando un archivo de pol\u00edticas (<code>\/etc\/containers\/policy.json<\/code>).<\/li>\n<\/ul>\n<p>Docker Content Trust (DCT) utiliza un enfoque relacionado pero distinto basado en The Update Framework (TUF), con Notary v1 como backend. Aunque DCT usa primitivos criptogr\u00e1ficos diferentes al GPG puro, comparte el mismo desaf\u00edo fundamental: la gesti\u00f3n de claves de larga duraci\u00f3n.<\/p>\n<h3>Desaf\u00edos de la Gesti\u00f3n de Claves<\/h3>\n<p>La mayor debilidad de GPG en un contexto CI\/CD es la gesti\u00f3n de claves:<\/p>\n<ul>\n<li>Debes generar, distribuir, rotar y revocar pares de claves de larga duraci\u00f3n<\/li>\n<li>Las claves privadas necesitan ser inyectadas de forma segura en los runners de CI\/CD como secretos<\/li>\n<li>No hay mecanismo integrado de custodia o recuperaci\u00f3n de claves<\/li>\n<li>La distribuci\u00f3n de claves a los verificadores (nodos del cl\u00faster, controladores de admisi\u00f3n) requiere procesos manuales o un servidor de claves<\/li>\n<li>El compromiso de claves requiere rotaci\u00f3n de emergencia en todos los sistemas<\/li>\n<\/ul>\n<h3>Ejemplo de Integraci\u00f3n CI\/CD: GitLab CI con GPG<\/h3>\n<pre><code># .gitlab-ci.yml\nsign-image:\n  stage: sign\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache gnupg skopeo\n    - echo \"$GPG_PRIVATE_KEY\" | gpg --batch --import\n  script:\n    - skopeo copy \\\n        --sign-by signing-key@myorg.com \\\n        docker:\/\/registry.example.com\/myapp:${CI_COMMIT_SHORT_SHA} \\\n        docker:\/\/registry.example.com\/myapp:${CI_COMMIT_SHORT_SHA}\n  variables:\n    GPG_PRIVATE_KEY: $GPG_SIGNING_KEY  # Stored in CI\/CD variables\n<\/code><\/pre>\n<p>Observa c\u00f3mo la clave privada debe almacenarse como un secreto de CI\/CD e inyectarse en tiempo de ejecuci\u00f3n \u2014 exactamente el tipo de gesti\u00f3n de secretos de larga duraci\u00f3n que la firma keyless fue dise\u00f1ada para eliminar.<\/p>\n<h3>Fortalezas<\/h3>\n<ul>\n<li>Criptograf\u00eda probada en batalla \u2014 GPG ha sido auditado y endurecido durante d\u00e9cadas<\/li>\n<li>Funciona en entornos completamente air-gapped con cero dependencias externas<\/li>\n<li>Familiar para equipos de operaciones con experiencia en Linux\/seguridad<\/li>\n<li>Amplio soporte de herramientas en el ecosistema Podman\/Skopeo<\/li>\n<li>Control total sobre el material de claves (importante para ciertos marcos de cumplimiento)<\/li>\n<\/ul>\n<h3>Limitaciones<\/h3>\n<ul>\n<li>La gesti\u00f3n manual y propensa a errores de claves es la mayor carga operacional<\/li>\n<li>Sin modo keyless \u2014 las claves privadas deben estar en alg\u00fan lugar accesible para CI\/CD<\/li>\n<li>Sin almacenamiento nativo de artefactos OCI \u2014 las firmas se almacenan fuera de banda<\/li>\n<li>Sin registro de transparencia para pistas de auditor\u00eda<\/li>\n<li>La distribuci\u00f3n y descubrimiento de firmas est\u00e1 fragmentado<\/li>\n<li>Docker\/containerd no verifican nativamente las firmas GPG (requiere Podman\/Skopeo o herramientas personalizadas)<\/li>\n<\/ul>\n<h2>Comparaci\u00f3n Lado a Lado<\/h2>\n<table>\n<thead>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>Cosign (Sigstore)<\/th>\n<th>Notation (Notary v2)<\/th>\n<th>GPG<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Gesti\u00f3n de Claves<\/strong><\/td>\n<td>Keyless (OIDC) o pares de claves est\u00e1ticos<\/td>\n<td>Basado en plugins (KMS, HSM, almacenes cloud)<\/td>\n<td>Pares de claves PGP manuales<\/td>\n<\/tr>\n<tr>\n<td><strong>Firma Keyless<\/strong><\/td>\n<td>S\u00ed (Fulcio + OIDC)<\/td>\n<td>No<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><strong>Formato de Firma<\/strong><\/td>\n<td>Envelope JSON (in-toto\/DSSE)<\/td>\n<td>Firmas COSE (CBOR)<\/td>\n<td>Firmas PGP independientes<\/td>\n<\/tr>\n<tr>\n<td><strong>Almacenamiento de Firmas<\/strong><\/td>\n<td>Registro OCI (como artefactos OCI)<\/td>\n<td>Registro OCI (v\u00eda ORAS)<\/td>\n<td>Fuera de banda (servidor web, S3, Git)<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilidad con Registros OCI<\/strong><\/td>\n<td>Excelente \u2014 funciona con todos los registros principales<\/td>\n<td>Buena \u2014 requiere soporte de la API de referrers OCI 1.1<\/td>\n<td>Ninguna \u2014 firmas almacenadas externamente<\/td>\n<\/tr>\n<tr>\n<td><strong>Registro de Transparencia<\/strong><\/td>\n<td>S\u00ed (Rekor)<\/td>\n<td>No (planificado)<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><strong>Integraci\u00f3n CI\/CD<\/strong><\/td>\n<td>Excelente \u2014 GitHub Actions, GitLab CI, Tekton, soporte nativo OIDC<\/td>\n<td>Buena \u2014 GitHub Actions, funciona con cualquier CI v\u00eda plugins<\/td>\n<td>Manual \u2014 requiere inyecci\u00f3n de secretos de claves privadas<\/td>\n<\/tr>\n<tr>\n<td><strong>Pol\u00edticas de Kubernetes<\/strong><\/td>\n<td>Kyverno, OPA Gatekeeper, Sigstore Policy Controller<\/td>\n<td>Ratify (con Gatekeeper), Kyverno (limitado)<\/td>\n<td>Requiere webhook de admisi\u00f3n personalizado<\/td>\n<\/tr>\n<tr>\n<td><strong>Soporte Air-Gapped<\/strong><\/td>\n<td>Posible (requiere mirror de ra\u00edz TUF, mirror de Rekor)<\/td>\n<td>S\u00ed (sencillo con almac\u00e9n de confianza local)<\/td>\n<td>S\u00ed (totalmente capaz offline)<\/td>\n<\/tr>\n<tr>\n<td><strong>Ecosistema y Comunidad<\/strong><\/td>\n<td>Grande \u2014 Linux Foundation, Google, Red Hat, GitHub<\/td>\n<td>Creciendo \u2014 CNCF, Microsoft, AWS<\/td>\n<td>Maduro pero en declive para uso con contenedores<\/td>\n<\/tr>\n<tr>\n<td><strong>Curva de Aprendizaje<\/strong><\/td>\n<td>Baja (keyless) a Media (basada en claves con pol\u00edticas)<\/td>\n<td>Media a Alta (plugins, pol\u00edticas de confianza, PKI)<\/td>\n<td>Media (herramientas familiares, operaciones dolorosas)<\/td>\n<\/tr>\n<tr>\n<td><strong>Soporte de Attestations<\/strong><\/td>\n<td>S\u00ed (SBOM, provenance SLSA, predicados personalizados)<\/td>\n<td>S\u00ed (v\u00eda artefactos adjuntos ORAS)<\/td>\n<td>Sin soporte nativo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Matriz de Decisi\u00f3n: Cu\u00e1ndo Usar Cada Herramienta<\/h2>\n<p>Elegir la herramienta de firma correcta depende de tu contexto organizacional. Aqu\u00ed tienes un marco de decisi\u00f3n pr\u00e1ctico:<\/p>\n<h3>Elige Cosign Si:<\/h3>\n<ul>\n<li><strong>Est\u00e1s empezando desde cero<\/strong> con la firma de contenedores y quieres el camino m\u00e1s r\u00e1pido a producci\u00f3n.<\/li>\n<li><strong>Usas GitHub Actions, GitLab CI u otro sistema CI\/CD con capacidad OIDC<\/strong> \u2014 la firma keyless simplemente funciona.<\/li>\n<li><strong>Quieres un registro de transparencia<\/strong> para auditor\u00eda y cumplimiento sin construir uno t\u00fa mismo.<\/li>\n<li><strong>Est\u00e1s adoptando attestations SLSA o in-toto<\/strong> \u2014 Cosign tiene soporte de primera clase para adjuntar SBOMs y metadatos de provenance.<\/li>\n<li><strong>Quieres amplia integraci\u00f3n con pol\u00edticas de Kubernetes<\/strong> con Kyverno o Sigstore Policy Controller.<\/li>\n<li><strong>Eres una startup u organizaci\u00f3n mediana<\/strong> sin un equipo dedicado de PKI.<\/li>\n<\/ul>\n<p>Para una gu\u00eda completa sobre Sigstore y la firma keyless, consulta nuestra <a href=\"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/signing-verifying-container-images-sigstore-cosign\/\">Gu\u00eda de Firma Keyless con Sigstore y Cosign<\/a>.<\/p>\n<h3>Elige Notation Si:<\/h3>\n<ul>\n<li><strong>Tu organizaci\u00f3n tiene infraestructura PKI existente<\/strong> y flujos de trabajo de gesti\u00f3n de certificados X.509 que quieres aprovechar.<\/li>\n<li><strong>Est\u00e1s fuertemente invertido en Azure o AWS<\/strong> y quieres integraci\u00f3n nativa con Azure Key Vault o AWS Signer.<\/li>\n<li><strong>Necesitas pol\u00edticas de confianza granulares<\/strong> con alcance a registros, repositorios o equipos espec\u00edficos.<\/li>\n<li><strong>Los requisitos de cumplimiento exigen custodia espec\u00edfica de claves<\/strong> (FIPS 140-2, FedRAMP) donde la firma keyless no cumple el est\u00e1ndar.<\/li>\n<li><strong>Operas en un entorno donde la infraestructura p\u00fablica de Sigstore no es accesible<\/strong> pero tienes PKI interna.<\/li>\n<\/ul>\n<h3>Elige GPG Si:<\/h3>\n<ul>\n<li><strong>Est\u00e1s en un entorno completamente air-gapped<\/strong> sin dependencias de servicios externos permitidas.<\/li>\n<li><strong>Usas Podman\/Skopeo como tu runtime principal de contenedores<\/strong> y ya tienes infraestructura de claves GPG.<\/li>\n<li><strong>Los requisitos regulatorios exigen GPG espec\u00edficamente<\/strong> (raro, pero algunos contratos gubernamentales lo especifican).<\/li>\n<li><strong>Est\u00e1s firmando artefactos no-OCI<\/strong> junto con contenedores y quieres una \u00fanica herramienta de firma.<\/li>\n<\/ul>\n<p>Para la mayor\u00eda de los equipos que construyen aplicaciones cloud-native modernas, <strong>Cosign con firma keyless es la opci\u00f3n recomendada por defecto<\/strong>. Proporciona la mejor relaci\u00f3n seguridad-complejidad operacional y elimina la carga de gesti\u00f3n de claves que causa que la mayor\u00eda de las iniciativas de firma fracasen en la pr\u00e1ctica.<\/p>\n<h2>Patrones de Integraci\u00f3n CI\/CD<\/h2>\n<p>M\u00e1s all\u00e1 de los ejemplos individuales anteriores, aqu\u00ed hay patrones arquitect\u00f3nicos para integrar la firma en tu pipeline:<\/p>\n<h3>Patr\u00f3n 1: Firma en la Construcci\u00f3n (Cosign Keyless)<\/h3>\n<p>El patr\u00f3n m\u00e1s simple. El mismo job del pipeline que construye y publica la imagen tambi\u00e9n la firma. La firma keyless significa que no hay secretos que gestionar:<\/p>\n<pre><code>Build Image \u2192 Push to Registry \u2192 Cosign Sign (keyless) \u2192 Record in Rekor\n<\/code><\/pre>\n<p>Esto funciona perfectamente con GitHub Actions, GitLab CI 16.0+ y cualquier sistema CI que proporcione tokens OIDC. La identidad OIDC del pipeline <em>se convierte<\/em> en la identidad de firma, creando una cadena verificable desde el commit fuente hasta la imagen firmada.<\/p>\n<h3>Patr\u00f3n 2: Servicio de Firma Centralizado (Notation + KMS)<\/h3>\n<p>Para empresas que quieren separaci\u00f3n de responsabilidades, un servicio de firma centralizado recibe artefactos de construcci\u00f3n y los firma usando claves en un KMS:<\/p>\n<pre><code>Build Pipeline \u2192 Push to Registry \u2192 Request Signing \u2192 Notation Sign (KMS plugin) \u2192 Approval Workflow\n<\/code><\/pre>\n<p>Este patr\u00f3n habilita escenarios donde el equipo de construcci\u00f3n no puede firmar directamente \u2014 un equipo de seguridad separado o un motor de pol\u00edticas automatizado debe aprobar y firmar el artefacto. Las pol\u00edticas de acceso de AWS Signer y Azure Key Vault controlan qui\u00e9n puede solicitar firmas.<\/p>\n<h3>Patr\u00f3n 3: Puertas de Verificaci\u00f3n (Cualquier Herramienta)<\/h3>\n<p>Independientemente de qu\u00e9 herramienta de firma uses, el lado de la verificaci\u00f3n es igualmente importante. Implementa la verificaci\u00f3n en m\u00faltiples puntos:<\/p>\n<ul>\n<li><strong>Puerta de pre-despliegue:<\/strong> Un controlador de admisi\u00f3n de Kubernetes (Kyverno, Gatekeeper + Ratify, Sigstore Policy Controller) rechaza im\u00e1genes sin firmar o firmadas incorrectamente.<\/li>\n<li><strong>Puerta de promoci\u00f3n:<\/strong> Antes de promover una imagen del registro de staging al de producci\u00f3n, verifica su firma.<\/li>\n<li><strong>Auditor\u00eda en tiempo de ejecuci\u00f3n:<\/strong> Escanea peri\u00f3dicamente las cargas de trabajo en ejecuci\u00f3n y verifica que sus firmas a\u00fan sean v\u00e1lidas contra las pol\u00edticas de confianza actuales.<\/li>\n<\/ul>\n<h3>Estrategia Multi-Herramienta<\/h3>\n<p>Algunas organizaciones usan m\u00faltiples herramientas. Por ejemplo, Cosign para la firma del pipeline CI\/CD (conveniencia keyless) y Notation para la firma de releases (cumplimiento PKI empresarial). Ambas almacenan firmas como artefactos OCI, por lo que pueden coexistir en la misma imagen. Las pol\u00edticas de verificaci\u00f3n pueden requerir firmas de <em>ambas<\/em> herramientas antes de permitir el despliegue.<\/p>\n<h2>El Futuro de la Firma de Contenedores<\/h2>\n<p>El panorama de la firma de contenedores est\u00e1 convergiendo en varias tendencias importantes:<\/p>\n<ul>\n<li><strong>OCI 1.1 y la API de Referrers:<\/strong> La especificaci\u00f3n de distribuci\u00f3n OCI ahora soporta nativamente referencias de artefactos, que tanto Cosign como Notation aprovechan. Esto estandariza c\u00f3mo las firmas, SBOMs y attestations se adjuntan a las im\u00e1genes.<\/li>\n<li><strong>Attestations SLSA e in-toto:<\/strong> La firma est\u00e1 evolucionando m\u00e1s all\u00e1 de \u00abqui\u00e9n construy\u00f3 esto\u00bb para incluir provenance verificable de la construcci\u00f3n, manifiestos de dependencias y resultados de escaneos de seguridad \u2014 todo firmado y adjunto a la imagen.<\/li>\n<li><strong>Policy-as-Code:<\/strong> Herramientas como Kyverno y Gatekeeper est\u00e1n haciendo posible expresar requisitos complejos de firma como pol\u00edticas declarativas, reduciendo la brecha entre la intenci\u00f3n de seguridad y la aplicaci\u00f3n.<\/li>\n<li><strong>Adopci\u00f3n de Sigstore:<\/strong> Los principales ecosistemas de paquetes (npm, PyPI, Maven Central) est\u00e1n adoptando Sigstore, lo que aumenta la familiaridad y madurez de las herramientas en toda la industria.<\/li>\n<\/ul>\n<h2>Conclusi\u00f3n y Recomendaci\u00f3n<\/h2>\n<p>Las tres herramientas resuelven el problema fundamental de verificar la autenticidad de las im\u00e1genes container, pero sirven a diferentes contextos:<\/p>\n<ul>\n<li><strong>Cosign<\/strong> es la mejor opci\u00f3n para la mayor\u00eda de los equipos. La firma keyless elimina la carga operacional que mata las iniciativas de firma, el registro de transparencia proporciona capacidades de auditor\u00eda listas para usar, y la integraci\u00f3n del ecosistema es la m\u00e1s amplia. Si est\u00e1s iniciando una nueva iniciativa de firma de contenedores, comienza aqu\u00ed.<\/li>\n<li><strong>Notation<\/strong> es la elecci\u00f3n correcta para empresas con PKI establecida y requisitos espec\u00edficos de cumplimiento en torno a la custodia de claves. Su modelo de plugins y marco de pol\u00edticas de confianza est\u00e1n dise\u00f1ados para organizaciones que necesitan autoridad de firma granular y delegada.<\/li>\n<li><strong>GPG<\/strong> deber\u00eda reservarse para entornos legacy, sistemas completamente air-gapped o flujos de trabajo nativos de Podman donde las otras herramientas genuinamente no pueden usarse. Para nuevos despliegues, la carga operacional de la gesti\u00f3n de claves GPG es dif\u00edcil de justificar.<\/li>\n<\/ul>\n<p>Lo m\u00e1s importante es <strong>empezar a firmar<\/strong>. Una implementaci\u00f3n de firma imperfecta que realmente se despliega es infinitamente m\u00e1s valiosa que una perfecta que se queda en un roadmap. Elige la herramienta que coincida con las capacidades de tu equipo, implem\u00e9ntala en tu pipeline y agrega puertas de verificaci\u00f3n en Kubernetes. Siempre puedes evolucionar tus herramientas despu\u00e9s \u2014 el paso cr\u00edtico es establecer la pr\u00e1ctica.<\/p>\n<p>\u00bfListo para ponerte manos a la obra? Comienza con nuestra <a href=\"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/signing-verifying-container-images-sigstore-cosign\/\">Gu\u00eda de Firma Keyless con Sigstore<\/a> para los fundamentos conceptuales, luego trabaja a trav\u00e9s del <a href=\"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/lab-signing-verifying-container-images-cosign-github-actions\/\">Laboratorio de Firma Keyless con Cosign<\/a> para implementarlo en un pipeline real de GitHub Actions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por Qu\u00e9 Importa la Firma de Im\u00e1genes Container Cada vez que descargas una imagen container y la despliegas en producci\u00f3n, est\u00e1s depositando una confianza impl\u00edcita en ese artefacto. Pero, \u00bfc\u00f3mo verificas que la imagen no ha sido manipulada? \u00bfC\u00f3mo confirmas que fue realmente construida por tu pipeline CI\/CD y no inyectada por un atacante que &#8230; <a title=\"Herramientas de Firma de Im\u00e1genes Container Comparadas: Cosign vs Notation vs GPG\" class=\"read-more\" href=\"https:\/\/secure-pipelines.com\/es\/ci-cd-security\/container-image-signing-tools-compared-cosign-notation-gpg\/\" aria-label=\"Leer m\u00e1s sobre Herramientas de Firma de Im\u00e1genes Container Comparadas: Cosign vs Notation vs GPG\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55,59],"tags":[],"post_folder":[],"class_list":["post-613","post","type-post","status-publish","format-standard","hentry","category-ci-cd-security","category-software-supply-chain"],"_links":{"self":[{"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/posts\/613","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/comments?post=613"}],"version-history":[{"count":2,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/posts\/613\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/posts\/613\/revisions\/738"}],"wp:attachment":[{"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/media?parent=613"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/categories?post=613"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/tags?post=613"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/secure-pipelines.com\/es\/wp-json\/wp\/v2\/post_folder?post=613"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}