이 페이지에서는 Binary Authorization 지속적 검증(CV) Sigstore 서명 검사를 사용하는 방법을 보여줍니다. 이 검사는 CV가 사용 설정된 GKE 클러스터에서 실행되는 포드와 연결된 컨테이너 이미지의 Sigstore 생성 서명을 확인합니다. 이 검사와 단순 서명 증명 검사의 주요 차이점은 Sigstore 서명 워크플로에서는 서명을 이미지에 연결하는 데 Artifact Analysis 메모를 사용하지 않는다는 것입니다. 모든 서명은 서명한 이미지와 함께 저장됩니다.
이 검사는 Artifact Registry 저장소만 지원합니다.
비용
이 가이드에서는 다음 Google Cloud 서비스를 사용합니다.
- Binary Authorization. 하지만 미리보기 단계 중에 CV를 무료로 사용할 수 있습니다.
- GKE
- Cloud Key Management Service
- Artifact Registry
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com - gcloud CLI가 최신 버전으로 업데이트되었는지 확인합니다.
kubectl
명령줄 도구 설치- Binary Authorization 정책과 GKE 클러스터가 서로 다른 프로젝트에 있으면 Binary Authorization이 두 프로젝트 모두에 사용 설정되었는지 확인합니다.
cosign
명령줄 도구 설치
필요한 역할
이 섹션에서는 이 검사에 대해 역할을 설정하는 방법을 보여줍니다.
개요
이 가이드에 언급된 모든 제품을 동일한 프로젝트에서 실행할 경우에는 권한을 설정할 필요가 없습니다. 역할을 사용 설정하면 Binary Authorization에서 역할이 올바르게 구성됩니다. 서로 다른 프로젝트에서 제품을 실행할 때는 이 섹션의 설명에 따라 역할을 설정해야 합니다.
각 프로젝트의 Binary Authorization 서비스 에이전트에 CV Sigstore 서명 검사를 평가하는 데 필요한 권한이 있는지 확인하려면 각 프로젝트의 Binary Authorization 서비스 에이전트에 다음 IAM 역할을 부여해 달라고 관리자에게 요청하세요.
-
클러스터 프로젝트가 정책 프로젝트와 다른 경우: 클러스터 프로젝트 Binary Authorization 서비스 에이전트의 Binary Authorization 정책 평가자(
roles/binaryauthorization.policyEvaluator
) -
이미지 저장소 프로젝트가 정책 프로젝트와 다른 경우: 정책 프로젝트 Binary Authorization 서비스 에이전트의 Artifact Registry 리더(
roles/artifactregistry.reader
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
관리자는 맞춤 역할 또는 다른 사전 정의된 역할을 통해 각 프로젝트의 Binary Authorization 서비스 에이전트에 필요한 권한을 부여할 수도 있습니다.
gcloud CLI를 사용하여 역할 부여
각 프로젝트의 Binary Authorization 서비스 에이전트에 CV Sigstore 서명 검사를 평가하는 데 필요한 권한이 있는지 확인하기 위해 각 프로젝트의 Binary Authorization 서비스 에이전트에 다음 IAM 역할을 부여하도록 관리자에게 요청하세요.
클러스터 프로젝트의 Binary Authorization 서비스 에이전트에 정책 프로젝트의 정책에 액세스할 수 있는 권한을 부여합니다.
클러스터 프로젝트의 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로 바꿉니다.CV가 클러스터의 정책을 평가하도록 허용합니다.
gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \ --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \ --role='roles/binaryauthorization.policyEvaluator'
POLICY_PROJECT_ID
를 정책이 포함된 프로젝트의 ID로 바꿉니다.
정책 프로젝트 Binary Authorization 서비스 에이전트가 저장소의 서명에 액세스하도록 허용합니다.
정책 프로젝트의 Binary Authorization 서비스 에이전트를 가져옵니다.
PROJECT_NUMBER=$(gcloud projects list \ --filter="projectId:POLICY_PROJECT_ID" \ --format="value(PROJECT_NUMBER)") SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
POLICY_PROJECT_ID
를 정책이 포함된 프로젝트의 ID로 바꿉니다.다음 역할을 부여합니다.
gcloud projects add-iam-policy-binding REPOSITORY_PROJECT_ID \ --member="serviceAccount:$SERVICE_ACCOUNT" \ --role='roles/artifactregistry.reader'
REPOSITORY_PROJECT_ID
를 저장소가 포함된 프로젝트의 ID로 바꿉니다.
키 쌍 만들기
이 섹션에서는 타원 곡선 디지털 서명 알고리즘(ECDSA) 비대칭 키 쌍을 만듭니다.
비공개 키를 사용하여 이미지에 서명하면 증명이 생성됩니다. 플랫폼 정책에 공개 키를 포함합니다. CV는 증명을 검사할 때 공개 키를 사용하여 증명을 확인합니다.
Cloud Key Management Service(Cloud KMS) 또는 로컬 키를 사용할 수 있지만 프로덕션에는 Cloud KMS 키를 사용하는 것이 좋습니다.
PKIX Cloud KMS Cosign
키 쌍을 만드는 데 필요한 환경 변수를 설정합니다. 이렇게 하려면 다음 명령어에 자리표시자를 입력한 후 명령어를 실행하는 것이 좋습니다.
KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID KMS_KEYRING_NAME=KMS_KEYRING_NAME KMS_KEY_NAME=KMS_KEY_NAME KMS_KEY_LOCATION=global KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=ec-sign-p256-sha256 KMS_PROTECTION_LEVEL=software KMS_KEY_VERSION=1
다음을 바꿉니다.
KMS_KEY_PROJECT_ID
: 프로젝트 ID입니다.KMS_KEYRING_NAME
: Cloud KMS 키링의 이름입니다.KMS_KEY_NAME
: Cloud KMS 키의 이름입니다.
Cosign CLI로 키를 생성합니다.
cosign generate-key-pair \ --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
공개 키의 위치를 기록합니다.
Cosign은 생성된 공개 키를
generate-key-pair
명령어가 실행된 디렉터리에cosign.pub
로 자동 저장합니다. 이후 명령을 위해 이 파일 위치를 변수에 저장합니다.PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PKIX Cloud KMS gcloud
Cloud KMS에서 키 쌍을 만들려면 다음 안내를 따르세요.
키 쌍을 만드는 데 필요한 환경 변수를 설정합니다. 이렇게 하려면 다음 명령어에 자리표시자를 입력한 후 명령어를 실행하는 것이 좋습니다.
KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID KMS_KEYRING_NAME=KMS_KEYRING_NAME KMS_KEY_NAME=KMS_KEY_NAME KMS_KEY_LOCATION=global KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=ec-sign-p256-sha256 KMS_PROTECTION_LEVEL=software KMS_KEY_VERSION=1
다음을 바꿉니다.
KMS_KEY_PROJECT_ID
: 프로젝트 ID입니다.KMS_KEYRING_NAME
: Cloud KMS 키링의 이름입니다.KMS_KEY_NAME
: Cloud KMS 키의 이름입니다.
키링을 만듭니다.
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --project=${KMS_KEY_PROJECT_ID}
키를 만듭니다.
gcloud kms keys create ${KMS_KEY_NAME} \ --location=${KMS_KEY_LOCATION} \ --keyring=${KMS_KEYRING_NAME} \ --purpose=${KMS_KEY_PURPOSE} \ --default-algorithm=${KMS_KEY_ALGORITHM} \ --protection-level=${KMS_PROTECTION_LEVEL} \ --project=${KMS_KEY_PROJECT_ID}
공개 키 자료를 파일로 내보냅니다.
PUBLIC_KEY_FILE="$(pwd)/cosign.pub" gcloud kms keys versions get-public-key 1 \ --key=${KMS_KEY_NAME} \ --keyring=${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --output-file=${PUBLIC_KEY_FILE} \ --project=${KMS_KEY_PROJECT_ID}
로컬 키
로컬로 키 쌍을 만들려면 다음을 수행합니다.
cosign generate-key-pair
PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PRIVATE_KEY_FILE="$(pwd)/cosign.key"
플랫폼 정책 만들기
Sigstore 서명 확인을 통해 CV 플랫폼 정책을 만들려면 다음을 수행합니다.
Sigstore 서명 확인 플랫폼 정책 파일을 만듭니다.
cat > POLICY_PATH <<EOF gkePolicy: checkSets: - checks: - displayName: sigstore-signature-check sigstoreSignatureCheck: sigstoreAuthorities: - displayName: sigstore-authority publicKeySet: publicKeys: publicKeyPem: | $(awk '{printf " %s\n", $0}' ${PUBLIC_KEY_FILE}) EOF
POLICY_PATH
를 정책 파일의 경로로 바꿉니다.플랫폼 정책을 만듭니다.
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
- 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
- POLICY_ID: 선택한 플랫폼 정책 ID. 정책이 다른 프로젝트에 있으면
CV 사용 설정
검사 기반 플랫폼 정책으로 CV 모니터링을 사용하도록 새 클러스터를 만들거나 기존 클러스터를 업데이트할 수 있습니다.
CV 모니터링을 사용하는 클러스터 만들기
이 섹션에서는 검사 기반 플랫폼 정책으로 CV 모니터링만 사용하는 클러스터를 만듭니다.
아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.
CLUSTER_NAME
: 클러스터 이름입니다.LOCATION
: 위치입니다(예:us-central1
또는asia-south1
).POLICY_PROJECT_ID
: 정책이 저장된 프로젝트의 ID입니다.POLICY_ID
: 정책 IDCLUSTER_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
: 정책 IDCLUSTER_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
: 정책이 저장된 프로젝트의 IDPOLICY_ID
: 정책 IDCLUSTER_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
: 정책이 저장된 프로젝트의 IDPOLICY_ID
: 정책 IDCLUSTER_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를 테스트합니다. 이 경우 CV Sigstore 서명 확인은 서명을 확인하고 로그 항목을 생성하지 않습니다.
그 다음 서명되지 않은 다른 이미지를 배포하려고 시도합니다. 이 경우 CV 검사에서는 유효한 서명을 찾을 수 없으며 위반 사항을 Cloud Logging에 기록합니다.
이미지 서명
검사를 충족하려면 이미지에 유효한 서명이 필요합니다. 서명을 만들려면 다음 단계를 따르세요.
이미지에 서명하는 데 사용하는 변수를 만듭니다.
IMAGE_PATH=IMAGE_PATH IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
다음을 바꿉니다.
IMAGE_PATH
: 이미지의 경로IMAGE_DIGEST_SHA
: 이미지 다이제스트의 SHA 해시
이미지에 서명하고 서명을 Artifact Registry로 푸시합니다.
PKIX Cloud KMS
Cloud KMS에서 호스팅되는 키로 이미지에 서명하고 서명을 Artifact Registry로 푸시합니다.
cosign sign \ --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \ ${IMAGE_TO_SIGN}
로컬 키
로컬 비공개 키로 이미지에 서명하고 서명을 Artifact Registry에 푸시합니다.
cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
Cosign 프롬프트에 응답합니다.
cosign sign
명령어를 실행한 후 Cosign은 투명성 로그 Rekor에 서명을 업로드할지 묻습니다. 프롬프트에y
또는n
으로 응답합니다. Rekor에 대한 자세한 내용은 Rekor 문서를 참조하세요.
수동으로 서명 확인
서명을 수동으로 확인하려면 다음 단계를 따르세요.
Artifact Registry에 서명이 있는지 확인합니다.
Google Cloud 콘솔
Google Cloud 콘솔에서 Artifact Registry 페이지로 이동합니다.
저장소 목록에서 이미지가 포함된 저장소의 이름을 클릭합니다.
서명한 이미지의 이름을 클릭합니다.
서명이 포함된 항목을 찾습니다. 이 항목에는
sha256-[image digest].sig
태그가 있습니다. 태그가 있는 항목은 하나만 있어야 합니다.매니페스트를 클릭합니다.
다양한 필드가 포함된 JSON 형식의 파일이 표시됩니다. 각 서명은
annotations
맵에 있는layers
목록의 한 요소에 있습니다. 서명은dev.cosignproject.cosign/signature
키에 있습니다.다음은 매니페스트의 예시입니다.
{ "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": SIZE_OF_LAYERS, "digest": "DIGEST_OF_LAYERS" }, "layers": [ { "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json", "size": SIZE_OF_ANNOTATIONS, "digest": "DIGEST_OF_ANNOTATIONS", "annotations": { "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE", "dev.sigstore.cosign/bundle": "BUNDLE" } } ] }
예시 매니페스트에는 다음이 포함됩니다.
SIZE_OF_LAYERS
:layers
배열의 크기(바이트)DIGEST_OF_LAYERS
:layers
배열의 다이제스트SIZE_OF_ANNOTATIONS
:annotations
딕셔너리 크기(바이트)DIGEST_OF_ANNOTATIONS
:annotations
딕셔너리의 다이제스트BASE64_SIGNATURE
: base64 형식으로 인코딩된 원시 서명. 인증에 사용할 서명입니다.BUNDLE
: Sigstore 특정 메타데이터
매니페스트 형식에 대한 자세한 내용은 Sigstore의 cosign 서명 사양에서 확인할 수 있습니다.
명령줄
올바른 아티팩트를 찾습니다.
이미지와 함께 저장된 항목을 나열합니다.
gcloud artifacts docker tags list ${IMAGE_PATH}
예시 출력은 다음과 같이 표시됩니다.
Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME. TAG IMAGE DIGEST latest us-east1-docker.pkg.dev/my-project/my-repo/my-image sha256:abc123 sha256-abc123.sig us-east1-docker.pkg.dev/my-project/my-repo/my-image sha256:def456
출력에서
sha256-abc123.sig
태그가 있는 아티팩트에는 매니페스트에 서명이 포함되어 있습니다.매니페스트 가져오기
sha256-IMAGE_DIGEST_SHA.sig
태그가 있는 아티팩트의 매니페스트를 가져오려면 다음 명령어를 실행합니다.curl -X GET -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \ "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
다음을 바꿉니다.
REPOSITORY_PROJECT_ID
: 저장소가 포함된 프로젝트의 ID입니다.REPOSITORY_LOCATION
: 저장소의 위치입니다.REPOSITORY_NAME
: 저장소의 이름입니다.IMAGE_NAME
: 이미지의 이름입니다.
다양한 필드가 포함된 JSON 형식의 파일이 표시됩니다. 각 서명은
annotations
맵에 있는layers
목록의 한 요소에 있습니다. 서명은dev.cosignproject.cosign/signature
키에 있습니다.예시 매니페스트는 다음과 같습니다.
{ "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": SIZE_OF_LAYERS, "digest": "DIGEST_OF_LAYERS" }, "layers": [ { "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json", "size": SIZE_OF_ANNOTATIONS, "digest": "DIGEST_OF_ANNOTATIONS", "annotations": { "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE", "dev.sigstore.cosign/bundle": "BUNDLE" } } ] }
예시 매니페스트에는 다음이 포함됩니다.
SIZE_OF_LAYERS
:layers
배열의 크기(바이트)DIGEST_OF_LAYERS
:layers
배열의 다이제스트SIZE_OF_ANNOTATIONS
:annotations
딕셔너리 크기(바이트)DIGEST_OF_ANNOTATIONS
:annotations
딕셔너리의 다이제스트BASE64_SIGNATURE
: base64 형식으로 인코딩된 원시 서명. 인증에 사용할 서명입니다.BUNDLE
: Sigstore 특정 메타데이터
매니페스트 형식에 대한 자세한 내용은 Sigstore의 cosign 서명 사양에서 확인할 수 있습니다.
수동으로 서명을 확인합니다.
cosign verify
를 사용하여 업로드된 서명을 확인합니다.PKIX Cloud KMS
cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \ ${IMAGE_PATH}@${IMAGE_DIGEST}
로컬 키
cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
확인에 성공하면 명령어 결과에
The signatures were verified against the specified public key
라고 표시됩니다.
서명된 이미지 배포
서명된 이미지를 배포하려면 다음 단계를 따르세요.
kubectl
을 구성합니다.gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID
다음을 바꿉니다.
CLUSTER_NAME
: 클러스터 이름입니다.LOCATION
: 클러스터 위치입니다.CLUSTER_PROJECT_ID
: 클러스터 프로젝트 ID
이미지를 배포하고 Binary Authorization 정책에 따라 배포를 확인합니다.
kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
포드가 배포되었습니다. 이미지가 서명되었으므로 CV는 이 포드와 관련된 로그 항목을 생성하지 않습니다.
서명되지 않은 이미지 배포
이 섹션에서는 서명되지 않은 이미지를 배포합니다.
정책에 서명이 필요하고 이 이미지에 서명이 없기 때문에 컨테이너가 실행되는 동안 CV가 정기적으로 위반 사항을 로깅합니다.
이미지를 배포하려면 다음 명령어를 실행합니다.
kubectl run hello-app-unsigned \
--image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST
포드가 배포되었습니다. 이미지에 증명이 없기 때문에 포드가 실행되는 동안 CV가 로그 항목을 생성합니다.
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입니다.