Integração com o Cloud Build

Nesta página, você encontra uma visão geral de como configurar a autorização binária com o 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 informações sobre como adicionar a verificação de vulnerabilidades ao pipeline de criação do Cloud Build, consulte Verificação de vulnerabilidades com o Container Analysis e o Krris Signer.

Visão geral

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.

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 8. Diagrama de um pipeline de atestado de autorização binária do Cloud Build.

Na Figura 1, (1) o código é enviado para um repositório. (2) Um pipeline de integração contínua (CI, na sigla em inglês), como o Cloud Build, cria e testa o contêiner. (3) A imagem do contêiner recém-criada é enviada ao Container Registry. (4) O Cloud Key Management Service assina a imagem do contêiner e (5) cria um atestado e a armazena na autorização binária.

Os componentes são:

  • Cloud Source Repositories ou outro repositório seguro que contenha o código-fonte usado para criar uma imagem de contêiner.

  • Cloud Build, que executa compilações e testes e gera a imagem do contêiner para o Container Registry ou outro registro de software que armazena as imagens criadas.

  • Container Registry, um registro de imagem de contêiner particular executado no Google Cloud.

  • Cloud Key Management Service, que fornece gerenciamento de chaves para o par de chaves criptográficas. O par de chaves compreende uma chave privada e uma chave pública. A chave privada é usada para assinar uma imagem de contêiner. Depois, a assinatura resultante é armazenada em um atestado recém-criado. No momento da implantação, o atestado é verificado por um atestador que inclui a chave pública do par de chaves.

  • autorização binária, que impõe a política que exige atestados assinados antes da implantação de uma imagem de contêiner.

Criar um atestado de autorização binária 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 ferramenta de linha de comando do projeto gcloud:

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

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT}" --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} \
      --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} \
      --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} \
      --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