SLSA 검사 사용

이 페이지에서는 CV가 사용 설정된 GKE 클러스터에서 실행되는 포드와 연결된 컨테이너 이미지의 SLSA 준수 출처를 확인하는 Binary Authorization 지속적 검증(CV) SLSA 검사를 사용하는 방법을 보여줍니다.

이 검사를 사용하려면 SLSA와 호환되는 출처를 생성하는 Cloud Build로 이미지를 빌드해야 합니다.

이 가이드의 예시에서는 소스 코드 저장소에 대한 Cloud Source Repositories, 이미지 레지스트리에 대한 Artifact Registry, Cloud Build를 사용해서 이미지를 빌드하고 출처를 생성합니다.

SLSA 검사가 지원하는 유일한 신뢰할 수 있는 빌더는 Cloud Build입니다.

비용

이 가이드에서는 다음 Google Cloud 서비스를 사용합니다.

  • Artifact Registry
  • Binary Authorization. 하지만 미리보기 단계 중에 CV를 무료로 사용할 수 있습니다.
  • Cloud Build
  • Cloud Source Repositories
  • GKE

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.googleapis.com
  12. gcloud CLI가 최신 버전으로 업데이트되었는지 확인합니다.
  13. kubectl 명령줄 도구 설치
  14. Binary Authorization 정책과 GKE 클러스터가 서로 다른 프로젝트에 있으면 Binary Authorization이 두 프로젝트 모두에 사용 설정되었는지 확인합니다.

필요한 역할

이 섹션에서는 이 검사에 대해 역할을 설정하는 방법을 보여줍니다.

개요

이 가이드에 언급된 모든 제품을 동일한 프로젝트에서 실행할 경우에는 권한을 설정할 필요가 없습니다. 역할을 사용 설정하면 Binary Authorization에서 역할이 올바르게 구성됩니다. 서로 다른 프로젝트에서 제품을 실행할 때는 이 섹션의 설명에 따라 역할을 설정해야 합니다.

각 프로젝트의 Binary Authorization 서비스 에이전트에 CV SLSA 검사를 평가하는 데 필요한 권한이 있는지 확인하기 위해 각 프로젝트의 Binary Authorization 서비스 에이전트에 다음 IAM 역할을 부여하도록 관리자에게 요청하세요.

  • 클러스터 프로젝트 Compute Engine 서비스 계정의 Artifact Registry 리더(roles/artifactregistry.reader)
  • 클러스터 프로젝트가 정책 프로젝트와 다른 경우: 정책 프로젝트에 액세스하기 위한 클러스터 프로젝트 Binary Authorization 서비스 계정의 Binary Authorization 정책 평가자(roles/binaryauthorization.policyEvaluator)
  • 증명 프로젝트가 정책 프로젝트와 다른 경우: 증명 프로젝트에 액세스하기 위한 정책 프로젝트 Binary Authorization 서비스 에이전트의 컨테이너 분석 어커런스 뷰어(roles/containeranalysis.occurrences.viewer)

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

관리자는 맞춤 역할 또는 다른 사전 정의된 역할을 통해 각 프로젝트의 Binary Authorization 서비스 에이전트에 필요한 권한을 부여할 수도 있습니다.

gcloud CLI를 사용하여 역할 부여

