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 Artifact Analysis no pipeline de criação do Cloud Build, consulte Criar atestados com o Voucher 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:
- Uma introdução geral à autorização binária
- Codelab: como proteger suas implantações do GKE com autorização binária
Arquitetura
O diagrama a seguir mostra os componentes em uma configuração de autorização binária/Cloud Build:
Nesse pipeline:
O código para criar a imagem do contêiner é enviado para um repositório de origem, como o Cloud Source Repositories.
A ferramenta de integração contínua (CI, na sigla em inglês), o Cloud Build cria e testa o contêiner.
A criação envia a imagem do contêiner para o Container Registry ou outro registro que armazena as imagens criadas.
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.
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 Artifact 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:
Ative o Cloud Build.
Ative a API Cloud Build no projeto do Google Cloud de destino.
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.
Defina a CLI do Google Cloud do projeto:
gcloud config set project ${PROJECT_ID}
Consiga o número do projeto:
PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
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
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
Adicione o papel Anexador de notas do Artifact 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
Clone o repositório da comunidade de compilação do Google Cloud:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
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
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:
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
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
- Criar atestados após verificar uma imagem em busca de vulnerabilidades usando o Kritis Signer ou o Cupom.
- Criar uma etapa personalizada do Cloud Build para assinar e fazer upload de atestados de autorização binária no GitHub.