서명된 컨테이너 이미지 Codelab

1. 개요

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

Confidential Space의 서명된 컨테이너 이미지 지원으로 변경된 사항:

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

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

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

강력한 보안: 컨테이너 이미지 서명을 사용하면 이미지 서명자에게 일정 수준의 신뢰를 위임할 수 있습니다. 리소스 소유자는 증명 정책에 신뢰할 수 있는 서명자의 공개 키 디지털 지문을 지정하여 해당 서명자가 정책을 충족하는 컨테이너 이미지를 인증하도록 승인합니다. 증명 확인 서비스는 서명이 실행 중인 워크로드와 연결되어 있는지 확인하고 정책은 서명을 만든 공개 키가 정책에 의해 승인되었는지 확인합니다. 이를 통해 이미지 서명이 제공하는 추가 간접 레이어를 통해 Confidential Space의 강력한 보안을 보장합니다.

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

학습할 내용

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

  • 코사인을 사용하여 감사된 컨테이너 이미지에 서명하는 방법
  • 서명 탐색 및 스토리지를 위해 컨테이너 이미지 서명을 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는 워크로드를 감사하고, 컨테이너 이미지를 서명하며, 승인된 워크로드에서 데이터에 액세스할 수 있도록 WIP 정책을 구성합니다. 이 워크로드 실행 결과는 Secundus Bank 소유의 클라우드 스토리지 버킷에 저장됩니다.

Confidential Space 설정과 관련된 리소스

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

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

  • $PRIMUS_INPUT_STORAGE_BUCKET: 고객 데이터 파일을 저장하는 버킷입니다.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL: 클레임을 검증하는 워크로드 아이덴티티 풀 (WIP)입니다.
  • $PRIMUS_WIP_PROVIDER: 증명 확인자 서비스에서 서명한 토큰에 사용할 승인 조건이 포함된 워크로드 아이덴티티 풀 제공업체입니다.
  • $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 키입니다 (예: 이 경우 Prius bank).

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

  • $SECUNDUS_ARTIFACT_REGISTRY: 워크로드 Docker 이미지가 푸시될 Artifact Registry입니다.
  • $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. 클라우드 리소스 설정

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

Primus 프로젝트에서:

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

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

Confidential Space 설정 과정에서 Primus 및 Secundus GCP 프로젝트에 필요한 클라우드 리소스를 생성합니다.

시작하기 전에

  • 아래 명령어를 사용하여 이 저장소를 클론하여 이 Codelab의 일부로 사용되는 필수 스크립트를 가져옵니다.
$ git clone https://github.com/GoogleCloudPlatform/confidential-space
  • 아래와 같이 필수 프로젝트를 설정했는지 확인하세요.
$ 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').
  • 다음 script를 실행하여 나머지 변수 이름을 리소스 이름의 프로젝트 ID에 따른 값으로 설정합니다.
$ source config_env.sh
  • 여기의 안내에 따라 코사인을 설치합니다.

Primus Bank 리소스 설정

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

  • Primus Bank의 암호화된 고객 데이터 파일을 저장할 Cloud Storage 버킷 ($PRIMUS_INPUT_STORAGE_BUCKET)입니다.
  • Primus 뱅크의 데이터 파일을 암호화하기 위한 KMS의 암호화 키 ($PRIMUS_ENC_KEY)와 키링 ($PRIMUS_ENC_KEYRING)
  • 제공업체에서 구성된 속성 조건을 기반으로 클레임을 검증하는 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • 위에서 언급한 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($PRIMUS_SERVICEACCOUNT)으로 다음 IAM 액세스 권한을 가집니다.
  • roles/cloudkms.cryptoKeyDecrypter - KMS 키를 사용하여 데이터를 복호화합니다.
  • Cloud Storage 버킷에서 데이터를 읽기 위한 objectViewer 권한
  • 이 서비스 계정을 워크로드 아이덴티티 풀에 연결하기 위한 roles/iam.workloadIdentityUser 권한
$ ./setup_primus_bank_resources.sh