각 프로젝트의 서비스 계정에 이 검사를 평가하는 데 필요한 권한이 있는지 확인하려면 각 프로젝트의 서비스 계정에 다음 IAM 역할을 부여합니다.

  1. 클러스터를 실행하는 프로젝트가 정책이 있는 프로젝트와 다르면 클러스터 프로젝트의 Binary Authorization 서비스 에이전트가 정책 프로젝트의 정책에 액세스하도록 권한을 부여해야 합니다.

    1. 클러스터 프로젝트의 Binary Authorization 서비스 에이전트를 가져옵니다.

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
      

      CLUSTER_PROJECT_ID를 클러스터의 프로젝트 ID로 바꿉니다.

    2. CV가 클러스터의 정책을 평가하도록 허용합니다.

      gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
          --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \
          --role='roles/binaryauthorization.policyEvaluator'
      

      POLICY_PROJECT_ID를 정책이 포함된 프로젝트의 ID로 바꿉니다.

  2. 정책 프로젝트 서비스 에이전트가 증명에 액세스하도록 허용합니다.

    1. 정책 프로젝트와 연결된 Binary Authorization 서비스 에이전트를 가져옵니다.

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:POLICY_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      POLICY_PROJECT_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
      

      POLICY_PROJECT_ID를 정책이 포함된 프로젝트의 ID로 바꿉니다.

    2. 다음 역할을 부여합니다.

      gcloud projects add-iam-policy-binding ATTESTATION_PROJECT_ID \
          --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
          --role='roles/containeranalysis.occurrences.viewer'
      

      ATTESTATION_PROJECT_ID를 증명이 포함된 프로젝트의 ID로 바꿉니다.

  3. 저장소에서 이미지를 가져오도록 기본 Compute Engine 서비스 계정 권한을 허용합니다.

    1. 클러스터 프로젝트와 연결된 Compute Engine 서비스 계정을 가져옵니다.

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      COMPUTE_ENGINE_SERVICE_ACCOUNT="$PROJECT_NUMBER-compute@developer.gserviceaccount.com"
      

      CLUSTER_PROJECT_ID를 정책이 포함된 클러스터 프로젝트의 ID로 바꿉니다.

    2. 다음 역할을 부여합니다.

      gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
          --member="serviceAccount:$COMPUTE_ENGINE_SERVICE_ACCOUNT" \
          --role='roles/artifactregistry.reader'
      

      ARTIFACT_PROJECT_ID를 배포하려는 이미지를 저장하는 Artifact Registry 프로젝트의 ID로 바꿉니다.

선택사항: 샘플 이미지 빌드 및 업로드

이 섹션은 설명 목적으로 포함되었으며, SLSA와 호환되는 출처로 이미지 예시를 빌드하는 방법을 보여줍니다. 출처는 가이드의 후반부에서 검사 시연을 위해 사용됩니다. Cloud Build 출처에 대해 자세히 알아보세요.

샘플 저장소 만들기

Cloud Source Repositories에서 저장소를 만들려면 다음을 수행합니다.

  1. 저장소를 만들고 로컬로 클론합니다.

    gcloud source repos create SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    gcloud source repos clone SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    cd SOURCE_REPO_NAME
    

    다음을 바꿉니다.

    • SOURCE_REPO_NAME: 소스 코드 저장소의 이름입니다(예: slsa-check-test-repo)
    • SOURCE_REPO_PROJECT_ID: 저장소 프로젝트의 ID입니다.
  2. 소스, 구성, 빌드 파일을 만들려면 다음을 수행합니다.

    1. 이미지 소스를 만듭니다.

      cat > quickstart.sh <<EOF
      #!/bin/sh
      echo "Hello, world! The time is $(date)."
      sleep infinity
      EOF
      
    2. 파일을 실행 가능하게 만듭니다.

      chmod +x quickstart.sh
      
    3. Dockerfile 구성 파일을 만듭니다.

      cat > Dockerfile <<EOF
      FROM alpine
      COPY quickstart.sh /
      CMD ["/quickstart.sh"]
      EOF
      
    4. 이미지를 Artifact Registry에 푸시하는 Cloud Build cloudbuild.yaml 파일을 만듭니다.

      cat > cloudbuild.yaml <<EOF
      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE', '.' ]
      options:
        requestedVerifyOption: VERIFIED
      images:
      - 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE'
      EOF
      

      다음을 바꿉니다.

      • LOCATION: Artifact Registry 위치입니다(예: us-west2, europe-central2, asia-east1).
      • ARTIFACT_PROJECT_ID: Artifact Registry 아티팩트를 저장하는 프로젝트의 ID입니다.
      • ARTIFACT_REPO_NAME: Artifact Registry 저장소 이름입니다(예: slsa-check-test-repo).
      • DIRECTORY: 디렉터리입니다(예: slsa-check).
      • IMAGE: 이미지의 경로입니다(예: slsa-check-image).
    5. 파일을 Cloud Source Repositories에 커밋합니다.

      git add .
      git commit -a
      

