Criar atestados com o OpenSSF Scorecard

Neste tutorial, demonstramos como usar o OpenSSF Scorecard para verificar imagens de contêiner de práticas recomendadas de segurança da cadeia de suprimentos. O Scorecard Attestor é executado como parte do pipeline do Cloud Build para gerar um atestado que pode ser verificado pela autorização binária antes da implantação. Essa etapa de verificação impede a implantação de artefatos de contêiner comprometidos na produção, o que previne várias classes de vulnerabilidades da cadeia de suprimentos.

Visão geral

A Open Source Security Foundation (OpenSSF) é uma organização que oferece ferramentas, serviços e infraestrutura para iniciativas de segurança de código aberto. O Scorecard é uma ferramenta, mantida pelo OpenSSF, que verifica os repositórios de gerenciamento de código-fonte (SCM, na sigla em inglês) em busca de práticas recomendadas de segurança da cadeia de suprimentos.

O Scorecard Attestor é uma ferramenta integrada ao Scorecard que permite criar atestados de autorização binária com base em uma política que você configurar. O Scorecard Attestor executa o Scorecard no repositório SCM de uma imagem de contêiner, gera resultados, avalia os resultados em relação à política e gera um atestado se a política é cumprida.

Neste tutorial, você cria um repositório de amostra e depois usa o Scorecard Attestor. Cada pipeline de amostra contém estas etapas de criação:

  1. build: criar uma imagem de contêiner de amostra.
  2. push: enviar a imagem ao Container Registry.
  3. attest: verificar e assinar a imagem usando o Scorecard Attestor para criar um atestado com base na política.

Na etapa attest de cada pipeline, o Scorecard Attestor executa estas ações:

  1. Busca dados sobre o repositório SCM para a imagem de contêiner recém-criada.
  2. Executa o Scorecard nos dados brutos e avalia o repositório SCM em relação à política especificada pelo usuário.
    1. Se todas as políticas são cumpridas, o Scorecard Attestor cria o atestado.
    2. Se alguma das políticas não é atendida, o Scorecard Attestor não cria o atestado.

No momento da implantação, a autorização binária verifica se há um atestado verificável. Sem um, o aplicador impede a implantação da imagem.

Custos

Neste tutorial, usamos os seguintes produtos do Google Cloud.

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

Use a Calculadora de preços para gerar uma estimativa de custo com base no uso previsto.

Objetivos

Neste tutorial, você realizará as seguintes ações:

  1. Configurar o Scorecard Attestor como um builder personalizado do Cloud Build.
  2. Ver e configurar a política do Scorecard Attestor.
  3. Executar o Scorecard Attestor em um repositório de amostra para criar um atestado com base em uma política.
  4. Executar o Scorecard Attestor em um repositório de amostra no modo somente verificação sem criar um atestado. ## Antes de começar

Nesta seção, você fará uma configuração única do sistema.

Configure o ambiente

  1. Armazene o projeto do Google Cloud em uma variável de ambiente.

    export PROJECT_ID=PROJECT_ID
    

    Substitua PROJECT_ID pelo ID do projeto do Google Cloud.

  2. Defina o ID do projeto padrão para o projeto do Google Cloud:

    gcloud config set project $PROJECT_ID
    
  3. Armazene o número do projeto em uma variável de ambiente para etapas futuras:

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. Ative APIs:

    Para garantir que os serviços necessários para este guia estejam ativados, execute o seguinte comando:

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

Configurar papéis do IAM

Execute os seguintes comandos para configurar a conta de serviço do Cloud Build com os seguintes papéis:

  • containeranalysis.notes.editor: adiciona o papel de Editor de notas do Artifact Analysis para o gerenciamento do atestador.
  • containeranalysis.notes.occurrences.viewer: adiciona o papel de Ocorrências do Artifact Analysis para notas para o gerenciamento das ocorrências de vulnerabilidade e de atestado.
  • roles/containeranalysis.occurrences.editor: adiciona o papel de Editor de ocorrências do Artifact Analysis para a criação de ocorrências de atestado no Artifact Analysis.
  • cloudkms.signer: adiciona o papel Signatário de CryptoKey do Cloud KMS que permite que a conta de serviço acesse o serviço de assinatura do Cloud KMS.

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

Criar uma chave de assinatura do Cloud KMS

As chaves do Cloud Key Management Service são usadas para criar o atestado.

  1. Crie um novo keyring do Cloud KMS com o nome scorecard-attestor-key-ring:

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. Crie uma nova chave do Cloud KMS chamada scorecard-attestor-key no keyring:

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. Armazene o algoritmo de resumo e o Cloud KMS em uma variável de ambiente para etapas futuras:

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Crie o atestador de autorização binária. Mais tarde, o Scorecard Attestor cria uma nota associada a esse atestador.

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Associe o atestador de autorização binária à chave KMS:

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

Para conhecer outros algoritmos de assinatura, consulte Como criar chaves assimétricas.

Criar atestados com o Scorecard Attestor em um pipeline do Cloud Build

Enviar a amostra de amostra do caso de falha

Nesta seção, você cria uma imagem de contêiner e verifica as práticas de segurança da cadeia de suprimentos com a OpenSSF Scorecard. A imagem é criada, mas não cria um atestado. O repositório de base contém algumas práticas não recomendadas de segurança da cadeia de suprimentos, como uma dependência liberada para o Debian 10 no Dockerfile e um artefato binário compilado verificado no repositório de origem. Essas são violações da política de atestado no repositório.

  1. Clone o repositório de teste scorecard-binauthz-test-bad.

  2. Veja o arquivo da política do atestado para o caso de falha.

    cat policy-binauthz.yaml
    
  3. (Opcional) Veja o arquivo de configuração da compilação no caso de falha.

    cat samples/signer/cloudbuild.yaml
    
  4. Envie o build:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

O resultado será assim:

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. Salve o ID da criação mais recente:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. Verificar o resultado:

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

Envie a amostra de amostra do caso de sucesso

Nesta seção, você cria uma imagem de contêiner que cumpre a política do atestado do Scorecard. Nesse caso, o Scorecard Attestor cria um atestado.

Para enviar a amostra da compilação do caso de sucesso para o Cloud Build, faça o seguinte:

  1. Clone o repositório de teste: scorecard-binauthz-test-good.

  2. Veja o arquivo da política do atestado para o caso de falha. sh cat policy-binauthz.yaml

  3. (Opcional) Veja o arquivo de configuração da compilação no caso de falha.

    cat samples/signer/cloudbuild.yaml
    
  4. Envie o build:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. Verificar o resultado:

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Encontre o URL da imagem do contêiner que foi criada e verificada pelo Scorecard

    export IMAGE_URI=$(gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. Confirme se um atestado foi criado para a imagem do contêiner. O Scorecard Attestor usa o ID da nota ossf-scorecard-attestation e o nome da nota projects/${PROJECT_ID}/notes/ossf-scorecard-attestation.

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

Limpar

Para limpar os recursos usados neste documento, exclua o projeto:

gcloud projects delete $PROJECT_ID

A seguir