서명된 컨테이너 이미지 Codelab

1. 개요

이 Codelab은 Confidential Space Codelab을 기반으로 합니다. 서명된 컨테이너 이미지 지원에 워크로드 ID 풀 (WIP) 정책에서 이미지 다이제스트를 지정하는 대신 증명된 공개 키를 사용하여 컨테이너를 인증하는 옵션이 제공되었습니다.

Confidential Space의 서명된 컨테이너 이미지 지원과 관련하여 변경된 사항:

사용성 향상: 서명된 컨테이너 이미지 기능이 도입됨에 따라 이제 이미지를 승인하는 공동작업자/감사자를 위해 워크로드 이미지 다이제스트 접근 방식에서 컨테이너 서명 접근 방식으로 전환할 수 있습니다.

  • 이미지 다이제스트를 직접 사용하는 경우 리소스 소유자는 새 이미지를 승인할 때마다 이미지 다이제스트로 정책을 업데이트해야 합니다. 이미지 서명을 사용하면 정책에 공개 키 지문이 포함되며, 해당 비공개 키는 공동작업자/감사자가 소유하고 감사된 이미지에 서명하는 데 사용됩니다.
  • 일부 보안 모델의 경우 신뢰할 수 있는 이미지 서명 키를 참조하는 것이 새 이미지 다이제스트 값 목록을 업데이트하는 것보다 편리합니다.

보안 회귀 없음: 신뢰 경계가 동일하게 유지되므로 이 컨테이너 서명 접근 방식은 이전 이미지 다이제스트 접근 방식에 비해 보안 회귀를 일으키지 않습니다. 컨테이너 서명 접근 방식에서 리소스 소유자는 WIP 정책에 신뢰할 수 있는 공개 키 지문을 지정하여 인증 키를 승인하고, 인증 확인 서비스와 WIP에서 승인 확인을 실행합니다. 인증 확인 서비스는 서명이 실행 중인 워크로드와 연결되어 있는지 확인하고, WIP 정책은 서비스에서 어설션한 공개 키가 정책에 의해 승인되었는지 확인합니다.

강력한 보안: 컨테이너 이미지 서명을 사용하면 이미지 signer에게 어느 정도의 신뢰를 위임할 수 있습니다. 증명 정책에서 신뢰할 수 있는 서명자의 공개 키 지문을 지정하면 리소스 소유자는 해당 서명자가 정책을 준수하는 컨테이너 이미지에 대해 보증하도록 승인합니다. 증명 검사기 서비스는 서명이 실행 중인 워크로드와 연결되어 있는지 확인하고 정책은 서명을 생성한 공개 키가 정책에 의해 승인되었는지 확인합니다. 이를 통해 이미지 서명이 제공하는 추가적인 간접 액세스 계층이 Confidential Space의 강력한 보안 보장을 유지합니다.

이러한 접근 방식의 유일한 차이점은 후자의 접근 방식에서는 워크로드 이미지가 서명 키로 승인되는 추가 간접 레이어를 사용한다는 점입니다. 신뢰 경계가 동일하게 유지되므로 새로운 보안 취약점이 발생하지 않습니다.

학습할 내용

이 Codelab에서는 컨테이너 이미지 서명을 활용하여 보호된 리소스에 대한 액세스를 승인하는 방법을 알아봅니다.

  • cosign를 사용하여 감사된 컨테이너 이미지에 서명하는 방법
  • 서명 검색 및 저장을 위해 컨테이너 이미지 서명을 OCI 레지스트리에 업로드하는 방법
  • Confidential Space 실행에 필요한 클라우드 리소스를 구성하는 방법
  • 서명된 컨테이너 이미지 지원을 사용하여 Confidential Space에서 워크로드를 실행하는 방법

이 Codelab에서는 Confidential Space를 사용하여 Google Compute Engine에서 실행되는 신뢰할 수 있는 키로 서명된 컨테이너 이미지를 원격으로 증명하는 방법을 보여줍니다.

필요한 항목

서명된 컨테이너 이미지가 있는 Confidential Space에 관련된 역할

