Firma de artefactos que no son de imagen
La cadena de herramientas de firma electrónica ( DevSecOps ) ofrece la posibilidad de firmar artefactos sin imagen, restringidos a formatos de archivo como tar y zip. Este proceso implica el uso de un script junto con
el script de firma predeterminado. Si necesita firmar artefactos que no sean archivos tar y zip, debe proporcionar una implementación personalizada del script.
El entorno de ejecución necesario debe estar disponible en la imagen para dar soporte al proceso de firma.
Antes de empezar
Antes de empezar con la firma de artefactos que no son de imagen, debe tener los siguientes requisitos previos.
-
Para firmar un artefacto, debe tener la clave privada GPG. Para generar una clave, puede utilizar la documentación.
-
El archivo
.pipline-config.yamldebe actualizarse con la siguiente configuración de etapa.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 -
De forma predeterminada, la secuencia de comandos sign-artifacts puede firmar todos los artefactos que figuran en la colección
list_artifacts. Asegúrese de que los artefactos estén correctamente almacenados e integrados.-
Asegúrese de almacenar los artefactos compilados en el tiempo de ejecución de conducto de Cocoa. Esto puede lograrse de una de las dos formas siguientes.
-
Utilice la herramienta
save_filepara guardar el archivo tar de artefacto, que permite la recuperación en etapas posteriores.save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz" -
Almacene los artefactos en una ubicación designada, con el nombre de artefacto que coincida con el nombre de la app.
location="$(basename $(pwd))"
-
-
Integre el artefacto guardado en el tiempo de ejecución de Cocoa utilizando el siguiente fragmento de código como guía.
save_artifact "${APP_NAME}" \ type=tar \ "name=${APP_NAME}-${VERSION}.tgz" \ "digest=${DIGEST}" \ "location=${location}" \ "provenance=${APP_NAME}-${VERSION}.tgz@${DIGEST}"
-
Firma de artefactos que no son de imagen
El script predeterminado emplea el cliente GPG para fines de firma. Durante esta etapa, todos los artefactos se someten al proceso de firma. Una vez firmado el artefacto, el script almacena el artefacto y la firma en el tiempo de ejecución de conducto de Cocoa.
Pasos posteriores a la firma
Para recuperar el artefacto firmado y su firma correspondiente, puede utilizar el siguiente enfoque.
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 necesita almacenar el artefacto firmado, puede utilizar una solución de almacenamiento de su elección o puede utilizar IBM Cloud Object Storage. El siguiente fragmento de código muestra un ejemplo de cómo cargar los artefactos firmados y las firmas en Cloud Object Storage y actualizar su repositorio de 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[@]}"