Crie atestações com a tabela de dados da OpenSSF

Este tutorial demonstra como usar o OpenSSF Scorecard para verificar se as imagens de contentores seguem as práticas recomendadas de segurança da cadeia de fornecimento. O atestador do Scorecard é executado como parte do pipeline do Cloud Build para gerar uma atestação que pode ser validada pela autorização binária antes da implementação. Este passo de validação impede a implementação de artefactos de contentores comprometidos na produção, o que pode evitar várias classes de vulnerabilidades da cadeia de fornecimento.

Vista geral

A Open Source Security Foundation (OpenSSF) é uma organização que fornece ferramentas, serviços e infraestrutura para iniciativas de segurança de código aberto. O Scorecard é uma ferramenta, mantida pela OpenSSF, que analisa repositórios de gestão de código fonte (SCM) para verificar as práticas recomendadas de segurança da cadeia de fornecimento.

O Scorecard Attestor é uma ferramenta integrada no Scorecard que lhe permite criar atestações de autorização binária com base numa política que configura. O atestador da tabela de dados executa a tabela de dados no repositório SCM de uma imagem de contentor, gera resultados, avalia os resultados em função da política e gera uma atestação se a política for cumprida.

Neste tutorial, vai criar um repositório de exemplo e, em seguida, usar o Scorecard Attestor. Cada pipeline de exemplo contém os seguintes passos de compilação:

  1. build: crie uma imagem de contentor de amostra.
  2. push: envie a imagem para o Container Registry.
  3. attest: verifique e assine a imagem através do atestador do Scorecard para criar uma atestação com base na política.

No attest passo de cada pipeline, o Scorecard Attestor faz o seguinte:

  1. Obtém dados sobre o repositório SCM para a imagem de contentor criada recentemente.
  2. Executa a tabela de dados no dados não processados e avalia o repositório de SCM em função da política especificada pelo utilizador.
    1. Se todas as políticas forem cumpridas, o atestador da tabela de dados cria a atestação.
    2. Se alguma das políticas não for cumprida, o atestador do cartão de pontuação não cria a atestação.

No momento da implementação, a Binary Authorization verifica se existe uma atestação validável. Sem um, o aplicador impede a implementação da imagem.

Custos

Este tutorial usa os seguintes Google Cloud produtos.

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

Use a calculadora de preços para gerar uma estimativa de custo com base na sua utilização prevista.

Objetivos

Neste tutorial, faz o seguinte:

  1. Configure o Scorecard Attestor como um criador personalizado do Cloud Build.
  2. Veja e configure a política do atestador da tabela de dados.
  3. Execute o Scorecard Attestor num repositório de amostras para criar uma atestação com base numa política.
  4. Execute o Scorecard Attestor num repositório de exemplo no modo de validação apenas sem criar uma atestação. ## Antes de começar

Nesta secção, faz uma configuração única do sistema.

Configure o seu ambiente

  1. Armazene o seu Google Cloud projeto numa variável de ambiente.

    export PROJECT_ID=PROJECT_ID
    

    Substitua PROJECT_ID pelo seu Google Cloud projeto.

  2. Defina o ID do projeto predefinido para o seu Google Cloud projeto:

    gcloud config set project $PROJECT_ID
    
  3. Armazene o número do projeto numa variável de ambiente para passos futuros:

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

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

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

Configure funções de IAM

Execute os seguintes comandos para configurar a conta de serviço do Cloud Build com as seguintes funções:

  • containeranalysis.notes.editor: adiciona a função Editor de notas de análise de artefactos para gerir o atestador.
  • containeranalysis.notes.occurrences.viewer: adiciona a função Artifact Analysis Occurrences for Notes para gerir as ocorrências de atestação e vulnerabilidade.
  • roles/containeranalysis.occurrences.editor: adiciona a função Editor de ocorrências da análise de artefactos para criar ocorrências de atestação na análise de artefactos.
  • cloudkms.signer: adiciona a função de signatário de CryptoKey do Cloud KMS que permite à conta de serviço aceder ao 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
    

Crie uma chave de assinatura do Cloud KMS

As chaves do Cloud Key Management Service são usadas para criar a atestação.

  1. Crie um novo conjunto de chaves 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 denominada scorecard-attestor-key no conjunto de chaves:

    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 numa variável de ambiente para os passos futuros:

    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 da autorização binária. Posteriormente, o atestador do Scorecard cria uma nota associada a este 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 da autorização binária à chave do 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 explorar outros algoritmos de assinatura, consulte o artigo Criar chaves assimétricas.

Crie atestações com o Scorecard Attestor num pipeline do Cloud Build

Envie a compilação de exemplo do caso de falha

Nesta secção, cria uma imagem de contentor e verifica as respetivas práticas de segurança da cadeia de abastecimento com o OpenSSF Scorecard. A imagem é criada com êxito, mas não cria uma atestação. O repositório base contém algumas práticas de segurança da cadeia de fornecimento desaconselhadas, como uma dependência não fixada no Debian 10 no Dockerfile e um artefacto binário compilado registado no repositório de origem. Estas são violações da política de atestação no repositório.

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

  2. Veja o ficheiro de política de atestação para o caso de falha.

    cat policy-binauthz.yaml
    
  3. (Opcional) Veja o ficheiro de configuração de compilação para o caso de falha.

    cat samples/signer/cloudbuild.yaml
    
  4. Envie a compilação:

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

Deverá ver um resultado semelhante ao seguinte:

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. Guarde o ID da compilação da última compilação:

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

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

Envie a compilação de exemplo do registo de êxito

Nesta secção, cria uma imagem de contentor que satisfaz a respetiva política de atestação da Scorecard. Neste caso, o atestador da tabela de dados cria uma atestação.

Para enviar a compilação de exemplo do caso de êxito para o Cloud Build, faça o seguinte:

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

  2. Veja o ficheiro de política de atestação para o caso de falha. sh cat policy-binauthz.yaml

  3. (Opcional) Veja o ficheiro de configuração de compilação para o caso de falha.

    cat samples/signer/cloudbuild.yaml
    
  4. Envie a compilação:

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

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Obtenha o URL da imagem do contentor criada e verificada pela tabela de pontuação

    export IMAGE_URI=$(gcloud storage 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 foi criada uma atestação para a imagem do contentor. O atestador do cartão de pontuação 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, pode eliminar o projeto:

gcloud projects delete $PROJECT_ID

O que se segue?