Signature d'artefacts qui ne sont pas des images
La chaîne d'outils DevSecOps permet de signer des artefacts autres que des images, en se limitant à des formats de fichiers tels que tar et zip. Ce processus implique l'utilisation d'un script avec le script de signature
par défaut. Si vous devez signer des artefacts autres que des fichiers tar et zip, vous devez fournir une implémentation personnalisée du script. Utilisez la propriété de texte « skip-sign-artifact-type » pour désactiver la signature des images pour les types d'artefacts indiqués (par exemple : log; report; documentation).
L'environnement d'exécution requis doit être disponible dans l'image pour prendre en charge le processus de signature.
Avant de commencer
Avant de commencer à signer des artefacts autres que des images, vous devez disposer des prérequis suivants.
-
Pour signer un artefact, vous devez disposer de la clé privée GPG. Pour générer une clé, vous pouvez utiliser la documentation.
-
Votre fichier
.pipline-config.yamldoit être mis à jour avec la configuration d'étape suivante.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 -
Par défaut, le script sign-artifacts peut signer tous les artefacts répertoriés dans la collection
list_artifacts. Assurez-vous que vos artefacts sont correctement stockés et intégrés.-
Veillez à stocker les artefacts générés dans l'environnement d'exécution du pipeline Cocoa. Cela peut se faire de l'une des deux manières suivantes.
-
Utilisez l'outil
save_filepour sauvegarder le fichier tar de l'artefact, ce qui permet de l'extraire dans les étapes suivantes.save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz" -
Stockez les artefacts dans un emplacement désigné, avec le nom d'artefact qui correspond au nom de votre application.
location="$(basename $(pwd))"
-
-
Intégrez l'artefact sauvegardé dans l'environnement d'exécution Cocoa en utilisant le code suivant comme guide.
save_artifact "${APP_NAME}" \ type=tar \ "name=${APP_NAME}-${VERSION}.tgz" \ "digest=${DIGEST}" \ "location=${location}" \ "provenance=${APP_NAME}-${VERSION}.tgz@${DIGEST}"
-
Signature d'artefacts qui ne sont pas des images
Le script par défaut utilise le client GPG à des fins de signature. Au cours de cette étape, tous les artefacts subissent le processus de signature. Une fois l'artefact signé, le script stocke à la fois l'artefact et la signature dans l'environnement d'exécution du pipeline Cocoa.
Etapes de post-signature
Pour extraire l'artefact signé et sa signature correspondante, vous pouvez utiliser l'approche suivante.
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
Si vous avez besoin de stocker l'artefact signé, vous pouvez utiliser une solution de stockage de votre choix ou vous pouvez utiliser IBM Cloud Object Storage. L'extrait de code suivant montre un exemple de téléchargement des artefacts signés et des signatures sur Cloud Object Storage et de mise à jour de votre référentiel d'inventaire.
# 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[@]}"