Cloud Run 및 Google Kubernetes Engine에 대한 이미지 배포 보안

이 페이지에서는 Cloud Build를 사용하여 Cloud Run 및 Google Kubernetes Engine에 대해 이미지 배포를 보호하는 방법을 안내합니다.

빌드 증명을 확인하고 Cloud Build에서 생성되지 않은 이미지 배포를 차단하도록 Binary Authorization을 구성하는 방법을 알아봅니다. 이 프로세스는 승인되지 않은 소프트웨어를 배포할 위험을 줄여줄 수 있습니다.

시작하기 전에

  1. API Cloud Build, Binary Authorization, and Artifact Registry 사용 설정

    API 사용 설정

  2. 이 가이드에서 명령줄 예시를 사용하려면 Google Cloud SDK를 설치하고 구성하세요.

  3. 플랫폼에 Binary Authorization을 설정합니다.

Binary Authorization으로 배포 제어

Binary Authorization의 정책은 이미지 배포를 제어하는 규칙 집합입니다. 규칙에서 디지털 서명된 증명을 요구하도록 구성할 수 있습니다.

Cloud Build는 빌드 시 증명을 생성하고 서명합니다. Binary Authorization을 사용하면 built-by-cloud-build 증명자를 사용하여 증명을 확인하고 Cloud Build에서 빌드된 이미지만 배포할 수 있습니다.

프로젝트에서 built-by-cloud-build 증명자를 만들려면 해당 프로젝트에서 빌드를 실행하세요.

Cloud Build에서 빌드한 이미지만 배포하도록 허용하려면 다음 단계를 수행합니다.

콘솔

  1. Google Cloud 콘솔의 Binary Authorization 페이지로 이동합니다.

    Binary Authorization으로 이동

  2. 정책 탭에서 정책 수정을 클릭합니다.

  3. 정책 수정 대화상자에서 다음 모든 증명자가 승인한 이미지만 허용을 선택합니다.

  4. 증명자 추가를 클릭합니다.

  5. 증명자 추가 대화상자에서 다음을 수행합니다.

    1. 프로젝트 및 증명자 이름으로 추가를 선택하고 다음 단계를 수행합니다.
      1. 프로젝트 이름 필드에 Cloud Build를 실행할 프로젝트를 입력합니다.
      2. 증명자 이름 필드를 클릭하고 built-by-cloud-build 증명자를 사용할 수 있는지 확인합니다.
      3. built-by-cloud-build를 클릭합니다.
    2. 또는 증명자 리소스 ID로 추가를 선택합니다. 증명자 리소스 ID에 다음을 입력합니다.

      projects/PROJECT_ID/attestors/built-by-cloud-build
      

      PROJECT_ID를 Cloud Build를 실행하는 프로젝트로 바꿉니다.

  6. 증명자 1개 추가를 클릭합니다.

  7. 정책 저장을 클릭합니다.

gcloud

  1. 다음 명령어를 사용하여 기존 정책을 파일로 내보냅니다.

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. 정책 파일을 수정합니다.

  3. 다음 규칙 중 하나를 수정합니다.

    • defaultAdmissionRule
    • clusterAdmissionRules
    • istioServiceIdentityAdmissionRules
    • kubernetesServiceAccountAdmissionRules
  4. 아직 규칙이 없으면 requireAttestationsBy 블록을 규칙에 추가합니다.

  5. requireAttestationsBy 블록에 다음을 추가합니다.

    projects/PROJECT_ID/attestors/built-by-cloud-build
    

    PROJECT_ID를 Cloud Build를 실행하는 프로젝트로 바꿉니다.

  6. 정책 파일을 저장합니다.

  7. 정책 파일을 가져옵니다.

    gcloud container binauthz policy import /tmp/policy.yaml
    

    다음은 built-by-cloud-build-attestor에 대한 참조가 포함된 정책 파일 예시입니다.

    defaultAdmissionRule:
      evaluationMode: REQUIRE_ATTESTATION
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      requireAttestationsBy:
        - projects/PROJECT_ID/attestors/built-by-cloud-build
    name: projects/PROJECT_ID/policy
    

    PROJECT_ID를 Cloud Build를 실행하는 프로젝트 ID로 바꿉니다.

GKE 또는 Cloud Run에 대한 Binary Authorization 로그 메시지에서 정책 오류를 볼 수 있습니다.

테스트 실행 모드 사용

테스트 실행 모드에서 Binary Authorization은 배포를 실제로 차단하지 않고 정책 규정 준수를 확인합니다. 대신 정책 규정 준수 상태 메시지가 Cloud Logging에 로깅됩니다. 이러한 로그를 사용하여 차단 정책이 올바르게 작동하는지 확인하고 거짓양성을 식별할 수 있습니다.

