Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Esta es documentación inédita para Admission Controller 1.34-dev.

Formato de configuración de verificación

Introducción

Puedes utilizar el formato verification-config con:

  • policy-server para verificar la procedencia de los módulos de directivas

  • verify-image-signatures directiva para verificar la procedencia de las imágenes del clúster

Consulta sistema de suministro seguro para más información.

Formato

La configuración tiene 2 claves raíz:

  • allOf: Debes satisfacer toda la información de verificación listada aquí para verificar que las imágenes de contenedores están firmadas.

  • anyOf: Debes satisfacer al menos anyOf.minimumMatches de toda la información de verificación listada para aceptar una imagen de contenedor como firmada.

Estas dos claves raíz aceptan un array de claves de tipo kind. Una lista completa de claves aceptadas según diferentes casos de uso se encuentra a continuación:

  • pubKey: Para firmas realizadas con criptografía tradicional de clave pública/privada.

  • githubAction: Para firmas realizadas con el flujo de trabajo sin clave de Sigstore dentro de GitHub Actions. Admission Controller verifica esta información contra la extensión del certificado x509 workflow_repository creada por el OpenID Connect de GitHub, y no solo contra el issuer y el subject. Deberías utilizar este kind si trabajas con GitHub Actions.

  • genericIssuer: Para firmas realizadas con el flujo de trabajo sin clave de Sigstore, donde el usuario necesita validar el certificado issuer y subject por su cuenta. Acepta un subject, que puede ser:

    • equal: El valor pasado aquí debe coincidir exactamente con el subject en el certificado de firma.

    • urlPrefix: El valor pasado aquí se post-fija con / para prevenir el typo-squatting, y debe ser un prefijo del subject en el certificado de firma.

La clave kind acepta una clave opcional annotations, con una lista de pares clave-valor, que debe estar presente en la firma.

Ejemplo

Este es un ejemplo de una configuración para verificar firmas utilizando el flujo de trabajo de Sigstore:

---
apiVersion: v1

allOf:
  - kind: githubAction
    owner: kubewarden   # mandatory
    repo: policy-server # optional
    annotations:  # optional
      env: prod

anyOf: # at least `+anyOf.minimumMatches+` are required to match
  minimumMatches: 2 # default is 1
  signatures:
  - kind: pubKey
    owner: alice # optional
    key: | # mandatory
         -----BEGIN PUBLIC KEY-----
         MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQiTy5S+2JFvVlhUwWPLziM7iTM2j
         byLgh2IjpNQN0Uio/9pZOTP/CsJmXoUNshfpTUHd3OxgHgz/6adtf2nBwQ==
         -----END PUBLIC KEY-----
    annotations:  # optional
      env: prod
  - kind: genericIssuer
    issuer: https://github.com/login/oauth
    subject:
      equal: alice@example.com
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      equal: https://github.com/bob/app-example/.github/workflows/release.yml@refs/heads/main
    annotations:  # optional
      env: prod
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/bob # <- it will be post-fixed with `+/+` for security reasons

Referencia de configuración de firma

Puedes validar los requisitos de firma contenidos en un archivo. Expande para un ejemplo:

Un archivo de requisitos de firma
apiVersion: v1

allOf:
  - kind: githubAction
    owner: kubewarden   # mandatory
    annotations:
      env: prod

anyOf: # at least `+anyOf.minimumMatches+` are required to match
  minimumMatches: 2 # default is 1
  signatures:
  - kind: pubKey
    owner: flavio # optional
    key: .... # mandatory
    annotations:  # optional
      env: prod
      foo: bar
  - kind: pubKey
    owner: victor # optional
    key: .... # mandatory
  - kind: genericIssuer
    issuer: https://github.com/login/oauth
    subject:
      equal: alice@example.com
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      equal: https://github.com/flavio/policy-secure-pod-images/.github/workflows/release.yml@refs/heads/main
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/flavio/
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/kubewarden # <- it will be post-fixed with `+/+` for security reasons
  - kind: githubAction
    owner: flavio   # mandatory
    repo: policy1 # optional
  - kind: pubKey
    owner: alice # optional
    key: .... # mandatory

Validación de firma

La configuración anterior contiene las dos secciones, allOf y anyOf:

  • allOf: Confías en la directiva solo si todos los requisitos de firma son válidos.

  • anyOf: Confías en la directiva si el criterio minimumMatches es válido.

En el ejemplo, el campo minimumMatches es 2. Por lo tanto, necesitas cumplir al menos dos de los requisitos de firma. El valor por defecto para el campo minimumMatches es 1.

