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.
-
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.
-
Ihre Datei
.pipline-config.yamlmuss 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 -
Standardmäßig kann das Skript "sign-artifacts" alle Artefakte signieren, die in der Sammlung
list_artifactsaufgeführt sind. Stellen Sie sicher, dass Ihre Artefakte ordnungsgemäß gespeichert und integriert sind.-
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))"
-
-
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[@]}"