이 Codelab에서는 Primus Bank가 감사자 및 리소스 소유자로, 다음을 담당합니다.

  1. 샘플 데이터로 필수 리소스 설정
  2. 워크로드 코드 감사
  3. cosign를 사용하여 워크로드 이미지에 서명
  4. 저장소에 서명 업로드
  5. 고객 데이터를 보호하기 위해 WIP 정책 구성

Secundus Bank는 워크로드 작성자 및 운영자이며 다음을 담당합니다.

  1. 결과를 저장하는 데 필요한 리소스를 설정합니다.
  2. 워크로드 코드 작성
  3. 워크로드 이미지 게시
  4. 서명된 컨테이너 이미지 지원을 사용하여 Confidential Space에서 워크로드를 실행합니다.

Secundus Bank는 Primus Bank가 소유하고 Cloud Storage 버킷에 저장된 고객 데이터를 쿼리하는 워크로드를 개발하고 게시합니다. Primus Bank는 워크로드를 감사하고, 컨테이너 이미지에 서명하고, 승인된 워크로드가 데이터에 액세스할 수 있도록 WIP 정책을 구성합니다. 이 워크로드 실행의 결과는 Secundus 은행이 소유한 Cloud Storage 버킷에 저장됩니다.

Confidential Space 설정과 관련된 리소스

이 Codelab에서는 GCP 프로젝트에 적절한 값으로 설정해야 하는 여러 변수를 참조합니다. 이 Codelab의 명령어는 이러한 변수가 설정되었다고 가정합니다. 예를 들어 export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'를 사용하여 Primus 은행의 입력 저장소 버킷 이름을 설정할 수 있습니다. resource-names 변수가 설정되지 않은 경우 GCP project-id를 기반으로 생성됩니다.

Primus 프로젝트에서 다음을 구성합니다.

  • $PRIMUS_INPUT_STORAGE_BUCKET: 고객 데이터 파일을 저장하는 버킷입니다.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: 사용자 인증 정보를 확인하는 워크로드 아이덴티티 풀 (WIP)입니다.
  • $PRIMUS_WIP_PROVIDER: 증명 검사기 서비스에서 서명한 토큰에 사용할 승인 조건이 포함된 워크로드 ID 풀 제공업체입니다.
  • $PRIMUS_SERVICEACCOUNT: $PRIMUS_WORKLOAD_IDENTITY_POOL가 보호된 리소스에 액세스하는 데 사용하는 서비스 계정입니다. 이 단계에서는 $PRIMUS_INPUT_STORAGE_BUCKET 버킷에 저장된 고객 데이터를 볼 수 있는 권한이 있습니다.
  • $PRIMUS_ENC_KEY: $PRIMUS_INPUT_STORAGE_BUCKET에 저장된 데이터를 암호화하는 데 사용되는 KMS 키입니다.

이 Codelab에 새로 추가된 리소스:

  • $PRIMUS_COSIGN_REPOSITORY: 워크로드 이미지 서명을 저장할 Artifact Registry입니다.
  • $PRIMUS_SIGNING_KEY: 감사자/데이터 공동작업자가 워크로드 이미지에 서명하는 데 사용되는 KMS 키입니다 (이 경우 Primus Bank).

Secundus 프로젝트에서 다음을 구성합니다.

  • $SECUNDUS_ARTIFACT_REGISTRY: 워크로드 Docker 이미지가 푸시될 아티팩트 저장소입니다.
  • $WORKLOAD_IMAGE_NAME: 워크로드 Docker 이미지의 이름입니다.
  • $WORKLOAD_IMAGE_TAG: 워크로드 Docker 이미지의 태그입니다.
  • $WORKLOAD_SERVICEACCOUNT: 워크로드를 실행하는 기밀 VM에 액세스할 권한이 있는 서비스 계정입니다.
  • $SECUNDUS_RESULT_BUCKET: 워크로드의 결과를 저장하는 버킷입니다.

기타 리소스:

  • primus_customer_list.csv에는 고객 데이터가 포함됩니다. 이 데이터를 $PRIMUS_INPUT_STORAGE_BUCKET에 업로드하고 이 데이터를 쿼리할 워크로드를 만듭니다.