Para la validación de firma, necesitas cumplir todos los requisitos de la firma de allOf y el número mínimo de anyOf.

Validación de clave pública

Para comprobar que una directiva tiene la firma de clave pública correcta, especificas los datos de la clave y el propietario de la clave. En este ejemplo, estableces kind en pubKey y la key tiene la clave pública. El campo del propietario es opcional, pero puede ser útil para aclarar quién es el propietario de la clave.

  - kind: pubKey
    owner: bob # optional
    key: |
      -----BEGIN PUBLIC KEY-----
      MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
      BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
      -----END PUBLIC KEY-----

Validación de firma sin clave

Una directiva firmada en modo sin clave no tiene una clave pública que puedas verificar. Aún puedes verificar la directiva con los datos de OpenID Connect (OIDC) utilizados durante el proceso de firma. Para ello, es necesario definir la validación de la firma como genericIssuer.

Es posible verificar la información de la firma:

  • issuer(obligatorio): esto coincide con el atributo Issuer en el certificado generado por Fulcio. Esto muestra el OIDC utilizado para firmar la directiva.

  • subject: campo utilizado para coincidir con el atributo Subject en el certificado de Fulcio. El campo Subject (Fulcio) contiene el usuario utilizado para autenticar contra el proveedor de OIDC. El campo de verificación, subject, puede tener uno de dos subcampos:

    • equal: el Subject (Fulcio) del certificado debe ser igual al valor en la validación de la firma;

    • urlPrefix: el valor del campo Subject (Fulcio) del certificado debe estar precedido por el valor definido en la validación de la firma.

Tanto el cosign verify como el kwctl inspect pueden mostrar información sobre firmas sin clave.

Por ejemplo, esta configuración significa que la directiva debe tener una firma sin clave de Alice utilizando el OIDC de GitHub:

- kind: genericIssuer
  issuer: https://github.com/login/oauth
  subject:
    equal: alice@example.com

Esta configuración necesita que la directiva esté firmada en las acciones de GitHub, desde un repositorio propiedad del usuario de GitHub flavio:

- kind: genericIssuer
  issuer: https://token.actions.githubusercontent.com
  subject:
    urlPrefix: https://github.com/flavio

Verificación de la firma de acciones de GitHub

El "tipo", githubAction es para validar directivas firmadas en las acciones de GitHub. Puedes hacer esto también con el tipo genericIssuer. Para simplificar el proceso de requisitos de firma, utiliza dos campos adicionales para githubAction:

  • owner (obligatorio): ID de GitHub del usuario u organización en la que confiar.

  • repo: El nombre del repositorio en el que confiar.

Por ejemplo, el último fragmento, utilizando genericIssuer, podría reescribirse como:

- kind: githubAction
  owner: flavio

Validación de anotaciones de firma

Todos los tipos de firma pueden tener otros campos de validación opcionales, annotations. Estos campos son datos clave/valor añadidos durante el proceso de firma.

Con Admission Controller, puedes verificar que las firmas de directivas provienen de usuarios de confianza y tienen anotaciones específicas.

La siguiente validación comprueba dos condiciones para la directiva:

  • que está firmada con una clave específica

  • tiene una anotación de entorno de producción.

- kind: pubKey
  key: |
    -----BEGIN PUBLIC KEY-----
    MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
    BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
    -----END PUBLIC KEY-----
  annotations:
    environment: production

Utilizando un archivo de configuración de verificación de firma para comprobar un artefacto OCI de la directiva

Puedes probar si una directiva pasa la verificación utilizando el archivo de configuración de verificación. Utiliza la bandera --verification-config-path del comando kwctl verify.

$ cat signatures_requirements.yaml
apiVersion: v1
allOf:
  - kind: pubKey
    key: |
      -----BEGIN PUBLIC KEY-----
      MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5Q+cN1Jj2S7N05J4AXnqwP2DyzSg
      Mc+raYce2Wthrd30MSgFtoh5ADAkCd/nML2Nx8UD9KBuASRb0gG5jXqgMQ==
      -----END PUBLIC KEY-----

$ kwctl verify --verification-config-path signatures_requirements.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T17:34:37.847169Z  INFO kwctl::verify: Policy successfully verified

Este último ejemplo prueba si una directiva dada provino de la organización Admission Controller:

$ cat kubewarden_signatures.yaml
apiVersion: v1
allOf:
  - kind: githubAction
    owner: kubewarden

$ kwctl verify --verification-config-path kubewarden_signatures.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T18:07:39.062292Z  INFO kwctl::verify: Policy successfully verified