Criar um atestado de autorização binária em um pipeline do Cloud Build

Neste tutorial, mostramos como criar um atestado de autorização binária em um pipeline do Cloud Build. Essa configuração ajuda a garantir que apenas imagens de contêiner criadas e assinadas como parte do processo de criação do Cloud Build sejam automaticamente autorizadas para execução no ambiente de implantação.

Para saber como usar a verificação de vulnerabilidades do Container Analysis no pipeline de criação do Cloud Build, consulte Criar atestados com o Cupom ou Criar atestados com o Kritis Signer.

Visão geral do Cloud Build

O Cloud Build (visão geral) usa o código-fonte armazenado no Cloud Source Repositories ou em outro repositório hospedado, executa suas versões e testes e armazena as saídas de software resultantes no Container Registry ou outro serviço de armazenamento no Google Cloud Platform.

Visão geral da autorização binária

A autorização binária (visão geral) é um produto do Google Cloud com restrições de tempo de implantação em aplicativos. A integração do Google Kubernetes Engine (GKE) permite que os usuários imponham que os contêineres implantados em um cluster do Kubernetes sejam assinados criptograficamente por uma autoridade confiável e verificados por um atestador de autorização binária.

É possível configurar a autorização binária para exigir que os atestadores sejam baseados no local do código-fonte, para evitar a implantação de imagens de contêiner criadas de fonte não autorizada.

Para saber mais, faça o seguinte:

Arquitetura

O diagrama a seguir mostra os componentes em uma configuração de autorização binária/Cloud Build:

Pipeline de atestado da autorização binária do Cloud Build.
Figura 1. Pipeline do Cloud Build que cria um atestado de autorização binária.

Nesse pipeline:

  1. O código para criar a imagem do contêiner é enviado para um repositório de origem, como o Cloud Source Repositories.

  2. A ferramenta de integração contínua (CI, na sigla em inglês), o Cloud Build cria e testa o contêiner.

  3. A criação envia a imagem do contêiner para o Container Registry ou outro registro que armazena as imagens criadas.

  4. O Cloud Key Management Service, que fornece gerenciamento de chaves para o par de chaves criptográficas, assina a imagem do contêiner. Depois, a assinatura resultante é armazenada em um atestado recém-criado.

  5. No momento da implantação, o atestador verifica o atestado usando a chave pública do par de chaves. A autorização binária aplica a política ao exigir atestados assinados para implantar a imagem do contêiner.

Criar um atestado usando o Cloud Build com o Cloud Key Management Service

Esta seção mostra como implementar a arquitetura acima. Ele usa uma etapa de versão personalizada de código aberto da comunidade do Cloud Build. A etapa de versão personalizada assina uma imagem de contêiner, cria o atestado e a envia para a autorização binária.

Configurar o gerenciamento de identidade e acesso

Para usar essa etapa de versão, a conta de serviço do Cloud Build precisa dos seguintes papéis do IAM:

  • Visualizador do atestador de autorização binária
    • roles/binaryauthorization.attestorsViewer
  • Signatário/Verificador de CryptoKey do Cloud KMS (se estiver usando a chave no KMS para assinar o atestado)
    • roles/cloudkms.signerVerifier
  • Anexador de notas do Container Analysis
    • roles/containeranalysis.notes.attacher

Os seguintes comandos podem ser usados para adicionar os papéis à conta de serviço do Cloud Build do seu projeto:

  1. Ative o Cloud Build.

    Ative a API Cloud Build no projeto do Cloud de destinot.

  2. Salve o código do projeto em uma variável de ambiente:

    PROJECT_ID=PROJECT_ID
    

    em que PROJECT_ID é o ID do projeto no Google Cloud.

  3. Defina a CLI do Google Cloud do projeto:

    gcloud config set project ${PROJECT_ID}
    
  4. Consiga o número do projeto:

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. Adicione o papel Visualizador de atestador de autorização binária à conta de serviço do Cloud Build:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Adicione o papel Signatário/Verificador de CryptoKey do Cloud KMS à conta de serviço do Cloud Build (assinatura baseada em KMS):

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Adicione o papel Anexador de notas do Container Analysis à conta de serviço do Cloud Build:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/containeranalysis.notes.attacher
    

Criar e registrar a etapa de versão personalizada com o Cloud Build

  1. Clone o repositório da comunidade de compilação do Google Cloud:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Configure o signatário da autorização binária para o Cloud Build:

    Antes do uso, o código da etapa de versão personalizada precisa ser integrado a um contêiner e enviado ao Cloud Build. Para fazer isso, execute os seguintes comandos:

    cd cloud-builders-community/binauthz-attestation
    gcloud builds submit . --config cloudbuild.yaml
    

    A etapa de versão personalizada foi enviada ao Google Container Registry do seu projeto atual e agora está pronta para uso.

Criar um atestador na autorização binária

Crie um atestador que a autorização binária usará no momento da implantação para verificar o atestado.

Configure um atestador e um par de chaves do Cloud Key Management Service na autorização binária:

Consulte Criar um atestador usando a CLI.

Verificar se o atestador foi criado

   gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
   

Adicionar uma etapa de "criação de teste" ao seu cloudbuild.yaml

Para usar o binauthz-attestation, atualize seu cloudbuild.yaml adicionando a etapa que assinará a versão que foi enviada ao Container Registry.

Dois métodos são fornecidos abaixo:

  • Atualize seu cloudbuild.yaml manualmente.

  • Execute um pipeline de exemplo com as variáveis de ambiente definidas anteriormente.

Atualizar seu cloudbuild.yaml manualmente

  1. Atualize o cloudbuild.yaml manualmente adicionando a etapa de criação abaixo da etapa em que seu contêiner é enviado para o Container Registry. Observação: substitua ATTESTOR_NAME, KMS_KEY_LOCATION, KMSS_KEYRING_NAME, KMS_KEY_NAME e KMS_KEY_VERSION por seus próprios valores manualmente:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME'
        - '--keyversion'
        - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
    

    O seguinte também é válido:

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'ATTESTOR_NAME'
        - '--attestor-project'
        - '${PROJECT_ID}'
        - '--keyversion'
        - 'KEY_VERSION'
        - '--keyversion-project'
        - '${PROJECT_ID}'
        - '--keyversion-location'
        - 'KEY_LOCATION'
        - '--keyversion-keyring'
        - 'KEYRING_NAME'
        - '--keyversion-key'
        - 'KEY_NAME'
    

Opcional: teste o pipeline

Para testar um exemplo de pipeline de atestado do Cloud Build, execute as seguintes etapas:

  1. Crie um arquivo cloudbuild.yaml com as variáveis de ambiente definidas anteriormente:

    cd example
    cat <<EOM > cloudbuild_example.yaml
    steps:
      - id: 'build'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'build'
          - '-t'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '.'
      - id: 'publish'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'push'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
      - id: 'create-attestation'
        name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest'
        args:
          - '--artifact-url'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '--attestor'
          - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}'
          - '--keyversion'
          - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}'
    tags: ['cloud-builders-community']
    
    EOM
    
  2. Execute o Cloud Build com o exemplo cloudbuild_example.yaml:

    No diretório cloud-builders-community/binauthz-attestation/example, execute os seguintes comandos:

    gcloud builds submit . --config cloudbuild_example.yaml
    

A seguir