샘플 이미지 빌드 및 업로드

이 가이드 사용을 단순화하려면 SOURCE_REPO_PROJECT_IDARTIFACT_PROJECT_ID에 동일한 프로젝트를 사용하는 것이 좋습니다. 다른 프로젝트를 사용하는 경우 추가 IAM 권한을 설정해야 할 수 있습니다. Artifact Registry 액세스 제어에 대해 자세히 알아보세요. Cloud Build에 대한 자세한 내용은 Cloud Build 개요를 참조하세요.

저장소를 만들려면 다음을 수행합니다.

  1. Artifact Registry 저장소를 만듭니다.

    gcloud artifacts repositories create ARTIFACT_REPO_NAME \
        --project=ARTIFACT_PROJECT_ID \
        --repository-format=docker \
        --location=LOCATION \
        --description="Docker repository"
    

    다음을 바꿉니다.

    • ARTIFACT_REPO_NAME: 저장소 이름입니다.
    • ARTIFACT_PROJECT_ID: 아티팩트 프로젝트 ID입니다.
    • LOCATION: Artifact Registry 위치입니다(예: us-west2, europe-central2, asia-east1).
  2. Cloud Build 빌드 트리거를 만듭니다.

    gcloud beta builds triggers create cloud-source-repositories \
        --project=SOURCE_REPO_PROJECT_ID \
        --repo=SOURCE_REPO_NAME \
        --region=LOCATION \
        --branch-pattern=.* \
        --build-config=cloudbuild.yaml
    

    다음을 바꿉니다.

    • SOURCE_REPO_NAME: 소스 코드 저장소 이름입니다.
    • SOURCE_REPO_PROJECT_ID: Cloud Build 프로젝트 ID입니다.
    • LOCATION: 위치입니다.
  3. 이 가이드 앞부분에서 만든 파일을 푸시하여 빌드를 트리거합니다.

    git push
    

    이미지가 성공적으로 빌드되면 Cloud Build가 출처를 생성하고 이미지를 Artifact Registry 저장소에 업로드합니다.

  4. 최신 이미지를 확인하고 다이제스트를 가져오려면 다음을 수행합니다.

    1. Cloud Build로 이미지가 빌드되었는지 확인합니다.

      gcloud artifacts docker images list LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/REPO_NAME/DIRECTORY \
          --project=ARTIFACT_PROJECT_ID \
          --sort-by=create_time
      

      다음을 바꿉니다.

      • LOCATION: Artifact Registry 위치입니다.
      • ARTIFACT_PROJECT_ID: 아티팩트의 프로젝트 ID입니다.
      • ARTIFACT_REPO_NAME: 저장소 이름입니다.
      • DIRECTORY: 디렉터리입니다.
    2. 최신 이미지의 다이제스트를 복사합니다. 다이제스트는 다음과 유사합니다. sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59

  5. 선택사항: 이미지의 출처를 확인합니다.

    gcloud artifacts docker images describe \
      LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST \
        --project=ARTIFACT_PROJECT_ID \
        --show-provenance
    

    다음을 바꿉니다.

    • ARTIFACT_PROJECT_ID: 아티팩트의 프로젝트 ID입니다.
    • LOCATION: Artifact Registry 위치입니다.
    • ARTIFACT_REPO_NAME: 아티팩트 저장소 이름입니다.
    • DIRECTORY: 디렉터리입니다.
    • IMAGE: 이미지의 경로입니다.
    • DIGEST: 이미지와 연결된 다이제스트입니다.

    명령어 결과는 다음과 유사합니다.

    image_summary:
      digest: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      fully_qualified_digest: us-west2-docker.pkg.dev/my-project/slsa-check-repo/slsa-check-image@sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      registry: us-west2-docker.pkg.dev
      repository: slsa-check-repo
      slsa_build_level: 3
    provenance_summary:
      provenance:
      - build:
          intotoStatement:
            _type: https://in-toto.io/Statement/v0.1
            predicateType: https://slsa.dev/provenance/v0.1
            slsaProvenance:
              builder:
                id: https://cloudbuild.googleapis.com/GoogleHostedWorker
              materials:
              - digest:
                  sha1: de4e4227fff1d00d6f7785a827608627e4a369ea
                uri: git+https://source.cloud.google.com/my-project/slsa-check-source-repo
              metadata:
                ...
    envelope:
      payload: eyJfdHlwZSI6I ... taW1hZ2U6dGFnMSJ9XX0=
      payloadType: application/vnd.in-toto+json
      signatures:
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
        sig: MEQCIBCCkho_re4EfAT-NBSSmAXOZlv4lU_vWzEru97tU8KmAiAKcAa99umWngzNQADmPixqYjbKjLOKQEUvrI5chSrf7g==
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
        sig: MEUCIFOEq_7RpiZAB4vUlit3hkZ2yI0n37-5Y87l0JbU-EZSAiEA9TNZZcv_MnzKffTnswHWZR2DSLmYiklr5twWfIec-zo=
    

    출력에는 SLSA 검사가 작동하기 위해 provenance_summary 블록이 포함되어야 합니다. 출력에 블록이 없으면 Cloud Build가 빌드 트리거로 호출되었는지 확인합니다. Cloud Build는 수동으로 트리거될 때 출처 정보를 생성하지 않습니다.

