OpenSSF 스코어카드로 증명 만들기

이 가이드에서는 OpenSSF 스코어카드를 사용하여 컨테이너 이미지에서 공급망 보안 권장사항을 확인하는 방법을 보여줍니다. 스코어카드 증명자는 Cloud Build 파이프라인의 일부로 실행되어 배포 전에 Binary Authorization에서 확인 가능한 증명을 생성합니다. 이 확인 단계는 손상된 컨테이너 아티팩트가 프로덕션에 배포되지 않도록 방지하여 공급망 취약점의 여러 클래스를 방지합니다.

개요

Open Source Security Foundation(OpenSSF)은 오픈소스 보안 이니셔티브를 위한 도구, 서비스, 인프라를 제공하는 조직입니다. 스코어카드는 OpenSSF에서 유지관리하는 도구로, 소스 코드 관리(SCM) 저장소에서 공급망 보안 권장사항을 스캔합니다.

스코어카드 증명자는 스코어카드에 내장된 도구로, 사용자가 구성한 정책에 따라 Binary Authorization 증명을 만들 수 있도록 합니다. 스코어카드 증명자는 컨테이너 이미지의 SCM 저장소에 대해 스코어카드를 실행하고, 결과를 생성하고, 정책을 기준으로 결과를 평가하고, 정책이 충족되면 증명을 생성합니다.

이 튜토리얼에서는 샘플 저장소를 빌드한 후 스코어카드 증명자를 사용합니다. 각 샘플 파이프라인에는 다음 빌드 단계가 포함됩니다.

  1. build: 샘플 컨테이너 이미지를 빌드합니다.
  2. push: 이미지를 Container Registry로 푸시합니다.
  3. attest: 스코어카드 증명자를 사용하여 이미지를 확인하고 서명하여 정책에 따라 증명을 만듭니다.

각 파이프라인의 attest 단계에서 스코어카드 증명자가 다음을 수행합니다.

  1. 새로 빌드된 컨테이너 이미지의 SCM 저장소에 대한 데이터를 가져옵니다.
  2. 원시 데이터에서 스코어카드를 실행하고 사용자가 지정한 정책에 따라 SCM 저장소를 평가합니다.
    1. 모든 정책이 충족되면 스코어카드 증명자가 증명을 만듭니다.
    2. 정책이 충족되지 않으면 스코어카드 증명자가 증명을 만들지 않습니다.

Binary Authorization은 배포 시에 검증 가능한 증명을 확인합니다. 이러한 증명이 없으면 시행자가 이미지 배포를 허용하지 않습니다.

비용

이 튜토리얼에서는 다음 Google Cloud 제품을 사용합니다.

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

가격 계산기를 사용하면 예상 사용량을 토대로 예상 비용을 산출할 수 있습니다.

목표

이 가이드에서는 다음과 같은 작업을 수행하게 됩니다.

  1. 스코어카드 증명자를 Cloud Build 커스텀 빌더로 설정합니다.
  2. 스코어카드 증명자 정책을 보고 구성합니다.
  3. 샘플 저장소에서 스코어카드 증명자를 실행하여 정책을 기반으로 증명을 만듭니다.
  4. 증명을 만들지 않고 확인 전용 모드로 샘플 저장소에서 스코어카드 증명자를 실행합니다. ## 시작하기 전에

이 섹션에서는 시스템 1회 설정을 수행합니다.

환경 설정

  1. 환경 변수에 Google Cloud 프로젝트를 저장합니다.

    export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.

  2. 기본 프로젝트 ID를 Google Cloud 프로젝트로 설정합니다.

    gcloud config set project $PROJECT_ID
    
  3. 다음 단계에서 프로젝트 번호를 환경 변수에 저장합니다.

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. API 사용 설정:

    이 가이드에 필요한 서비스가 사용 설정되어 있는지 확인하려면 다음 명령어를 실행합니다.

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

IAM 역할 설정

