Assinando artefatos sem imagem

A cadeia de ferramentas do DevSecOps oferece a capacidade de assinar artefatos que não sejam imagens, limitando-se a formatos de arquivo como tar e zip. Esse processo envolve usar um script em conjunto com o script de assinatura padrão. Se for necessário assinar artefatos diferentes de arquivos tar e zip, você deverá fornecer uma implementação customizada do script Use a propriedade de texto " skip-sign-artifact-type " para ignorar a assinatura de imagens para os tipos de artefato especificados (por exemplo: log; relatório; documentação).

O ambiente de tempo de execução necessário deve estar disponível na imagem para suportar o processo de assinatura.

Antes de Iniciar

Antes de iniciar com a assinatura de artefato sem imagem, deve-se ter os pré-requisitos a seguir.

  1. Para assinar um artefato, você deve ter a chave privada GPG. Para gerar uma chave, é possível usar a documentação..

  2. Seu arquivo .pipline-config.yaml deve ser atualizado com a configuração de estágio a seguir

    sign-artifact:
       image: icr.io/continuous-delivery/pipeline/image-signing:1.0.0@sha256:e9d8e354668ba3d40be2aaee08298d2aa7f0e1c8a1829cca4094ec93830e3e6a
       image_pull_policy: IfNotPresent
       abort_on_failure: false
       dind: true
       script: |
          #!/usr/bin/env bash
          source ${COMMONS_PATH}/sign-artifact/sign-artifacts.sh
    
  3. Por padrão, o script sign-artifacts pode assinar todos os artefatos listados na coleção list_artifacts. Certifique-se de que seus artefatos estejam armazenados e integrados corretamente

    1. Assegure-se de armazenar artefatos construídos no tempo de execução do pipeline Cocoa. Isso pode ser feito de uma das duas maneiras a seguir.

      • Use a ferramenta save_file para salvar o arquivo tar do artefato, o que permite a recuperação em estágios subsequentes

        save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz"
        
      • Armazene artefatos em um local designado, com o nome do artefato que corresponde ao nome do app.

        location="$(basename $(pwd))"
        
    2. Integre o artefato salvo no tempo de execução do Cocoa usando o codesnippet a seguir como um guia.

      save_artifact "${APP_NAME}" \
         type=tar \
         "name=${APP_NAME}-${VERSION}.tgz" \
         "digest=${DIGEST}" \
         "location=${location}" \
         "provenance=${APP_NAME}-${VERSION}.tgz@${DIGEST}"
      

Assinando artefatos sem imagem

O script padrão emprega o cliente GPG para propósitos de assinatura Durante esta fase, todos os artefatos passam pelo processo de assinatura. Após o artefato ser assinado, o script armazena o artefato e a assinatura no tempo de execução do pipeline Cocoa.

Etapas de pós-assinatura

Para recuperar o artefato assinado e sua assinatura correspondente, é possível usar a seguinte abordagem.

signed_artifact=$(mktemp)
if load_file "${artifact}_signed_artifact" >"${signed_artifact}" 2> /dev/null; then
    echo "Loaded the signed artifact ${artifact} from load_file at the ${signed_artifact}"
else
    artifact_location="$(load_artifact "$artifact" "location")"
    cp "${WORKSPACE}/${artifact_location}/${name}" "${signed_artifact}"
    echo "Loaded the artifact at the ${WORKSPACE}/${artifact_location}/${name}"   
fi
artifact_signature=$(mktemp)
if load_file "${artifact}_signature" >"${artifact_signature}" 2> /dev/null; then
    echo "Loaded the signature of ${artifact} from load_file at the ${artifact_signature}"
fi

Se precisar armazenar o artefato assinado, você pode usar uma solução de armazenamento de sua escolha ou pode usar o site IBM Cloud Object Storage. O trecho de código a seguir mostra um exemplo de como fazer upload dos artefatos e assinaturas assinados para Cloud Object Storage e atualizar seu repositório de inventário.

 # Upload the artifact and signature to Cloud Object Storage.
        namespace="$(get_env pipeline_namespace)"
        local cos_params=(
            --pipeline-run-id="${PIPELINE_RUN_ID}"
            --namespace="${namespace}"
            --backend cos
        )
        # Upload the artifact
        artifact_cos_url=$(cocoa artifact upload "${signed_artifact}" "${cos_params[@]}")
        # Upload the artifact
        artifact_signature_cos_url=$(cocoa artifact upload "${artifact_signature}" "${cos_params[@]}")

        APP_ARTIFACTS='{ "app": "'${APP_NAME}'", "artifact_url": "'${artifact_cos_url}'", "artifact_signature": "'${artifact_signature_cos_url}'" }'
        cocoa inventory add \
            --artifact="${name}@${digest}" \
            --name="${APP_REPO_NAME}" \
            --app-artifacts="${APP_ARTIFACTS}" \
            --signature="${signature}" \
            --provenance="${name}@${digest}" \
            --sha256="${digest}" \
            --type=$type" \
            "${params[@]}"