테스트 실행을 사용 설정하려면 다음을 수행합니다.

콘솔

  1. Google Cloud 콘솔의 Binary Authorization 페이지로 이동합니다.

    Binary Authorization으로 이동

  2. 정책 수정을 클릭합니다.

  3. 기본 규칙이나 특정 규칙에서 테스트 실행 모드를 선택합니다.

  4. 정책 저장을 클릭합니다.

gcloud

  1. Binary Authorization 정책을 YAML 파일로 내보냅니다.

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 텍스트 편집기에서 enforcementModeDRYRUN_AUDIT_LOG_ONLY로 설정하고 파일을 저장하세요.

  3. 정책을 업데이트하려면 다음 명령어를 실행하여 파일을 가져옵니다.

    gcloud container binauthz policy import /tmp/policy.yaml
    

GKE 또는 Cloud Run에 대한 Binary Authorization 로그 메시지에서 정책 오류를 볼 수 있습니다.

제한사항

  • Cloud Build와 Binary Authorization이 같은 프로젝트에 있어야 합니다. 다른 프로젝트에서 배포 플랫폼을 실행하는 경우 다중 프로젝트 설정의 IAM 역할을 구성하고 Binary Authorization에서 built-by-cloud-build 증명자를 추가할 때 Cloud Build 프로젝트를 참조합니다.

  • 명시적인 docker push 빌드 단계를 사용해서 Artifact Registry에 이미지를 푸시할 때는 Cloud Build에서 증명이 생성되지 않습니다. docker build 빌드 단계에서 images 필드를 사용하여 Artifact Registry에 푸시해야 합니다. images에 대한 자세한 내용은 Artifact Registry에서 이미지를 저장하는 다양한 방법을 참조하세요.

  • 빌드 파이프라인 및 배포 파이프라인에 대해 개별 빌드 구성 파일을 사용해야 합니다. 빌드 파이프라인이 성공적으로 완료된 후에만 Cloud Build가 증명을 생성하기 때문입니다. 그런 후 이미지를 배포하기 전 Binary Authorization이 증명을 확인합니다.

비공개 풀에서 증명 사용 설정

기본적으로 Cloud Build는 비공개 풀의 빌드에 대해 Binary Authorization 증명을 생성하지 않습니다. 증명을 생성하려면 빌드 구성 파일requestedVerifyOption: VERIFIED 옵션을 추가합니다.

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
  requestedVerifyOption: VERIFIED

requestedVerifyOption을 추가하면 Cloud Build가 이미지에 대해 증명 생성 및 출처 메타데이터를 사용 설정합니다.

증명자 메타데이터 보기

증명자는 프로젝트에서 빌드를 처음 실행할 때 생성됩니다. 증명자 ID는 projects/PROJECT_ID/attestors/built-by-cloud-build 형식이고, 여기서 PROJECT_ID는 프로젝트 ID입니다.

다음 명령어를 사용하여 빌드 증명자 메타데이터를 확인할 수 있습니다.

curl -X GET -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://binaryauthorization.googleapis.com/v1beta1/projects/PROJECT_ID/attestors/built-by-cloud-build

PROJECT_ID를 Cloud Build를 실행하는 프로젝트로 바꿉니다.

출력에는 증명자 및 해당 공개 키에 대한 정보가 포함됩니다. 예를 들면 다음과 같습니다.

name": "projects/PROJECT_ID/attestors/built-by-cloud-build",
  "userOwnedDrydockNote": {
    "noteReference": "projects/PROJECT_ID/notes/built-by-cloud-build",
    "publicKeys": [
      {
        "id": "//cloudkms.googleapis.com/v1/projects/verified-builder/locations/asia/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1",
        "pkixPublicKey": {
          "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMMvFxZLgIiWOLIXsaTkjTmOKcaK7\neIZrgpWHpHziTFGg8qyEI4S8O2/2wh1Eru7+sj0Sh1QxytN/KE5j3mTvYA==\n-----END PUBLIC KEY-----\n",
          "signatureAlgorithm": "ECDSA_P256_SHA256"
        }
      },
...
      }
    ],
    "delegationServiceAccountEmail": "service-942118413832@gcp-binaryauthorization.iam.gserviceaccount.com"
  },
  "updateTime": "2021-09-24T15:26:44.808914Z",
  "description": "Attestor autogenerated by build ID fab07092-30f4-4f70-caf7-4545cbc404d6"

다음 단계