Secundus 은행 리소스 설정

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

  • Secundus Bank의 워크로드 실행 결과를 저장할 Cloud Storage 버킷 ($SECUNDUS_RESULT_STORAGE_BUCKET)입니다.
$ ./setup_secundus_bank_resources.sh

3. 워크로드 생성 및 서명

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

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

  • 이 워크로드 서비스 계정 ($WORKLOAD_SERVICEACCOUNT)에 다음 역할이 부여됩니다.
  • 증명 토큰 가져오기에 필요한 confidentialcomputing.workloadUser
  • logging.logWriter: Cloud Logging에 로그를 작성합니다.
  • $PRIMUS_INPUT_STORAGE_BUCKET Cloud Storage 버킷에서 데이터를 읽기 위한 objectViewer 권한
  • 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입니다.
  • Docker 이미지를 빌드하여 Secundus 은행 소유의 Artifact Registry ($SECUNDUS_ARTIFACT_REGISTRY)에 게시합니다.
  • $WORKLOAD_SERVICEACCOUNT$SECUNDUS_ARTIFACT_REGISTRY의 읽기 권한을 부여합니다. 이 작업은 워크로드 컨테이너가 Artifact Registry에서 워크로드 Docker 이미지를 가져오는 데 필요합니다.
$ ./create_workload.sh

워크로드 서명

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=us
  1. 워크로드 이미지 서명을 위해 KMS에서 키링과 키를 만듭니다.
$ gcloud config set project $PRIMUS_PROJECT_ID

$ gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=global

$ gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256
  --location=us
  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에 키 쌍을 생성합니다. 자세한 내용은 자체 관리 키로 서명을 참조하세요.
// 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님과 공유

  • &lt;provider&gt; : 사용 중인 KMS 솔루션을 나타냅니다.
  • &lt;key&gt; : 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. 내보낸 공개 키 및 서명 알고리즘이 연결된 공동 서명을 사용하여 워크로드를 서명합니다.
$ 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입니다. 이는 공동 서명으로 생성된 키 쌍의 기본 서명 알고리즘이기도 합니다.
  1. Docker 저장소에 서명 업로드

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

4. 워크로드 승인 및 실행

워크로드 승인

이 단계의 일환으로 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)에 워크로드 아이덴티티 공급업체를 설정합니다. 아래와 같이 워크로드 아이덴티티에 구성된 속성 조건이 있습니다. 조건 중 하나는 공개 키의 지문 서명과 대조하여 워크로드 이미지 서명의 디지털 지문을 검증하는 것입니다. 이 속성 조건을 사용하면 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 config set project $SECUNDUS_PROJECT_ID

$ gcloud compute instances create signed-container-vm \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=TERMINATE \
 --scopes=cloud-platform --zone=us-west1-b \
 --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 파일에 나열된 시애틀의 인원수이기 때문입니다.

5. 삭제

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

  • Primus 은행의 입력 스토리지 버킷 ($PRIMUS_INPUT_STORAGE_BUCKET)
  • Primus 은행 서비스 계정 ($PRIMUS_SERVICEACCOUNT)
  • 이미지 서명 ($PRIMUS_COSIGN_REPOSITORY)을 보유한 Primus Bank Artifact Registry입니다.
  • Primus Bank 워크로드 아이덴티티 풀 ($PRIMUS_WORKLOAD_IDENTITY_POOL)
  • Secundus Bank ($WORKLOAD_SERVICEACCOUNT)의 워크로드 서비스 계정입니다.
  • 워크로드 컴퓨팅 인스턴스입니다.
  • Secundus Bank의 결과 스토리지 버킷 ($SECUNDUS_RESULT_STORAGE_BUCKET)
  • Secundus Bank의 Artifact Registry ($SECUNDUS_ARTIFACT_REGISTRY)입니다.
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh

탐색을 마쳤으면 프로젝트를 삭제하는 것이 좋습니다.

  • Cloud Platform Console로 이동합니다.
  • 종료할 프로젝트를 선택한 후 '삭제'를 클릭하세요. 상단: 프로젝트 삭제가 예약됩니다.

축하합니다

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

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

다음 단계

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

추가 자료