빌드 출처 확인

Assured OSS 패키지는 SLSA 레벨 2 규정 준수로 빌드됩니다. 빌드 출처는 보안 메타데이터의 일부로 제공됩니다. 이 페이지에서는 빌드 출처 메타데이터를 확인하는 방법을 설명합니다.

이 문서는 무료 등급에 적용됩니다. 프리미엄 등급의 빌드 출처에 관한 자세한 내용은 보안 메타데이터 액세스 및 패키지 확인을 참고하세요.

시작하기 전에

  • cosign을 설치하여 빌드 출처의 서명을 확인합니다.

인증 설정

인증 설정에 대한 자세한 내용은 인증 설정을 참고하세요.

빌드 출처 확인

빌드 출처는 dsse 봉투 형식을 사용하는 in-toto 증명을 사용하여 서명됩니다. 즉, 생성된 서명에는 래핑된 서명과 원시 데이터가 포함됩니다.

aoss-verifier 도구 사용

  1. 빌드 출처를 확인하려면 aoss-verifier 도구를 설치하세요.

  2. $(go env GOPATH)/bin를 내보내고 --verify_build_provenance 플래그와 함께 aoss-verifier verify-package 명령어를 실행합니다.

    aoss-verifier verify-package \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       --artifact_path ARTIFACT_PATH \
       --verify_build_provenance \
       [--disable_certificate_verification] \
       [--temp_downloads_path TEMP_DOWNLOADS_DIR_PATH] \
       [--disable_deletes]
    

    다음을 바꿉니다.

    • LANGUAGE: 패키지 언어입니다. 값은 소문자여야 합니다.
    • PACKAGE_ID: Java의 경우 형식은 groupId:artifactId입니다. Python의 경우 형식은 packageName입니다. 값은 소문자여야 합니다.
    • VERSION: 패키지 버전입니다.
    • ARTIFACT_PATH: 확인하려는 로컬 디렉터리의 데이터 파일 경로입니다. 다음 파일 이름 확장자를 사용합니다.
      • Java 패키지의 jar 파일 확장자
      • Python 패키지의 whl 파일 확장자

    --disable_certificate_verification은 인증서 체인을 통해 리프 인증서와 루트 인증서의 일치를 건너뛰는 선택적 플래그입니다(사용되는 경우).

    --temp_downloads_path는 파일을 다운로드할 경로를 설정하는 선택적 플래그입니다. TEMP_DOWNLOADS_DIR_PATH을 바꿉니다. 이 플래그를 설정하지 않으면 파일이 현재 디렉터리의 tmp_downloads 폴더로 다운로드됩니다.

    --disable_deletes는 다운로드한 파일을 보관하는 선택적 플래그입니다. 기본적으로 이 도구는 다운로드한 모든 파일을 정리합니다.

자세한 내용은 도구의 README 파일을 참고하세요.

수동 확인

