이미지 최신 상태 검사 사용

이 페이지에서는 Binary Authorization 지속적 검증(CV) 이미지 최신 상태 검사를 사용해서 CV가 사용 설정된 Google Kubernetes Engine(GKE) 클러스터에서 실행 중인 포드와 연결된 이미지의 최신 상태를 검사하는 방법을 보여줍니다. 이를 수행하기 위해 CV는 이미지가 이미지 레지스트리에 업로드된 시간을 검사합니다.

이 검사는 Artifact Registry 및 Container Registry 저장소만 지원합니다.

비용

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

  • Binary Authorization. 하지만 미리보기 단계 중에 CV를 무료로 사용할 수 있습니다.
  • Google Kubernetes Engine

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

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud CLI를 설치합니다.
  3. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  4. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Artifact Registry, Binary Authorization, Google Kubernetes Engine API를 사용 설정합니다.

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com
  7. Google Cloud CLI를 설치합니다.
  8. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  9. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  10. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  11. Artifact Registry, Binary Authorization, Google Kubernetes Engine API를 사용 설정합니다.

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

필요한 역할

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

개요

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

정책 프로젝트의 Binary Authorization 서비스 에이전트에 CV 이미지 최신 상태 검사를 평가하는 데 필요한 권한이 있는지 확인하려면 정책 프로젝트의 Binary Authorization 서비스 에이전트에 다음 IAM 역할을 부여하도록 관리자에게 요청합니다.

  • 클러스터 프로젝트가 정책 프로젝트와 다른 경우: 정책 프로젝트에 액세스하기 위한 클러스터 프로젝트 Binary Authorization 서비스 에이전트에 대한 Binary Authorization 정책 평가자(roles/binaryauthorization.policyEvaluator)
  • 아티팩트 프로젝트가 정책 프로젝트와 다른 경우: 증명 프로젝트에 액세스하기 위한 정책 프로젝트 Binary Authorization 서비스 에이전트에 대한 Artifact Registry 리더(roles/artifactregistry.reader)
  • 아티팩트 프로젝트가 클러스터 프로젝트와 다른 경우: 아티팩트 프로젝트의 이미지 메타데이터에 액세스하기 위한 클러스터 프로젝트 Binary Authorization 서비스 에이전트에 대한 Artifact Registry 리더(roles/artifactregistry.reader)

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

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

gcloud CLI를 사용하여 역할 부여

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

정책 프로젝트가 다른 클러스터 프로젝트

클러스터 프로젝트의 Binary Authorization 서비스 에이전트에 정책 프로젝트에 대한 Binary Authorization 정책 평가자(roles/binaryauthorization.policyEvaluator) 역할을 부여합니다.

gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe CLUSTER_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
  --role=roles/binaryauthorization.policyEvaluator

다음을 바꿉니다.

  • POLICY_PROJECT_ID: 정책이 포함된 프로젝트의 ID입니다.
  • CLUSTER_PROJECT_ID: 클러스터의 프로젝트 ID입니다.

아티팩트 프로젝트와 다른 정책 프로젝트

정책 프로젝트의 Binary Authorization 서비스 에이전트에 아티팩트 프로젝트에 대한 Artifact Registry 리더(roles/artifactregistry.reader) 역할을 부여합니다.

gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
    --member="serviceAccount:service-$(gcloud projects describe POLICY_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
    --role=roles/artifactregistry.reader

ARTIFACT_PROJECT_ID를 Artifact Registry 저장소가 포함된 프로젝트의 ID로 바꿉니다.

아티팩트 프로젝트와 다른 클러스터 프로젝트

클러스터 프로젝트의 Binary Authorization 서비스 에이전트에 아티팩트 프로젝트에 대한 Artifact Registry 리더(roles/artifactregistry.reader) 역할을 부여합니다.

gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
    --member="serviceAccount:service-$(gcloud projects describe CLUSTER_PROJECT_ID --format='value(projectNumber)')@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
    --role=roles/artifactregistry.reader

다음을 바꿉니다.

  • ARTIFACT_PROJECT_ID: Artifact Registry 저장소가 포함된 프로젝트의 ID입니다.
  • CLUSTER_PROJECT_ID: GKE 클러스터를 실행하는 프로젝트 ID입니다.

플랫폼 정책 만들기

이미지 최신 상태 검사로 CV 플랫폼 정책을 만들려면 다음을 수행합니다.

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

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - imageFreshnessCheck:
            maxUploadAgeDays: MAX_UPLOAD_AGE_DAYS
          displayName: CHECK_DISPLAY_NAME
        displayName: CHECK_SET_DISPLAY_NAME
    EOF
    

    다음을 바꿉니다.

    • MAX_UPLOAD_AGE_DAYS: 이미지가 레지스트리에 업로드된 이후 경과된 최대 시간(일)입니다.
    • CHECK_SET_DISPLAY_NAME: 검사 집합에 대해 선택한 항목의 표시 이름(선택사항)입니다.
    • CHECK_DISPLAY_NAME: 검사에 대해 선택한 항목의 표시 이름(선택사항)입니다.
  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

CV 항목의 로그 보기

CV는 24시간 내에 플랫폼 정책 위반 사항을 Cloud Logging에 로깅합니다. 일반적으로 몇 시간 내에 항목이 표시됩니다.

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

지난 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입니다.

다음 단계