플랫폼 정책 만들기

출처를 생성하려면 샘플 이미지 빌드 및 업로드에 설명된 대로 Cloud Build 트리거를 사용하여 이미지를 빌드해야 합니다.

SLSA 검사로 플랫폼 정책을 만들려면 다음을 수행합니다.

  1. 플랫폼 정책 YAML 파일을 만듭니다.

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: My SLSA check
          imageAllowlist:
            # This policy exempts images that are in the following artifact registry
            allowPattern:
            - ARTIFACT_LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/EXEMPT_IMAGE_PATH/**
          slsaCheck:
            rules:
            - attestationSource:
                containerAnalysisAttestationProjects:
                - projects/ATTESTATION_PROJECT_ID
              configBasedBuildRequired: true
              trustedBuilder: GOOGLE_CLOUD_BUILD
              trustedSourceRepoPatterns:
              - source.cloud.google.com/SOURCE_REPO_PROJECT_ID/SOURCE_REPO_NAME
              customConstraints:
              - CEL_EXPRESSION
        displayName: My check set
    EOF
    

    다음을 바꿉니다.

    • POLICY_PATH: 정책 파일의 경로입니다.
    • ARTIFACT_LOCATION: Artifact Registry에서 저장소의 위치입니다.
    • ARTIFACT_PROJECT_ID: 아티팩트가 포함된 프로젝트의 ID입니다.
    • ARTIFACT_REPO_NAME: 이미지가 포함된 저장소입니다.
    • EXEMPT_IMAGE_PATH: 하나 이상의 예외 이미지에 대한 선택적인 경로입니다(예: not-built-by-cloud-build). imageAllowlist 블록은 이 플랫폼 정책에 포함되어 있으므로 출처가 없는 이미지를 예외로 설정하여 플랫폼 정책을 위반하지 않도록 할 수 있습니다. 대신 이러한 이미지에서 위반 사항을 로깅하려면 이 블록을 생략합니다.
    • ATTESTATION_PROJECT_ID: Cloud Build에서 만든 증명을 저장하는 프로젝트 ID입니다.
    • SOURCE_REPO_PROJECT_ID: 소스 코드가 포함된 프로젝트의 ID입니다.
    • SOURCE_REPO_NAME: 이미지가 포함된 저장소입니다. 설명 목적으로 이 검사를 강제로 위반하려면 이미지가 있는 장소 이외의 소스 코드 저장소로 SOURCE_REPO_NAME을 설정합니다.
    • POLICY_PROJECT_ID: CV 정책이 포함된 프로젝트의 ID입니다.
    • POLICY_ID: 이 정책의 ID입니다.
    • CEL_EXPRESSION: SLSA 정책에 추가 제약조건을 제공하는 CEL 표현식입니다. 예를 들어 이미지를 특정 디렉터리 경로에서 가져와야 하는 커스텀 제약조건을 추가하려면 CEL_EXPRESSION을 다음 표현식으로 바꿉니다.

      payload.predicate.externalParameters.buildConfigSource.path != "" && payload.predicate.externalParameters.buildConfigSource.repository.contains("github.com/my-repo/my-production-repo")
      
  2. 플랫폼 정책을 만듭니다.

    아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

    • POLICY_ID: 선택한 플랫폼 정책 ID. 정책이 다른 프로젝트에 있으면 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID와 같이 전체 리소스 이름을 사용할 수 있습니다.
    • POLICY_PATH: 정책 파일의 경로
    • POLICY_PROJECT_ID: 정책 프로젝트 ID

    다음 명령어를 실행합니다.

    Linux, macOS 또는 Cloud Shell

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=POLICY_PATH \
        --project=POLICY_PROJECT_ID

    Windows(PowerShell)

    gcloud beta container binauthz policy create POLICY_ID `
        --platform=gke `
        --policy-file=POLICY_PATH `
        --project=POLICY_PROJECT_ID

    Windows(cmd.exe)

    gcloud beta container binauthz policy create POLICY_ID ^
        --platform=gke ^
        --policy-file=POLICY_PATH ^
        --project=POLICY_PROJECT_ID

CV 사용 설정

검사 기반 플랫폼 정책으로 CV 모니터링을 사용하도록 새 클러스터를 만들거나 기존 클러스터를 업데이트할 수 있습니다.

CV 모니터링을 사용하는 클러스터 만들기

이 섹션에서는 검사 기반 플랫폼 정책으로 CV 모니터링만 사용하는 클러스터를 만듭니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • LOCATION: 위치입니다(예: us-central1 또는 asia-south1).
  • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID입니다.
  • POLICY_ID: 정책 ID
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows(PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows(cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

시행 및 CV 모니터링을 사용하는 클러스터 만들기

이 섹션에서는 project-singleton 정책 시행과 검사 기반 플랫폼 정책이 포함된 CV 모니터링을 모두 사용하는 클러스터를 만듭니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름입니다.
  • LOCATION: 위치입니다(예: us-central1 또는 asia-south1).
  • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID입니다.
  • POLICY_ID: 정책 ID
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows(PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows(cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

CV 모니터링을 사용하도록 클러스터 업데이트

이 섹션에서는 검사 기반 플랫폼 정책만 포함된 CV 모니터링을 사용하도록 클러스터를 업데이트합니다. 클러스터에 이미 프로젝트 싱글톤 정책 시행이 사용 설정된 경우 이 명령어를 실행하면 사용 중지됩니다. 대신 시행 및 CV 모니터링을 사용 설정하여 클러스터를 업데이트하는 것이 좋습니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • LOCATION: 위치(예: us-central1 또는 asia-south1)
  • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID
  • POLICY_ID: 정책 ID
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows(PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows(cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

시행 및 CV 모니터링을 사용하도록 클러스터 업데이트

이 섹션에서는 프로젝트 싱글톤 정책 시행과 검사 기반 플랫폼 정책이 포함된 CV 모니터링을 모두 사용하도록 클러스터를 업데이트합니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터 이름
  • LOCATION: 위치(예: us-central1 또는 asia-south1)
  • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID
  • POLICY_ID: 정책 ID
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID

다음 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows(PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows(cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

이미지 배포

  1. kubectl을 구성합니다.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터 이름입니다.
    • LOCATION: 클러스터 위치입니다.
    • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID
  2. 포드를 배포합니다.

    kubectl run hello-app \
        --image='LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST'
    

    포드가 배포됩니다. 이미지가 출처를 사용해서 신뢰할 수 있는 소스 코드 저장소로부터 빌드되었으므로 CV SLSA 검사를 위반하지 않으며 로그 항목이 생성되지 않습니다.

    SLSA 검사를 강제로 위반하려면 이미지가 있는 장소 이외의 소스 코드 저장소로 SOURCE_REPO_NAME을 설정할 수 있습니다. 또한 빌드를 수동으로 트리거하여 출처 생성을 건너뛸 수 있습니다. 그런 후 로그 항목을 확인합니다.

CV 항목의 로그 보기

Cloud Logging 항목을 검색하여 CV 구성 오류CV 플랫폼 정책 검증 위반을 찾을 수 있습니다.

CV는 24시간 내에 오류와 위반 사항을 Cloud Logging에 로깅합니다. 일반적으로 몇 시간 내에 항목이 표시됩니다.

CV 구성 오류 로그 보기

CV 구성 오류 로그를 보려면 다음 명령어를 실행합니다.

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'

다음 출력은 CV 플랫폼 정책을 찾을 수 없는 구성 오류를 보여줍니다.

{
  "insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
    "configErrorEvent": {
      "description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
    }
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "cluster_name": "my-cluster",
      "location": "us-central1-c",
      "project_id": "my-project"
    }
  },
  "timestamp": "2024-05-28T15:31:03.999566Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}

CV 플랫폼 정책 검증 위반 보기

사용 설정한 플랫폼 정책을 위반하는 이미지가 없으면 로그에 항목이 표시되지 않습니다.

지난 7일 동안의 CV 로그 항목을 보려면 다음 명령어를 실행합니다.

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'

CLUSTER_PROJECT_ID를 클러스터 프로젝트 ID로 바꿉니다.

검사 유형

CV가 검사 위반 정보를 checkResults에 로깅합니다. 항목에서 checkType 값은 검사를 나타냅니다. 각 검사의 값은 다음과 같습니다.

  • ImageFreshnessCheck
  • SigstoreSignatureCheck
  • SimpleSigningAttestationCheck
  • SlsaCheck
  • TrustedDirectoryCheck
  • VulnerabilityCheck

예시 로그

다음 예시 CV 로깅 항목은 신뢰할 수 있는 디렉터리 검사를 위반하는 미준수 이미지를 기술합니다.

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/123456789/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "My check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "gcr.io/my-project/hello-app:latest"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-test-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

삭제

이 섹션에서는 이 가이드의 앞부분에서 구성한 CV 모니터링을 삭제하는 방법을 설명합니다.

클러스터에서 CV 모니터링을 사용 중지하거나 Binary Authorization과 CV를 모두 사용 중지할 수 있습니다.

클러스터에서 Binary Authorization 사용 중지

클러스터에서 CV 및 Binary Authorization 시행을 모두 사용 중지하려면 다음 명령어를 실행합니다.

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름입니다.
  • LOCATION: 클러스터 위치입니다.
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID

클러스터에서 검사 기반 정책 모니터링 사용 중지

클러스터에서 검사 기반 정책으로 CV를 사용 중지하고 Binary Authorization 시행 정책을 사용하여 시행을 다시 사용 설정하려면 다음 명령어를 실행합니다.

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름입니다.
  • LOCATION: 클러스터 위치입니다.
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID

--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE는 이전 플래그 --enable-binauthz와 동일합니다.

정책 삭제

정책을 삭제하려면 다음 명령어를 실행합니다. 검사 기반 정책 감사를 사용 중지하기 위해 검사 기반 플랫폼 정책을 삭제할 필요는 없습니다.

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

다음을 바꿉니다.

  • POLICY_ID: 정책의 ID입니다.
  • POLICY_PROJECT_ID: 정책 프로젝트 ID입니다.

다음 단계