비이미지 아티팩트 서명

DevSecOps 툴체인은 이미지 형식이 아닌 아티팩트에 서명하는 기능을 제공하며, 이는 tar 및 zip 와 같은 파일 형식으로 제한됩니다. 이 프로세스에는 기본 서명 스크립트와 함께 스크립트 사용이 포함됩니다. tar 및 zip 파일 이외의 아티팩트에 서명해야 하는 경우 스크립트의 사용자 정의 구현을 제공해야 합니다. skip-sign-artifact-type 텍스트 속성을 사용하여 지정된 아티팩트 유형(예: log, report, documentation)에 대한 이미지 서명을 생략할 수 있습니다.

서명 프로세스를 지원하려면 이미지 내에서 필수 런타임 환경을 사용할 수 있어야 합니다.

시작하기 전에

비이미지 아티팩트 서명을 시작하기 전에 다음 전제조건이 있어야 합니다.

  1. 아티팩트에 서명하려면 GPG 개인 키가 있어야 합니다. 키를 생성하기 위해 문서 를 사용할 수 있습니다.

  2. .pipline-config.yaml 파일을 다음 단계 구성으로 업데이트해야 합니다.

    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. 기본적으로, 서명 아티팩트 스크립트는 아티팩트 목록( list_artifacts )에 있는 모든 아티팩트에 서명할 수 있습니다. 아티팩트가 올바르게 저장되고 통합되었는지 확인하십시오.

    1. 빌드된 아티팩트를 코코아 파이프라인 런타임에 저장했는지 확인하십시오. 이는 다음 두 가지 방법 중 하나로 달성할 수 있습니다.

      • save_file 도구를 사용하여 아티팩트 tar 파일을 저장하십시오. 그러면 후속 단계에서 검색할 수 있습니다.

        save_file "${APP_NAME}" "${APP_NAME}-${VERSION}.tgz"
        
      • 앱 이름과 일치하는 아티팩트 이름을 사용하여 지정된 위치에 아티팩트를 저장하십시오.

        location="$(basename $(pwd))"
        
    2. 다음 코드 스니펫을 안내서로 사용하여 저장된 아티팩트를 코코아 런타임에 통합하십시오.

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

비이미지 아티팩트 서명

기본 스크립트는 서명 목적으로 GPG 클라이언트를 사용합니다. 이 단계에서 모든 아티팩트는 서명 프로세스를 수행합니다. 아티팩트가 서명된 후 스크립트는 아티팩트와 서명을 모두 Cocoa 파이프라인 런타임에 저장합니다.

사후 서명 단계

서명된 아티팩트 및 해당 서명을 검색하기 위해 다음 방법을 사용할 수 있습니다.

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

서명된 아티팩트를 저장해야 하는 경우, 원하는 저장 솔루션을 사용하거나 IBM Cloud Object Storage 를 사용할 수 있습니다. 다음 코드 스니펫은 서명된 결과물과 서명을 Cloud Object Storage 에 업로드하고 인벤토리 저장소를 업데이트하는 방법을 보여주는 예제입니다.

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