다음 명령어를 실행하여 Cloud Build 서비스 계정을 다음 역할로 구성합니다.

  • containeranalysis.notes.editor: 증명자를 관리하기는 Artifact Analysis 메모 편집자 역할을 추가합니다.
  • containeranalysis.notes.occurrences.viewer: 취약점과 증명 어커런스를 모두 관리하는 메모용 Artifact Analysis 어커런스 역할을 추가합니다.
  • roles/containeranalysis.occurrences.editor: Artifact Analysis에 증명 어커런스를 만드는 Artifact Analysis 어커런스 편집자 역할을 추가합니다.
  • cloudkms.signer: 서비스 계정이 Cloud KMS 서명 서비스에 액세스할 수 있도록 허용하는 Cloud KMS CryptoKey 서명자 역할을 추가합니다.

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

Cloud KMS 서명 키 만들기

Cloud Key Management Service 키는 증명을 만드는 데 사용됩니다.

  1. scorecard-attestor-key-ring이라는 이름으로 Cloud KMS 키링을 새로 만듭니다.

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. 키링 안에 scorecard-attestor-key라는 새 Cloud KMS 키를 만듭니다.

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. 다음 단계를 위해 다이제스트 알고리즘과 Cloud KMS를 환경 변수에 저장합니다.

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Binary Authorization 증명자 만들기 나중에 스코어카드 증명자가 이 증명자와 연결된 메모를 만듭니다.

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Binary Authorization 증명자를 KMS 키와 연결합니다.

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

다른 서명 알고리즘을 살펴보려면 비대칭 키 만들기를 참조하세요.

Cloud Build 파이프라인에서 스코어카드 증명자로 증명 만들기

실패 사례 샘플 빌드 제출

이 섹션에서는 컨테이너 이미지를 빌드하고 OpenSSF 스코어카드로 공급망 보안 관행을 확인합니다. 이미지는 성공적으로 빌드되지만 증명이 생성되지 않습니다. 기본 저장소에는 Dockerfile에서 Debian 10에 고정되지 않은 종속 항목과 소스 저장소에 체크인된 컴파일된 바이너리 아티팩트와 같은 일부 권장되지 않은 공급망 보안 관행이 포함되어 있습니다. 이는 저장소의 증명 정책을 위반합니다.

  1. 테스트 저장소 scorecard-binauthz-test-bad를 클론합니다.

  2. 실패 사례의 증명 정책 파일을 봅니다.

    cat policy-binauthz.yaml
    
  3. (선택사항) 실패 사례의 빌드 구성 파일 보기

    cat samples/signer/cloudbuild.yaml
    
  4. 빌드를 제출합니다.

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

다음과 같은 출력이 표시되어야 합니다.

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. 마지막 빌드의 빌드 ID를 저장합니다.

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. 결과 확인:

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

성공 사례 샘플 빌드 제출

이 섹션에서는 스코어카드 증명 정책을 충족하는 컨테이너 이미지를 빌드합니다. 이 경우 스코어카드 증명자가 증명을 만듭니다.

Cloud Build에 성공 사례 샘플 빌드를 제출하려면 다음을 입력하세요.

  1. 테스트 저장소 scorecard-binauthz-test-good을 클론합니다.

  2. 실패 사례의 증명 정책 파일을 봅니다. sh cat policy-binauthz.yaml

  3. (선택사항) 실패 사례의 빌드 구성 파일 보기

    cat samples/signer/cloudbuild.yaml
    
  4. 빌드를 제출합니다.

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. 결과 확인:

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. 스코어카드로 빌드 및 확인한 컨테이너 이미지의 URL 가져오기

    export IMAGE_URI=$(gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. 컨테이너 이미지에 대해 증명이 생성되었는지 확인합니다. 스코어카드 증명자는 메모 ID ossf-scorecard-attestation 및 메모 이름 projects/${PROJECT_ID}/notes/ossf-scorecard-attestation을 사용합니다.

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

삭제

이 문서에서 사용된 리소스를 삭제하려면 프로젝트를 삭제하면 됩니다.

gcloud projects delete $PROJECT_ID

다음 단계