Crie uma atestação de autorização binária num pipeline do Cloud Build

Este tutorial mostra como criar uma atestação de autorização binária num pipeline do Cloud Build. Esta configuração ajuda a garantir que apenas as imagens de contentores criadas e assinadas como parte do processo de criação do Cloud Build são autorizadas automaticamente a serem executadas no seu ambiente de implementação.

Vista geral do Cloud Build

O Cloud Build (vista geral) usa código fonte armazenado nos Cloud Source Repositories ou noutro repositório alojado, executa as suas compilações e testes, e armazena os resultados de software no Container Registry ou noutro serviço de armazenamento na Google Cloud Platform.

Vista geral da autorização binária

A autorização binária (vista geral) é um Google Cloud produto que aplica restrições de implementação às aplicações. A sua integração com o Google Kubernetes Engine (GKE) permite que os utilizadores apliquem que os contentores implementados num cluster do Kubernetes sejam assinados criptograficamente por uma autoridade fidedigna e validados por um atestador da autorização binária.

Pode configurar a autorização binária para exigir atestações com base na localização do código fonte para impedir a implementação de imagens de contentores criadas a partir de origens não autorizadas.

Para saber mais:

Arquitetura

O diagrama seguinte mostra os componentes numa configuração de autorização binária/Cloud Build:

Pipeline de atestação da Autorização binária do Cloud Build.
Figura 1. Pipeline do Cloud Build que cria uma atestação da Binary Authorization.

Neste pipeline:

  1. O código para criar a imagem de contentor é enviado para um repositório de origem, como os Cloud Source Repositories.

  2. Uma ferramenta de integração contínua (CI), o Cloud Build, compila e testa o contentor.

  3. A compilação envia a imagem de contentor para o Container Registry ou outro registo que armazena as imagens compiladas.

  4. O Cloud Key Management Service, que fornece a gestão de chaves para o par de chaves criptográficas, assina a imagem do contentor. A assinatura resultante é, em seguida, armazenada numa atestação criada recentemente.

  5. No momento da implementação, o atestador valida a atestação através da chave pública do par de chaves. A autorização binária aplica a política exigindo atestações assinadas para implementar a imagem do contentor.

Crie uma atestação com o Cloud Build e o Cloud Key Management Service

Esta secção mostra como implementar a arquitetura acima. Usa um passo de compilação personalizado de código aberto da comunidade do Cloud Build. O passo de compilação personalizado assina uma imagem de contentor, cria a atestação e carrega-a para a autorização binária.

Configure a gestão de identidade e de acesso

Para usar este passo de compilação, a conta de serviço do Cloud Build precisa das seguintes funções do IAM:

  • Visualizador de atestadores da Autorização binária
    • roles/binaryauthorization.attestorsViewer
  • Signer/Verifier de CryptoKey do Cloud KMS (se usar a chave no KMS para assinar a atestação)
    • roles/cloudkms.signerVerifier
  • Artifact Analysis Notes Attacher
    • roles/containeranalysis.notes.attacher

Pode usar os seguintes comandos para adicionar as funções à conta de serviço do Cloud Build do seu projeto:

  1. Ative o Cloud Build:

    Ative a API Cloud Build no projeto Google Cloud de destino.

  2. Guarde o ID do projeto numa variável de ambiente:

    PROJECT_ID=PROJECT_ID
    

    onde PROJECT_ID é o Google Cloud ID do projeto.

  3. Defina o projeto da CLI Google Cloud:

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

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. Adicione a função de visitante do atestador da 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 a função de signatário/validador de CryptoKey do Cloud KMS à conta de serviço do Cloud Build (assinatura baseada no KMS):

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Adicione a função de anexador de notas da análise de artefactos à 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
    

Crie e registe o passo de criação personalizado com o Cloud Build

  1. Clone o repositório da comunidade do Google Cloud Build:

    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 da utilização, o código do passo de compilação personalizado tem de ser compilado num contentor e enviado para o Cloud Build. Para o fazer, execute os seguintes comandos:

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

    O passo de compilação personalizado foi enviado para o Google Container Registry do seu projeto atual e já está pronto a ser usado.

Crie um atestador na Autorização binária

Crie um atestador que a autorização binária vai usar no momento da implementação para validar a atestação.

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

Consulte o artigo Crie um atestador através da CLI

Confirme se o atestador foi criado

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

Adicione um passo "create-attestation" ao seu cloudbuild.yaml

Para usar o passo binauthz-attestation, tem de atualizar o seu cloudbuild.yaml adicionando o passo que vai assinar a compilação enviada para o Container Registry.

São apresentados dois métodos abaixo:

  • Atualize o cloudbuild.yaml manualmente.

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

Atualize o cloudbuild.yaml manualmente

  1. Atualize o cloudbuild.yaml manualmente adicionando o passo de compilação abaixo após o passo em que o contentor é carregado para o registo de contentores. Nota: tem de substituir ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME e KMS_KEY_VERSION pelos 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 a conduta

Para testar um exemplo de pipeline de atestação do Cloud Build, siga os seguintes passos:

  1. Crie um ficheiro cloudbuild.yaml com as variáveis de ambiente que definiu 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
    

O que se segue?