기존 워크플로

Confidential Space에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 실행됩니다.

  1. 워크로드가 WIP에서 $PRIMUS_SERVICEACCOUNT의 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 검사기 서비스 토큰을 제공합니다.
  2. 증명 검사기 서비스 토큰의 워크로드 측정 클레임이 WIP의 속성 조건과 일치하면 $PRIMUS_SERVICEACCOUNT.의 액세스 토큰을 반환합니다.
  3. 워크로드는 $PRIMUS_SERVICEACCOUNT와 연결된 서비스 계정 액세스 토큰을 사용하여 $PRIMUS_INPUT_STORAGE_BUCKET 버킷의 고객 데이터에 액세스합니다.
  4. 워크로드는 해당 데이터에 대한 작업을 실행합니다.
  5. 워크로드는 $WORKLOAD_SERVICEACCOUNT 서비스 계정을 사용하여 해당 작업의 결과를 $SECUNDUS_RESULT_STORAGE_BUCKET 버킷에 씁니다.

서명된 컨테이너 지원을 포함한 새로운 워크플로

서명된 컨테이너 지원은 아래에 강조 표시된 대로 기존 워크플로에 통합됩니다. 서명된 컨테이너 이미지 지원을 사용하여 Confidential Space에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 실행됩니다.

  1. Confidential Space는 현재 실행 중인 워크로드 이미지와 관련된 컨테이너 서명을 발견하고 이를 증명 검사기에 전송합니다. 증명 검사기는 서명을 확인하고 증명 클레임에 유효한 서명을 포함합니다.
  2. 워크로드가 WIP에서 $PRIMUS_SERVICEACCOUNT의 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 검사기 서비스 토큰을 제공합니다.
  3. 증명 검사기 서비스 토큰의 컨테이너 서명 클레임이 WIP의 속성 조건과 일치하면 $PRIMUS_SERVICEACCOUNT의 액세스 토큰을 반환합니다.
  4. 워크로드는 $PRIMUS_SERVICEACCOUNT와 연결된 서비스 계정 액세스 토큰을 사용하여 $PRIMUS_INPUT_STORAGE_BUCKET 버킷의 고객 데이터에 액세스합니다.
  5. 워크로드는 해당 데이터에 대한 작업을 실행합니다.
  6. 워크로드는 $WORKLOAD_SERVICEACCOUNT를 사용하여 해당 작업의 결과를 $SECUNDUS_RESULT_STORAGE_BUCKET 버킷에 씁니다.

2. Cloud 리소스 설정

Confidential Space 설정의 일환으로 먼저 Primus 은행과 Secundus 은행의 GCP 프로젝트 아래에 필요한 클라우드 리소스를 만듭니다. 이 Codelab에 새로 추가된 리소스는 다음과 같습니다.

Primus 프로젝트에서 다음을 수행합니다.

  • 코드를 감사한 후 Secundus 워크로드에 서명하는 데 사용되는 KMS 서명 키입니다.
  • Cosign 서명을 저장할 Artifact Registry 저장소

Secundus 프로젝트에 새 리소스가 없습니다. 이러한 리소스가 설정되면 필요한 역할과 권한이 있는 워크로드의 서비스 계정을 만듭니다. 그런 다음 워크로드 이미지를 만들고 감사자인 Primus 은행에서 워크로드 이미지에 서명합니다. 그러면 데이터 공동작업자 (이 Codelab에서는 Primus 은행)가 워크로드를 승인하고 워크로드 운영자 (이 경우 Secundus 은행)가 워크로드를 실행합니다.

Confidential Space 설정의 일환으로 Primus 및 Secundus GCP 프로젝트에 필요한 클라우드 리소스를 만듭니다.

