Nicht-Image-Artefakte signieren

Die Toolchain „ DevSecOps “ bietet die Möglichkeit, Artefakte zu signieren, die keine Images sind, wobei dies auf Dateiformate wie tar und zip beschränkt ist. Bei diesem Prozess wird ein Script zusammen mit dem Standardsignierscript verwendet. Wenn Sie andere Artefakte als tar-und zip-Dateien signieren müssen, dann müssen Sie eine angepasste Implementierung des Scripts bereitstellen. Verwenden Sie die Texteigenschaft „ skip-sign-artifact-type “, um die Bildsignatur für die angegebenen Artefakt-Typen (z. B. Log, Bericht, Dokumentation) zu überspringen.

Die erforderliche Laufzeitumgebung muss im Image verfügbar sein, damit der Signaturprozess unterstützt wird.

Vorbereitende Schritte

Bevor Sie mit der Signierung von Nicht-Image-Artefakten beginnen, benötigen Sie die folgenden Voraussetzungen.

  1. Zum Signieren eines Artefakts müssen Sie über den privaten GPG-Schlüssel verfügen. Zum Generieren eines Schlüssels können Sie die -Dokumentation verwenden.

  2. Ihre Datei .pipline-config.yaml muss mit der folgenden Phasenkonfiguration aktualisiert werden.

    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. Standardmäßig kann das Skript "sign-artifacts" alle Artefakte signieren, die in der Sammlung list_artifacts aufgeführt sind. Stellen Sie sicher, dass Ihre Artefakte ordnungsgemäß gespeichert und integriert sind.

    1. Stellen Sie sicher, dass Sie erstellte Artefakte in der Laufzeit der Cocoa-Pipeline speichern. Dies kann auf eine der beiden folgenden Arten erreicht werden.

      • Verwenden Sie das Tool save_file, um die Artefakt-TAR-Datei zu speichern, die das Abrufen in nachfolgenden Phasen ermöglicht.

        save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz"
        
      • Speichern Sie Artefakte an einer bestimmten Position, wobei der Artefaktname Ihrem App-Namen entspricht.

        location="$(basename $(pwd))"
        
    2. Integrieren Sie das gespeicherte Artefakt in die Cocoa-Laufzeit und verwenden Sie dabei das folgende Codesnippet als Leitfaden.

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

Nicht-Image-Artefakte signieren

Das Standardscript verwendet den GPG-Client zum Signieren. In dieser Phase durchlaufen alle Artefakte den Signaturprozess. Nach dem Signieren des Artefakts speichert das Script das Artefakt und die Signatur in der Laufzeit der Cocoa-Pipeline.

Schritte nach dem Signieren

Um das signierte Artefakt und die zugehörige Signatur abzurufen, können Sie die folgende Methode verwenden:

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

Wenn Sie das signierte Artefakt aufbewahren müssen, können Sie eine Aufbewahrungslösung Ihrer Wahl verwenden oder sich an IBM Cloud Object Storage wenden. Der folgende Codeausschnitt zeigt ein Beispiel dafür, wie Sie die signierten Artefakte und Signaturen an Cloud Object Storage senden und Ihr Inventarverzeichnis aktualisieren können.

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