Firma di risorse utente non immagine

La suite di strumenti DevSecOps offre la possibilità di firmare artefatti non di tipo immagine, limitatamente a formati di file quali tar e zip. Questo processo implica l'utilizzo di uno script insieme allo script di firma predefinito. Se è necessario firmare risorse utente diverse dai file tar e zip, è necessario fornire un'implementazione personalizzata dello script. Utilizza la proprietà di testo " skip-sign-artifact-type " per escludere la firma delle immagini per i tipi di artefatti specificati (ad es.: log; report; documentazione).

L'ambiente di runtime richiesto deve essere disponibile all'interno dell'immagine per supportare il processo di firma.

Prima di iniziare

Prima di iniziare con la firma della risorsa utente non immagine, è necessario disporre dei seguenti prerequisiti.

  1. Per firmare una risorsa utente, è necessario disporre della chiave privata GPG. Per generare una chiave, puoi utilizzare la documentazione.

  2. Il file .pipline-config.yaml deve essere aggiornato con la seguente configurazione dello stage.

    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. Per impostazione predefinita, lo script sign-artifacts può firmare tutti gli artefatti elencati nella raccolta list_artifacts. Assicurarsi che le risorse utente siano correttamente memorizzate e integrate.

    1. Assicurarsi di memorizzare le risorse utente create nel runtime della pipeline Cocoa. Questo obiettivo può essere raggiunto in uno dei due modi seguenti.

      • Utilizzare lo strumento save_file per salvare il file tar della risorsa utente, che consente il richiamo nelle fasi successive.

        save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz"
        
      • Archivia le risorse utente in un'ubicazione designata, con il nome della risorsa utente che corrisponde al nome della tua applicazione.

        location="$(basename $(pwd))"
        
    2. Integrare la risorsa utente salvata nel runtime Cocoa utilizzando il seguente codesnippet come guida.

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

Firma di risorse utente non immagine

Lo script predefinito utilizza il client GPG per la firma. Durante questa fase, tutte le risorse utente vengono sottoposte al processo di firma. Dopo che la risorsa utente è stata firmata, lo script memorizza sia la risorsa utente che la firma nel runtime della pipeline Cocoa.

Passi post - firma

Per richiamare la risorsa utente firmata e la firma corrispondente, è possibile utilizzare il seguente approccio.

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 hai bisogno di conservare il manufatto firmato, puoi utilizzare una soluzione di archiviazione a tua scelta oppure puoi utilizzare IBM Cloud Object Storage. Il seguente frammento di codice mostra un esempio di come caricare i manufatti firmati e le firme su Cloud Object Storage e aggiornare il proprio archivio di inventario.

 # 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[@]}"