시작하기 전에

  • 아래 명령어를 사용하여 이 저장소를 클론하고 이 Codelab의 일부로 사용되는 필수 스크립트를 가져옵니다.
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • 이 Codelab의 디렉터리를 변경합니다.
cd confidential-space/codelabs/signed_container_codelab/scripts
  • 아래와 같이 필요한 프로젝트를 설정했는지 확인합니다.
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • 이 명령어를 사용하여 위에 언급된 리소스 이름의 변수를 설정합니다. 이러한 변수 (예: export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')를 사용하여 리소스 이름을 재정의할 수 있습니다.
  • 다음 스크립트를 실행하여 리소스 이름의 프로젝트 ID를 기반으로 나머지 변수 이름을 값으로 설정합니다.
source config_env.sh
  • 여기의 안내에 따라 cosign을 설치합니다.

Primus 은행 리소스 설정

이 단계에서는 Primus 은행에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Primus 은행의 리소스를 설정합니다. 이 단계의 일환으로 다음 리소스가 생성됩니다.

  • Primus 은행의 암호화된 고객 데이터 파일을 저장할 Cloud Storage 버킷 ($PRIMUS_INPUT_STORAGE_BUCKET)
  • Primus 은행의 데이터 파일을 암호화하는 KMS의 암호화 키 ($PRIMUS_ENC_KEY) 및 키링 ($PRIMUS_ENC_KEYRING)
  • 워크로드 ID 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL): 공급자에 구성된 속성 조건에 따라 클레임을 확인합니다.
  • 위에서 언급한 워크로드 ID 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($PRIMUS_SERVICEACCOUNT)으로 다음 IAM 액세스 권한이 있습니다.
  • roles/cloudkms.cryptoKeyDecrypter를 사용하여 데이터를 복호화합니다.
  • objectViewer: Cloud Storage 버킷에서 데이터를 읽습니다.
  • roles/iam.workloadIdentityUser: 이 서비스 계정을 워크로드 아이덴티티 풀에 연결합니다.
./setup_primus_bank_resources.sh

Secundus 은행 리소스 설정

이 단계에서는 Secundus 은행에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Secundus 은행의 리소스를 설정합니다. 이 단계의 일환으로 아래에 언급된 리소스가 생성됩니다.

  • Secundus 은행의 워크로드 실행 결과를 저장하는 Cloud Storage 버킷 ($SECUNDUS_RESULT_STORAGE_BUCKET)
./setup_secundus_bank_resources.sh

3. 워크로드 만들기 및 서명

워크로드 서비스 계정 만들기

이제 필요한 역할과 권한이 있는 워크로드의 서비스 계정을 만듭니다. 다음 스크립트를 실행하여 Secundus 은행 프로젝트에서 워크로드 서비스 계정을 만듭니다. 이 서비스 계정은 워크로드를 실행하는 VM에서 사용합니다.

  • 이 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT)에는 다음 역할이 있습니다.
  • confidentialcomputing.workloadUser: 증명 토큰 가져오기
  • logging.logWriter를 사용하여 Cloud Logging에 로그를 작성합니다.
  • objectViewer: $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage 버킷에서 데이터를 읽습니다.
  • objectAdmin를 사용하여 워크로드 결과를 $SECUNDUS_RESULT_STORAGE_BUCKET Cloud Storage 버킷에 씁니다.
./create_workload_serviceaccount.sh

워크로드 만들기

이 단계에서는 워크로드 Docker 이미지를 만듭니다. 이 Codelab에서 사용되는 워크로드는 인수로 제공된 지리적 위치에서 Primus 은행 고객 데이터의 고객 수를 집계하는 간단한 CLI 기반 Go 앱입니다. 다음 스크립트를 실행하여 다음 단계가 실행되는 워크로드를 만듭니다.

  • Secundus 은행이 소유한 Artifact Registry($SECUNDUS_ARTIFACT_REGISTRY)를 만듭니다.
  • 필수 리소스 이름으로 워크로드 코드를 업데이트합니다. 이 Codelab에 사용된 워크로드 코드는 여기에서 확인할 수 있습니다.
  • Go 바이너리를 빌드하고 워크로드 코드의 Docker 이미지를 빌드하기 위한 Dockerfile을 만듭니다. 이 Codelab에 사용된 Dockerfile은 여기에서 확인할 수 있습니다.
  • Secundus 은행이 소유한 Artifact Registry ($SECUNDUS_ARTIFACT_REGISTRY)에 Docker 이미지를 빌드하고 게시합니다.
  • $WORKLOAD_SERVICEACCOUNT$SECUNDUS_ARTIFACT_REGISTRY 읽기 권한을 부여합니다. 워크로드 컨테이너가 Artifact Registry에서 워크로드 Docker 이미지를 가져오려면 이 정보가 필요합니다.
