Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official.

Esta é uma documentação não divulgada para Admission Controller 1.34-dev.

Formato de configuração de verificação

Introdução

Você pode usar o formato verification-config com:

  • policy-server para verificar a proveniência dos módulos de política

  • verify-image-signatures política para verificar a proveniência das imagens do cluster

Consulte cadeia de suprimento segura para mais informações.

Formato

A configuração possui 2 chaves raiz:

  • allOf: Você deve satisfazer todas as informações de verificação listadas aqui para verificar as imagens de contêiner como assinadas.

  • anyOf: Você deve satisfazer pelo menos anyOf.minimumMatches de todas as informações de verificação listadas para aceitar uma imagem de contêiner como assinada.

Essas duas chaves raiz aceitam um array de chaves do tipo kind. Uma lista completa de chaves aceitas com base em diferentes casos de uso está abaixo:

  • pubKey: Para assinaturas realizadas com criptografia tradicional de chave pública/privada.

  • githubAction: Para assinaturas realizadas com o fluxo de trabalho sem chave do Sigstore dentro do GitHub Actions. Admission Controller verifica essas informações contra a extensão do certificado x509 workflow_repository criada pelo OpenID Connect do GitHub, e não apenas o issuer e subject. Você deve usar este kind se estiver lidando com o GitHub Actions.

  • genericIssuer: Para assinaturas realizadas com o fluxo de trabalho sem chave do Sigstore, onde o usuário precisa validar o certificado issuer e subject por conta própria. Aceita um subject, que pode ser:

    • equal: O valor passado aqui deve corresponder exatamente ao subject no certificado de assinatura.

    • urlPrefix: O valor passado aqui é post-fixado com / para evitar squatting de digitação, e deve ser um prefixo do subject no certificado de assinatura.

A chave kind aceita uma chave opcional annotations, com uma lista de pares chave-valor, que deve estar presente na assinatura.

Exemplo

Este é um exemplo de uma configuração para verificar assinaturas usando o fluxo de trabalho do 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

Referência de configuração de assinatura

Você pode validar os requisitos de assinatura contidos em um arquivo. Expandir para um exemplo:

Um arquivo de requisitos de assinatura
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

Validação de assinatura

A configuração anterior contém as duas seções, allOf e anyOf:

  • allOf: Você confia na política apenas se todos os requisitos de assinatura forem válidos.

  • anyOf: Você confia na política se o critério minimumMatches for válido.

No exemplo, o campo minimumMatches é 2. Portanto, você precisa atender a pelo menos dois dos requisitos de assinatura. O valor padrão para o campo minimumMatches é 1.

Para a validação da assinatura, é necessário atender a todos os requisitos especificados em allOf e ao número mínimo definido em anyOf.

Validação de chave pública

Para verificar se uma política tem a assinatura correta da chave pública, você especifica os dados da chave e o proprietário da chave. Neste exemplo, você define kind como pubKey e a key possui a chave pública. O campo do proprietário é opcional, mas pode ser útil para esclarecer quem possui a chave.

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

Validação de assinatura sem chave

Uma política assinada em modo sem chave não tem uma chave pública que você possa verificar. Você ainda pode verificar a política com os dados do OpenID Connect (OIDC) usados durante o processo de assinatura. Para isso, é necessário definir a validação da assinatura como genericIssuer.

É possível verificar informações da assinatura:

  • issuer(obrigatório): isso corresponde ao atributo Issuer no certificado gerado pelo Fulcio. Isso mostra o OIDC usado para assinar a política.

  • subject: campo usado para corresponder ao atributo Subject no certificado do Fulcio. O campo Subject (Fulcio) contém o usuário usado para autenticar contra o provedor OIDC. O campo de verificação, subject, pode ter um de dois subcampos:

    • equal: o Subject (Fulcio) do certificado deve ser igual ao valor na validação da assinatura;

    • urlPrefix: o valor do campo Subject (Fulcio) do certificado deve ser precedido pelo valor definido na validação da assinatura.

Tanto o cosign verify quanto o kwctl inspect podem mostrar informações sobre assinaturas sem chave.

Por exemplo, essa configuração significa que a política deve ter uma assinatura sem chave da Alice usando o OIDC do GitHub:

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

Essa configuração precisa da política assinada nas ações do GitHub, de um repositório pertencente ao usuário do GitHub flavio:

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

Verificação de assinatura das ações do GitHub

O "tipo", githubAction é para validar políticas assinadas nas Ações do GitHub. Você pode fazer isso com o tipo genericIssuer também. Para simplificar o processo de exigência de assinatura, use dois campos extras para githubAction:

  • owner (obrigatório): ID do GitHub do usuário ou organização a ser confiável.

  • repo: O nome do repositório a ser confiável.

Por exemplo, o último trecho, usando genericIssuer, poderia ser reescrito como:

- kind: githubAction
  owner: flavio

Validação de anotações de assinatura

Todos os tipos de assinatura podem ter outros campos de validação opcionais, annotations. Esses campos são dados chave/valor adicionados durante o processo de assinatura.

Com Admission Controller, você pode verificar se a assinatura da política provém de usuários confiáveis e possui anotações específicas.

A próxima validação verifica duas condições para a política:

  • que está assinada com uma chave específica

  • tem uma anotação de ambiente de produção.

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

Usando um arquivo de configuração de verificação de assinatura para verificar um artefato OCI da política.

Você pode testar se uma política passa na verificação usando o arquivo de configuração de verificação. Use a flag --verification-config-path do 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 exemplo testa se uma determinada política veio da organização 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