1. 개요
Confidential Space는 조직이 데이터의 기밀성을 유지하면서도 안전한 다자간 데이터 공유 및 공동작업을 지원합니다. 즉, 조직은 데이터를 관리하고 무단 액세스로부터 보호하면서도 서로 협업할 수 있습니다.
Confidential Space를 사용하면 민감한 데이터(종종 규제 대상)를 집계하고 분석하여 상호 가치를 얻는 동시에 데이터에 대한 완전한 제어권을 유지할 수 있습니다. Confidential Space를 사용하면 조직은 개인 식별 정보 (PII), 보호 건강 정보 (PHI), 지적 재산, 암호화된 보안 비밀과 같은 민감한 정보를 집계하고 분석하여 상호 가치를 얻는 동시에 이러한 정보에 대한 완전한 제어권을 유지할 수 있습니다.
필요한 항목
- Google Cloud Platform 프로젝트
- 브라우저(Chrome, Firefox 등)
- Google Compute Engine ( 코드랩), 컨피덴셜 VM, 컨테이너, 원격 저장소에 대한 기본 지식
- Cloud KMS에 대한 기본 지식 ( 코드랩)
- 서비스 계정, 워크로드 아이덴티티 제휴, 속성 조건에 관한 기본 지식
학습할 내용
- Confidential Space를 실행하는 데 필요한 Cloud 리소스를 구성하는 방법
- Confidential Space VM 이미지를 실행하는 컨피덴셜 VM에서 워크로드를 실행하는 방법
- 워크로드 코드 (무엇), 컨피덴셜 스페이스 환경 (어디), 워크로드를 실행하는 계정 (누구)의 속성을 기반으로 보호된 리소스에 대한 액세스 권한을 승인하는 방법
이 Codelab에서는 Primus Bank와 Secundus Bank 간에 컨피덴셜 스페이스를 설정하여 서로 전체 계정 목록을 공유하지 않고도 공통 고객을 파악합니다. 여기에는 다음 단계가 포함됩니다.
- 1단계: Primus Bank 및 Secundus Bank에 필요한 클라우드 리소스를 설정합니다. 이러한 클라우드 리소스에는 Primus Bank 및 Secundus Bank의 클라우드 스토리지 버킷, KMS 키, 워크로드 아이덴티티 풀, 서비스 계정이 포함됩니다. Primus Bank와 Secundus Bank는 Cloud Storage 버킷에 고객 데이터를 저장하고 Cloud Key Management Service 키를 사용하여 데이터를 암호화합니다.
- 2단계: 워크로드 VM에서 사용할 워크로드 서비스 계정을 만듭니다. 워크로드의 운영자인 Secundus Bank가 워크로드 VM을 실행합니다. Primus Bank에서 워크로드 코드를 작성합니다.
- 3단계: 두 개의 CLI 명령어가 포함된 워크로드를 만듭니다. 하나는 제공된 위치의 고객 수를 계산하는 명령어이고 다른 하나는 Primus Bank와 Secundus Bank의 공통 고객을 찾는 명령어입니다. 워크로드는 Primus Bank에서 작성하며 Docker 이미지로 패키징됩니다. 이 Docker 이미지는 Artifact Registry에 게시됩니다.
- 4단계: 워크로드를 승인합니다. Primus Bank는 워크로드 아이덴티티 풀을 사용하여 워크로드를 실행하는 사용자, 워크로드의 기능, 워크로드 실행 위치의 속성을 기반으로 고객 데이터에 액세스하도록 워크로드에 권한을 부여합니다.
- 5단계: 워크로드가 실행되면 워크로드 및 환경 클레임이 포함된 증명 검증 도구 서비스 토큰을 제공하여 데이터 공동작업자 (Primus Bank 및 Secundus Bank)의 클라우드 리소스에 대한 액세스를 요청합니다. 토큰의 워크로드 측정값이 Primus Bank 및 Secundus Bank의 워크로드 아이덴티티 풀에 있는 속성 조건과 일치하면 해당 클라우드 리소스에 액세스할 수 있는 권한이 있는 서비스 계정 액세스 토큰이 반환됩니다. 클라우드 리소스는 Confidential Space 내에서 실행되는 워크로드에만 액세스할 수 있습니다.
- 5단계(a): 특정 위치의 Primus Bank 고객을 집계하는 첫 번째 워크로드를 실행합니다. 이 워크로드의 경우 Primus Bank는 데이터 공동작업자이자 워크로드 작성자가 되며, Confidential Space에서 실행되는 워크로드에 암호화된 고객 목록을 제공합니다. Secundus Bank는 워크로드 운영자가 되며 Confidential Space에서 워크로드를 실행합니다.
- 5단계(b): Primus Bank와 Secundus Bank의 공통 고객을 찾는 두 번째 워크로드를 실행합니다. 이 워크로드에서 Primus Bank와 Secundus Bank는 모두 데이터 공동작업자가 됩니다. 이러한 파트너는 Confidential Space에서 실행되는 워크로드에 암호화된 고객 목록을 제공합니다. Secundus Bank가 다시 워크로드 운영자가 됩니다. 이 워크로드는 공통 고객을 찾기 위해 Secundus Bank의 암호화된 고객 목록에도 액세스해야 하므로 Secundus Bank에서도 승인합니다. 이 경우 Secundus Bank는 Primus Bank의 4단계에 설명된 대로 워크로드를 실행하는 사용자, 워크로드가 수행하는 작업, 워크로드가 실행되는 위치의 속성을 기반으로 워크로드가 고객 데이터에 액세스하도록 승인합니다.