./create_workload.sh

워크로드 서명

Cosign을 사용하여 워크로드 이미지에 서명합니다. Cosign은 기본적으로 서명하는 이미지와 동일한 저장소에 서명을 저장합니다. 서명에 다른 저장소를 지정하려면 COSIGN_REPOSITORY 환경 변수를 설정하면 됩니다.

여기에서는 Artifact Registry를 예로 들겠습니다. 원하는 경우 Docker Hub, AWS CodeArtifact와 같은 다른 OCI 기반 저장소를 선택할 수도 있습니다.

  1. Artifact Registry Docker 저장소를 만듭니다.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. 워크로드 이미지 서명을 위해 KMS에서 키링과 키를 만듭니다.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. Artifact Registry의 경우 $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME와 같은 전체 이미지 이름이 필요합니다. 서명 저장을 위해 컨테이너 이미지를 저장소에 업로드할 수 있습니다.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. $PRIMUS_COSIGN_REPOSITORY 저장소의 뷰어 역할을 $WORKLOAD_SERVICEACCOUNT 서비스 계정에 부여합니다. 이렇게 하면 Confidential Space에서 $PRIMUS_COSIGN_REPOSITORY에 업로드된 컨테이너 이미지 서명을 검색할 수 있습니다.
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign은 여러 서명 기능이 있는 강력한 도구입니다. 이 사용 사례에서는 Cosign이 키 쌍으로 서명하기만 하면 됩니다. 이 서명된 컨테이너 이미지 기능에는 공동 서명 키 없는 서명이 지원되지 않습니다.

키 쌍으로 서명할 때는 다음 두 가지 옵션이 있습니다.

  1. Cosign에서 생성한 로컬 키 쌍으로 서명합니다.
  2. 다른 위치 (예: KMS)에 저장된 키 쌍으로 서명합니다.
  1. 키 쌍이 없는 경우 Cosign에서 키 쌍을 생성합니다. 자세한 내용은 자체 관리 키로 서명을 참고하세요. 여기서는 키 쌍을 생성하고 워크로드에 서명하는 두 가지 방법 (로컬 및 KMS 제공자 사용)을 모두 지정했습니다. 이러한 방법 중 하나를 따라 워크로드 컨테이너에 서명하세요.
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

위에서 <provider>://<key>를 gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION로 바꿉니다.

  • <provider> : 사용 중인 KMS 솔루션을 나타냅니다.
  • <key> : KMS의 키 경로를 참조합니다.
  1. 확인을 위해 공개 키를 가져옵니다.
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. Cosign을 사용하여 워크로드에 서명합니다. 공개 키에 패딩되지 않은 base64 인코딩을 실행합니다.
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. 내보낸 공개 키와 서명 알고리즘이 첨부된 Cosign을 사용하여 워크로드에 서명합니다.
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [필수] 사용하려는 서명 키를 지정합니다. KMS 제공업체에서 관리하는 키를 참조할 때는 Sigstore KMS 지원의 특정 URI 형식을 따르세요. Cosign에서 생성된 키를 참조할 때는 cosign.key를 대신 사용하세요.
  • $IMAGE_REFERENCE [필수] 서명할 컨테이너 이미지를 지정합니다. IMAGE_REFERENCE의 형식은 태그 또는 이미지 다이제스트로 식별할 수 있습니다. 예: us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container[IMAGE-digest]
  • -a [필수] 서명 페이로드에 연결된 주석을 지정합니다. Confidential Space 서명 컨테이너 이미지의 경우 공개 키와 서명 알고리즘을 서명 페이로드에 연결해야 합니다.
  • dev.cosignproject.cosign/sigalg단지 다음 세 가지 값만 허용합니다.
  • RSASSA_PSS_SHA256: SHA256 다이제스트가 있는 PSS 패딩이 적용된 RSASSA 알고리즘입니다.
  • RSASSA_PKCS1V15_SHA256: SHA256 다이제스트가 있는 PKCS#1 v1.5 패딩이 있는 RSASSA 알고리즘입니다.
  • ECDSA_P256_SHA256: SHA256 다이제스트가 있는 P-256 곡선의 ECDSA입니다. 이는 Cosign에서 생성된 키 쌍의 기본 서명 알고리즘이기도 합니다.
  1. Docker 저장소에 서명 업로드