빌드 출처를 확인하려면 다음을 실행하세요.

  1. 빌드 출처를 가져옵니다.

    보안 메타데이터에 액세스하는 방법에 따라 빌드 출처에 다르게 액세스합니다.

    자세한 내용은 다음 샘플 메타데이터 스니펫을 참고하세요.

    {
      "creationTime": "2023-03-25T05:32:23Z",
      "buildDetails": [
       {
         "packageFileName": "jackson-databind-2.13.3.jar",
         "envelope": {
         "payload": "eyJfdHlwZSI6Imh0d……………",
         "payloadType": "application/vnd.in-toto+json",
         "signatures": [
            "sig": "eyJwYXlsb2FkVHlwZSI6Im……",
            "keyid": "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
           }
         ]
       },
      "buildProvenance": "{\"_type\":\"https://in-toto.io/Statement/v0.1…"
    .....
    
    

    샘플 메타데이터 스니펫:

    {'BuildOccurrence': name: "projects/cloud-aoss/occurrences/06c514bb-1069-4cde-8d68-b1306f19535a"
    resource_uri: "jackson-databind-2.13.3.jar@sha256:4c01a14673bc1cd4a2df337a3b4e695af0a6ed8ac6be19c9e4077377fb8adf92"
    note_name: "projects/cloud-aoss/notes/tekton-cloudbuild-intoto"
    kind: BUILD
    create_time {
      seconds: 1665556616
      nanos: 891004000
    }
    ……
    ……
    }
    envelope {
      payload: "{\"_type\":\"https://in-toto.io/Statement/v0.1\", ….."
      payload_type: "application/vnd.in-toto+json"
      signatures {
        sig: "{\"payloadType\":\"application/vnd.in-toto+json\",....."
        keyid: "gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/tekton-chains"
      }
    }
    ,
    
    
    
  2. 빌드 출처 서명을 가져옵니다.

    빌드 출처에는 EnvelopeSignature로 서명이 포함된 Envelope라는 섹션이 포함됩니다. 서명을 가져오려면 다음 단계를 따르세요.

    1. sig 데이터를 signature.txt 파일에 저장합니다.
    2. 메타데이터 스크립트를 사용하여 메타데이터가 다운로드되었는지 확인합니다.

      메타데이터 스크립트를 사용하여 메타데이터를 다운로드한 경우 서명을 수정하고 signature.sig라는 다른 파일에 저장합니다.

      서명을 수정하려면 다음 명령어를 실행합니다.

      cat signature.txt | sed -e 's/\\"/"/g' > signature.sig
      

      메타데이터가 메타데이터 스크립트를 사용하여 다운로드되지 않은 경우 서명을 디코딩하고 signature.sig라는 다른 파일에 저장합니다.

      서명을 디코딩하려면 다음 명령어를 사용합니다.

      cat signature.txt | tr '\-_' '+/' | base64 -d > signature.sig
      
  3. 빌드 출처 공개 키를 가져옵니다.

    빌드 출처의 EnvelopeSignature 섹션에는 빌드 출처에 서명하는 데 사용된 키에 대한 참조가 포함됩니다. 키는 다음 형식 중 하나로 저장됩니다.

    1. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME
    2. gcpkms://projects/cloud-aoss/locations/global/keyRings/cloud-aoss-ring/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION

      여기서 KEY_NAMEKEY_VERSION은 Cloud Key Management Service 키의 이름과 버전입니다.

    공개 키는 Assured OSS가 소유한 Cloud Storage 버킷에 저장됩니다.

    Google Cloud CLI를 사용하여 공개 키를 가져옵니다. 다음 명령어 중 하나를 사용합니다.

    • KEY_NAME만 있는 경우:

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-public.pem PATH_TO_LOCAL_STORE
      
    • KEY_NAMEKEY_VERSION이 모두 있는 경우:

      gcloud storage cp gs://cloud-aoss/keys/KEY_NAME-KEY_VERSION-public.pem PATH_TO_LOCAL_STORE
      

    다음을 바꿉니다.

    • KEY_NAME를 Cloud Key Management Service 키 이름으로 바꿉니다.
    • KEY_VERSION: Cloud Key Management Service 키의 버전
    • PATH_TO_LOCAL_STORE을 공개 키를 저장할 로컬 경로의 이름으로 바꿉니다.
  4. 출처 서명을 확인합니다.

    1. 서명을 확인하려면 다음 명령어를 실행하세요.

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=false /dev/null
      

      다음을 바꿉니다.

      • KEY_REF: 이전 단계에서 다운로드한 공개 키의 경로입니다.
      • signature.sig: 이전 단계에서 가져온 서명이 포함된 파일입니다.

      명령어가 성공적으로 실행되면 다음 출력이 반환됩니다.

      Verified OK

    2. 출처와 연결된 아티팩트 해시도 확인하려면 다음 명령어를 사용하세요.

      cosign verify-blob-attestation --insecure-ignore-tlog --key KEY_REF --signature signature.sig --type slsaprovenance --check-claims=true ARTIFACT_PATH 
      

      다음을 바꿉니다.

      • KEY_REF: 이전 단계에서 다운로드한 공개 키의 경로입니다.
      • signature.sig: 이전 단계에서 가져온 서명이 포함된 파일입니다.
      • ARTIFACT_PATH: 아티팩트의 경로입니다.

      명령어가 성공적으로 실행되면 다음 출력이 반환됩니다.

      Verified OK

다음 단계