2. 클라우드 리소스 설정
시작하기 전에
- 아래 명령어를 사용하여 이 저장소를 클론하여 이 Codelab의 일부로 사용되는 필수 스크립트를 가져옵니다.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- 이 Codelab의 디렉터리로 변경합니다.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
- 아래와 같이 필수 프로젝트 환경 변수를 설정했는지 확인합니다. GCP 프로젝트 생성에 대한 자세한 내용은 이 Codelab을 참고하세요. 이 페이지에서 프로젝트 ID를 가져오는 방법과 프로젝트 이름 및 프로젝트 번호와 어떻게 다른지 자세히 알아볼 수 있습니다.
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
- 프로젝트에 결제를 사용 설정합니다.
- 두 프로젝트 모두에 컨피덴셜 컴퓨팅 API와 다음 API를 사용 설정합니다.
gcloud services enable \
cloudapis.googleapis.com \
cloudkms.googleapis.com \
cloudresourcemanager.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
iam.googleapis.com \
confidentialcomputing.googleapis.com
- 이 명령어를 사용하여 아래에 언급된 리소스 이름의 변수를 설정합니다. 이러한 변수 (예:
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')를 사용하여 리소스 이름을 재정의할 수 있습니다. - Primus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Primus 프로젝트의 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않은 경우 클라우드 리소스 이름이 project-name에서 생성되고 새 클라우드 리소스가 다음의 일부로 생성됩니다.
| Primus Bank의 고객 데이터 파일을 저장하는 버킷입니다. |
| 클레임을 검증하는 Primus Bank의 워크로드 아이덴티티 풀 (WIP)입니다. |
| 증명 검증 도구 서비스에서 서명한 토큰에 사용할 승인 조건을 포함하는 Primus Bank의 워크로드 아이덴티티 풀 제공업체입니다. |
|
|
| Primus Bank의 |
| Primus Bank의 암호화 키 |
| 워크로드 Docker 이미지가 푸시될 아티팩트 저장소입니다. |
- Secundus 프로젝트의 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Secundus 프로젝트의 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않은 경우 클라우드 리소스 이름이 project-name에서 생성되고 새 클라우드 리소스가 다음의 일부로 생성됩니다.
| Secundus Bank의 고객 데이터 파일을 저장하는 버킷 |
| 클레임을 검증하는 Secundus Bank의 워크로드 아이덴티티 풀 (WIP)입니다. |
| 증명 검증 도구 서비스에서 서명한 토큰에 사용할 승인 조건을 포함하는 Secundus Bank의 워크로드 아이덴티티 풀 제공업체입니다. |
|
|
| Secundus Bank의 |
| Secundus Bank의 암호화 키 |
| 워크로드 결과를 저장하는 버킷입니다. |
| 워크로드 컨테이너 이미지 이름입니다. |
| 워크로드 컨테이너 이미지의 태그입니다. |
| 워크로드를 실행하는 컨피덴셜 VM에 액세스할 수 있는 권한이 있는 서비스 계정입니다. |
- 이 Codelab에서는 아래와 같은 몇 가지 아티팩트가 사용됩니다.
primus_customer_list.csv: Primus Bank의 고객 데이터가 포함된 파일입니다. 여기에서 이 Codelab에 사용된 샘플 파일을 확인할 수 있습니다.secundus_customer_list.csv: Secundus Bank의 고객 데이터가 포함된 파일입니다. 여기에서 이 Codelab에 사용된 샘플 파일을 확인할 수 있습니다.- 이 두 프로젝트에는 다음과 같은 특정 권한이 필요합니다.
$PRIMUS_PROJECT_ID의 경우 Cloud KMS 관리자, 스토리지 관리자, Artifact Registry 관리자, 서비스 계정 관리자, IAM 워크로드 아이덴티티 풀 관리자가 필요합니다.$SECUNDUS_PROJECT_ID의 경우 Compute 관리자, 스토리지 관리자, 서비스 계정 관리자, Cloud KMS 관리자, IAM 워크로드 아이덴티티 풀 관리자, 보안 관리자 (선택사항)가 필요합니다.- 다음 스크립트를 실행하여 나머지 변수 이름을 리소스 이름의 프로젝트 ID를 기반으로 하는 값으로 설정합니다.
source config_env.sh
Primus Bank의 클라우드 리소스 설정
Primus Bank에는 다음 클라우드 리소스가 필요합니다. 이 스크립트를 실행하여 Primus Bank의 리소스를 설정합니다.
- Primus Bank의 암호화된 고객 데이터 파일을 저장할 Cloud Storage 버킷 (
$PRIMUS_INPUT_STORAGE_BUCKET) - Primus Bank의 고객 데이터 파일을 암호화하기 위한 KMS의 암호화 키 (
$PRIMUS_ENC_KEY) 및 키링 ($PRIMUS_ENC_KEYRING) - 공급업체에 구성된 속성 조건을 기반으로 클레임을 검증하는 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL) - 위에서 언급한 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($PRIMUS_SERVICE_ACCOUNT)은 KMS 키를 사용하여 데이터를 복호화하고 (roles/cloudkms.cryptoKeyDecrypter역할 사용) 클라우드 스토리지 버킷에서 데이터를 읽고 (objectViewer역할 사용) 서비스 계정을 워크로드 아이덴티티 풀에 연결할 수 있습니다 (roles/iam.workloadIdentityUser사용).
./setup_primus_bank_resources.sh
Secundus Bank의 클라우드 리소스 설정
Secundus Bank에는 다음 클라우드 리소스가 필요합니다. 이 스크립트를 실행하여 Secundus Bank 리소스를 설정합니다. 이 단계에서는 아래에 언급된 리소스가 생성됩니다.
- Secundus Bank의 암호화된 고객 데이터 파일을 저장할 Cloud Storage 버킷 (
$SECUNDUS_INPUT_STORAGE_BUCKET) - Secundus Bank의 데이터 파일을 암호화하기 위한 KMS의 암호화 키 (
$SECUNDUS_ENC_KEY) 및 키링 ($SECUNDUS_ENC_KEYRING) - 공급업체에 구성된 속성 조건을 기반으로 클레임을 검증하는 워크로드 아이덴티티 풀 (
$SECUNDUS_WORKLOAD_IDENTITY_POOL) - 위에서 언급한 워크로드 아이덴티티 풀 (
$SECUNDUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($SECUNDUS_SERVICE_ACCOUNT)은 KMS 키를 사용하여 데이터를 복호화하고 (roles/cloudkms.cryptoKeyDecrypter역할 사용) 클라우드 스토리지 버킷에서 데이터를 읽고 (objectViewer역할 사용) 서비스 계정을 워크로드 아이덴티티 풀에 연결할 수 있습니다 (roles/iam.workloadIdentityUser역할 사용). - Secundus Bank의 워크로드 실행 결과를 저장하는 Cloud Storage 버킷 (
$SECUNDUS_RESULT_STORAGE_BUCKET)
./setup_secundus_bank_resources.sh
3. 워크로드 만들기
워크로드 서비스 계정 만들기
이제 아래에 언급된 필수 역할과 권한이 있는 워크로드의 서비스 계정을 만듭니다. 다음 스크립트를 실행하여 Secundus Bank 프로젝트에 워크로드 서비스 계정을 만듭니다. 워크로드를 실행하는 VM은 이 서비스 계정을 사용합니다.
이 워크로드 서비스 계정 ($WORKLOAD_SERVICE_ACCOUNT)에는 다음 역할이 있습니다.
- 워크로드 서비스 계정에
confidentialcomputing.workloadUser역할을 부여합니다 . 이렇게 하면 사용자 계정에서 증명 토큰을 생성할 수 있습니다. - 워크로드 서비스 계정 권한에
logging.logWriter역할을 부여합니다. 이렇게 하면 컨피덴셜 스페이스 환경에서 직렬 콘솔 외에도 Cloud Logging에 로그를 쓸 수 있으므로 VM이 종료된 후에도 로그를 사용할 수 있습니다. objectViewer를 사용하여$PRIMUS_INPUT_STORAGE_BUCKET클라우드 스토리지 버킷에서 데이터를 읽습니다.objectViewer를 사용하여$SECUNDUS_INPUT_STORAGE_BUCKET클라우드 스토리지 버킷에서 데이터를 읽습니다.objectAdmin를 사용하여 워크로드 결과를$SECUNDUS_RESULT_STORAGE_BUCKETCloud Storage 버킷에 씁니다.
./create_workload_service_account.sh
워크로드 만들기
이 단계에서는 이 Codelab에서 사용되는 워크로드의 Docker 이미지를 만듭니다. 워크로드는 다음을 실행하는 간단한 GoLang 애플리케이션입니다.
- 지정된 지리적 위치의 고객 수를 집계합니다.
- 각 클라우드 스토리지 버킷에 저장된 고객 목록에서 Primus Bank와 Secundus Bank의 공통 고객을 찾습니다.
다음 스크립트를 실행하여 다음 단계가 수행되는 워크로드를 만듭니다.
- 워크로드가 게시될 Primus Bank 소유의 Artifact Registry (
$PRIMUS_ARTIFACT_REPOSITORY)를 만듭니다. - 코드를 생성하고 필요한 리소스 이름으로 업데이트합니다. 이 Codelab에서 사용된 워크로드 코드는 여기에서 확인할 수 있습니다.
- 코드를 빌드하고 Docker 이미지로 패키징합니다. 해당 Dockerfile은 여기에서 확인할 수 있습니다.
- Primus Bank 소유의 Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY)에 Docker 이미지를 게시합니다. - 서비스 계정에 Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY)에 대한$WORKLOAD_SERVICE_ACCOUNT읽기 권한을 부여합니다.
./create_workload.sh
4. 워크로드 승인 및 실행
워크로드 승인
Primus Bank는 다음 리소스의 속성을 기반으로 워크로드가 고객 데이터에 액세스하도록 승인하려고 합니다.
- 내용: 인증된 코드
- 위치: 안전한 환경
- 누구: 신뢰할 수 있는 운영자
Primus는 워크로드 아이덴티티 제휴를 사용하여 이러한 요구사항에 기반한 액세스 정책을 적용합니다.
워크로드 아이덴티티 제휴를 사용하면 속성 조건을 지정할 수 있습니다. 이러한 조건은 워크로드 아이덴티티 풀 (WIP)로 인증할 수 있는 ID를 제한합니다. 증명 검증 도구 서비스를 WIP에 워크로드 아이덴티티 풀 공급업체로 추가하여 측정을 제공하고 정책을 적용할 수 있습니다.
워크로드 아이덴티티 풀은 클라우드 리소스 설정 단계의 일부로 이미 이전에 생성되었습니다. 이제 Primus Bank에서 새 OIDC 워크로드 아이덴티티 풀 공급업체를 만듭니다. 지정된 --attribute-condition는 워크로드 컨테이너에 대한 액세스를 승인합니다. 이를 위한 요구사항은 다음과 같습니다.
- 내용: 최신
$WORKLOAD_IMAGE_NAME이$PRIMUS_ARTIFACT_REPOSITORY저장소에 업로드되었습니다. - 위치: Confidential Space 신뢰할 수 있는 실행 환경이 완전히 지원되는 Confidential Space VM 이미지에서 실행됩니다.
- 대상: Secundus Bank
$WORKLOAD_SERVICE_ACCOUNT서비스 계정
gcloud config set project $PRIMUS_PROJECT_ID
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 &&
assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
Primus Bank를 위해 생성된 WIP와 마찬가지로 Secundus Bank는 다음을 기반으로 워크로드가 고객 데이터에 액세스하도록 승인하려고 합니다.
- 무엇: 워크로드입니다.
- 위치: Confidential Space 환경
- 누구: 워크로드를 실행하는 계정 (
$WORKLOAD_SERVICE_ACCOUNT)입니다.
Primus Bank는 이미지 태그가 포함된 image_reference 클레임을 사용하여 액세스를 승인해야 하는지 여부를 결정합니다. 원격 저장소를 제어하므로 데이터가 유출되지 않는 이미지만 태그할 수 있습니다.
반면 Secundus Bank는 이미지를 가져오는 저장소를 제어하지 않으므로 안전하게 가정할 수 없습니다. 대신 image_digest에 따라 워크로드에 대한 액세스를 승인합니다. Primus Bank가 다른 이미지를 가리키도록 변경할 수 있는 image_reference와 달리 Primus Bank는 Secundus Bank가 이전 단계에서 감사한 이미지 외의 이미지를 참조하도록 image_digest를 설정할 수 없습니다.
워크로드 아이덴티티 풀 제공업체를 만들기 전에 제공업체의 속성 조건에 사용될 워크로드 컨테이너 이미지의 image_digest를 수집합니다.
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
--location="global" \
--workload-identity-pool="$SECUNDUS_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 &&
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
워크로드 실행
이 단계에서 Secundus Bank는 컨피덴셜 스페이스에서 워크로드를 실행합니다. 이 워크로드는 Primus의 워크로드 아이덴티티 풀과 Secundus의 워크로드 아이덴티티 풀에서 액세스 토큰을 가져와 각각 Primus Bank와 Secundus Bank의 고객 데이터를 읽고 복호화합니다.
필수 TEE 인수는 메타데이터 플래그를 사용하여 전달됩니다. 워크로드 컨테이너의 인수는 플래그의 'tee-cmd' 부분을 사용하여 전달됩니다. 워크로드 실행 결과가 $SECUNDUS_RESULT_STORAGE_BUCKET에 게시됩니다.
첫 번째 워크로드 실행
첫 번째 워크로드 실행의 일부로 워크로드는 워크로드 컨테이너 인수에서 제공된 위치의 Primus Bank 고객을 집계합니다. 아래와 같이 첫 번째 워크로드는 'count-location' 명령어를 실행하고 결과는 $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result에 저장됩니다.
gcloud compute instances create ${WORKLOAD_VM1} \
--project=${SECUNDUS_PROJECT_ID} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""
결과 보기
Secundus 프로젝트에서 첫 번째 워크로드의 결과를 확인합니다. 워크로드가 실행을 완료하고 결과가 클라우드 스토리지 버킷에서 제공될 때까지 3~5분 정도 기다립니다.
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
결과는 3이어야 합니다. primus_customer_list.csv 파일에 나열된 시애틀 출신 사람의 수가 3이기 때문입니다.
두 번째 워크로드 실행
두 번째 워크로드 실행의 일환으로 Primus Bank와 Secundus Bank의 공통 고객을 찾습니다. 아래와 같이 두 번째 워크로드는 'list-common-customers' 명령어를 실행하고 결과는 $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count에 저장됩니다.
gcloud compute instances create ${WORKLOAD_VM2} \
--project=${SECUNDUS_PROJECT_ID} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
결과 보기
Secundus 프로젝트에서 두 번째 워크로드의 결과를 확인합니다. 워크로드가 실행을 완료하고 결과가 클라우드 스토리지 버킷에서 제공될 때까지 3~5분 정도 기다립니다.
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
Primus Bank와 Secundus Bank의 공통 고객이므로 결과는 다음 목록이어야 합니다.
출력:
Eric
Clinton
Ashley
Cooper
승인되지 않은 워크로드 실행
Secundus Bank가 데이터에 액세스할 수 있도록 허용하는 Primus Bank의 계약이 만료됩니다. 따라서 Primus Bank는 새 파트너인 Tertius Bank의 서비스 계정이 있는 VM을 허용하도록 속성 조건을 업데이트합니다.
Primus Bank에서 워크로드 아이덴티티 풀 제공업체를 수정합니다.
$PRIMUS_PROJECT_ID에서 증명 검증 도구 ID 공급업체의 속성 조건을 업데이트하여 새 위치에서 워크로드를 승인합니다.
- 프로젝트를 $PRIMUS_PROJECT_ID로 설정합니다.
gcloud config set project $PRIMUS_PROJECT_ID
- 아래 명령어를 사용하여 Tertius Bank의 GCP 프로젝트 ID를 내보냅니다. 나중에 Primus Bank는 이를 사용하여 워크로드 아이덴티티 풀 공급업체의 속성 조건을 업데이트합니다. Primus 은행은 Secundus 은행 워크로드 서비스 계정의 승인을 중지하지 않습니다. 이제 Tertius Bank 워크로드 서비스 계정이 허용됩니다.
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
- 워크로드 아이덴티티 풀에서 OIDC 공급업체를 업데이트합니다. 여기서
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts가'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.로 변경됩니다. 이제 Secundus Bank의 워크로드 서비스 계정을 승인하는 대신 Tertius Bank의 워크로드 서비스 계정이 승인됩니다.
gcloud iam workload-identity-pools providers update-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 &&
assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' &&
'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
워크로드 다시 실행
Secundus Bank가 원래 워크로드를 실행하려고 하면 실패합니다. 오류를 확인하려면 원래 결과 파일과 VM 인스턴스를 삭제한 후 워크로드를 다시 실행해 보세요.
기존 결과 파일 및 VM 인스턴스 삭제
- 프로젝트를
$SECUNDUS_PROJECT_ID프로젝트로 설정합니다.
gcloud config set project $SECUNDUS_PROJECT_ID
- 결과 파일을 삭제합니다.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
- 컨피덴셜 VM 인스턴스를 삭제합니다.
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}
승인되지 않은 워크로드를 실행합니다.
gcloud compute instances create ${WORKLOAD_VM2} \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform \
--zone=${SECUNDUS_PROJECT_ZONE}\
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
오류 보기
워크로드 결과 대신 오류 (The given credential is rejected by the attribute condition)가 표시됩니다.
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
이와 마찬가지로 Primus Bank가 Secundus Bank의 전체 고객 목록을 Primus Bank 소유 버킷으로 전송하도록 워크로드를 비밀리에 수정하면 악성 워크로드의 다이제스트가 Secundus Bank의 워크로드 아이덴티티 풀에서 승인된 이미지 다이제스트와 다르므로 시도가 실패합니다.
5. 삭제
여기에서 이 Codelab의 일부로 만든 리소스를 정리하는 데 사용할 수 있는 스크립트를 확인할 수 있습니다. 이 정리의 일환으로 다음 리소스가 삭제됩니다.
- Primus Bank의 입력 클라우드 스토리지 버킷 (
$PRIMUS_INPUT_STORAGE_BUCKET). - Primus Bank (
$PRIMUS_SERVICE_ACCOUNT)의 서비스 계정 - 이미지 서명 (
$PRIMUS_COSIGN_REPOSITORY)을 보유하는 Primus Bank의 아티팩트 레지스트리 - Primus Bank(
$PRIMUS_WORKLOAD_IDENTITY_POOL)의 워크로드 아이덴티티 풀 - Secundus Bank (
$WORKLOAD_SERVICE_ACCOUNT)의 워크로드 서비스 계정 - Secundus Bank의 입력 Cloud Storage 버킷 (
$SECUNDUS_INPUT_STORAGE_BUCKET). - Secundus Bank (
$SECUNDUS_SERVICE_ACCOUNT)의 서비스 계정 - 이미지 서명 (
$SECUNDUS_COSIGN_REPOSITORY)을 보유하는 Secundus Bank의 아티팩트 레지스트리 - Secundus Bank(
$SECUNDUS_WORKLOAD_IDENTITY_POOL)의 워크로드 아이덴티티 풀 - Secundus Bank (
$WORKLOAD_SERVICE_ACCOUNT)의 워크로드 서비스 계정 - 워크로드 컴퓨팅 인스턴스입니다.
- Secundus Bank의 결과 스토리지 버킷 (
$SECUNDUS_RESULT_STORAGE_BUCKET) - Primus Bank (
$PRIMUS_ARTIFACT_REPOSITORY)의 아티팩트 저장소
./cleanup.sh
탐색을 완료한 경우 프로젝트를 삭제하는 것이 좋습니다.
- Cloud Platform 콘솔로 이동합니다.
- 종료하려는 프로젝트를 선택한 다음 상단의 '삭제'를 클릭합니다. 그러면 프로젝트가 삭제 예약됩니다.
축하합니다
축하합니다. Codelab을 완료했습니다.
컨피덴셜 스페이스를 사용하여 기밀성을 유지하면서 공유 데이터를 안전하게 보호하는 방법을 배웠습니다.
다음 단계
다음과 유사한 Codelab을 확인해 보세요.