공동 서명 서명은 지정된 COSIGN_REPOSITORY.에 서명을 자동으로 업로드합니다.

4. 워크로드 승인 및 실행

워크로드 승인

이 단계에서는 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL) 아래에 워크로드 ID 공급업체를 설정합니다. 아래와 같이 워크로드 ID에 구성된 속성 조건이 있습니다. 한 가지 조건은 서명 공개 키의 지문과 비교하여 워크로드 이미지 서명의 지문을 확인하는 것입니다. 이 속성 조건을 사용하면 Secundus Bank에서 새 워크로드 이미지를 출시할 때 Primus Bank는 WIP 정책을 이미지 다이제스트로 업데이트할 필요 없이 워크로드 코드를 감사하고 새 워크로드 이미지에 서명합니다.

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
   --location="global" \
   --workload-identity-pool="${PRIMUS_WORKLOAD_IDENTITY_POOL}" \
   --issuer-uri="https://confidentialcomputing.googleapis.com/" \
   --allowed-audiences="https://sts.googleapis.com" \
   --attribute-mapping="google.subject='assertion.sub'" \
   --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
  'STABLE' in assertion.submods.confidential_space.support_attributes
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

워크로드 실행

이 단계에서는 컨피덴셜 VM에서 워크로드를 실행합니다. 필요한 TEE 인수는 메타데이터 플래그를 사용하여 전달됩니다. 워크로드 컨테이너의 인수는 플래그의 'tee-cmd' 부분을 사용하여 전달됩니다. 워크로드는 결과를 $SECUNDUS_RESULT_STORAGE_BUCKET에 게시하도록 코딩됩니다.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --project=${SECUNDUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"

결과 보기

Secundus 프로젝트에서 워크로드의 결과를 확인합니다.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

결과는 3여야 합니다. primus_customer_list.csv 파일에 시애틀 출신 사용자가 3명 등록되어 있기 때문입니다.

5. 삭제

이 Codelab의 일부로 만든 리소스를 정리하는 데 사용할 수 있는 스크립트는 여기에서 확인할 수 있습니다. 이번 정리 작업의 일환으로 다음 리소스가 삭제됩니다.

  • Primus 은행의 저장소 버킷 ($PRIMUS_INPUT_STORAGE_BUCKET)을 입력합니다.
  • Primus 은행 서비스 계정 ($PRIMUS_SERVICEACCOUNT)
  • 이미지 서명을 보유한 Primus Bank 아티팩트 레지스트리 ($PRIMUS_COSIGN_REPOSITORY)
  • Primus Bank 워크로드 ID 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • Secundus Bank의 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT)
  • 워크로드 Compute 인스턴스
  • Secundus Bank의 결과 저장소 버킷 ($SECUNDUS_RESULT_STORAGE_BUCKET)
  • Secundus Bank의 아티팩트 레지스트리 ($SECUNDUS_ARTIFACT_REGISTRY)
  • Secundus Bank의 워크로드 VM ($WORKLOAD_VM)
./cleanup.sh

탐색이 완료되면 프로젝트를 삭제하는 것이 좋습니다.

  • Cloud Platform Console로 이동합니다.
  • 종료하려는 프로젝트를 선택한 다음 상단에서 '삭제'를 클릭합니다. 그러면 프로젝트가 삭제되도록 예약됩니다.

축하합니다

축하합니다. Codelab을 완료했습니다.

서명된 컨테이너 이미지 기능을 활용하여 Confidential Space의 사용성을 개선하는 방법을 알아봤습니다.

다음 단계

다음과 같은 유사한 Codelab을 확인해 보세요.

추가 자료