이 Codelab 정보
1. 개요
Confidential Space는 조직에서 데이터의 기밀성을 유지하면서 여러 당사자 간에 안전하게 데이터를 공유하고 공동작업할 수 있도록 지원합니다. 즉, 조직은 데이터를 계속 관리하고 무단 액세스로부터 보호하면서도 서로 협력할 수 있습니다.
Confidential Space를 사용하면 민감한 정보(종종 규제 대상)를 집계 및 분석하여 상호 가치를 얻는 동시에 데이터를 완전히 제어할 수 있는 시나리오를 실현할 수 있습니다. Confidential Space를 통해 조직은 개인 식별 정보 (PII), 보호 건강 정보 (PHI), 지적 재산, 암호화된 보안 비밀과 같은 민감한 정보를 집계 및 분석하여 상호 가치를 얻는 동시에 이를 완전히 제어할 수 있습니다.
필요한 항목
- Google Cloud Platform 프로젝트
- 브라우저(Chrome, Firefox 등)
- Google Compute Engine ( codelab), 컨피덴셜 VM, 컨테이너, 원격 저장소에 관한 기본 지식
- Cloud KMS에 관한 기본 지식 ( codelab)
- 서비스 계정, 워크로드 아이덴티티 제휴, 속성 조건에 관한 기본 지식
학습할 내용
- Confidential Space 실행에 필요한 Cloud 리소스를 구성하는 방법
- Confidential Space VM 이미지를 실행하는 컨피덴셜 VM에서 워크로드를 실행하는 방법
- 워크로드 코드 (what), Confidential Space 환경 (where), 워크로드를 실행하는 계정 (who)의 속성을 기반으로 보호된 리소스에 대한 액세스를 승인하는 방법
이 Codelab에서는 Primus 은행과 Secundus 은행 간에 Confidential Space를 설정하여 전체 계정 목록을 서로 공유하지 않고도 공통 고객을 파악하는 방법을 알아봅니다. 여기에는 다음 단계가 포함됩니다.
- 1단계: Primus 은행과 Secundus 은행에 필요한 클라우드 리소스를 설정합니다. 이러한 클라우드 리소스에는 Primus 은행과 Secundus 은행의 Cloud Storage 버킷, KMS 키, 워크로드 ID 풀, 서비스 계정이 포함됩니다. Primus Bank와 Secundus Bank는 고객 데이터를 Cloud Storage 버킷에 저장하고 Cloud Key Management Service 키를 사용하여 데이터를 암호화합니다.
- 2단계: 워크로드 VM에서 사용할 워크로드 서비스 계정을 만듭니다. 워크로드 운영자인 Secundus Bank에서 워크로드 VM을 실행합니다. Primus Bank에서 워크로드 코드를 작성합니다.
- 3단계: 제공된 위치에서 고객 수를 집계하는 CLI 명령어와 Primus 은행과 Secundus 은행의 공통 고객을 찾는 CLI 명령어를 포함하는 워크로드를 만듭니다. 워크로드는 Primus Bank에서 작성하며 Docker 이미지로 패키징됩니다. 이 Docker 이미지는 Artifact Registry에 게시됩니다.
- 4단계: 워크로드 승인 Primus Bank는 워크로드 ID 풀을 사용하여 워크로드를 실행하는 사용자, 워크로드의 작업 내용, 워크로드가 실행되는 위치의 속성을 기반으로 워크로드가 고객 데이터에 액세스하도록 승인합니다.
- 5단계: 워크로드가 실행되면 워크로드 및 환경 클레임이 포함된 증명 검사기 서비스 토큰을 제공하여 데이터 공동작업자 (Primus Bank 및 Secundus Bank)의 클라우드 리소스에 대한 액세스를 요청합니다. 토큰의 워크로드 측정 요청이 Primus 은행과 Secundus 은행의 워크로드 ID 풀의 속성 조건과 일치하면 각 클라우드 리소스에 액세스할 권한이 있는 서비스 계정 액세스 토큰이 반환됩니다. 클라우드 리소스는 Confidential Space 내에서 실행되는 워크로드에서만 액세스할 수 있습니다.
- 5단계(a): 특정 위치의 Primus Bank 고객 수를 집계하는 첫 번째 워크로드를 실행합니다. 이 워크로드의 경우 Primus Bank는 데이터 공동작업자이자 워크로드 작성자로서 Confidential Space에서 실행되는 워크로드에 암호화된 고객 목록을 제공합니다. Secundus Bank는 워크로드 운영자이며 Confidential Space에서 워크로드를 실행합니다.
- 5단계(b): Primus 은행과 Secundus 은행의 공통 고객을 찾는 두 번째 워크로드를 실행합니다. 이 워크로드의 경우 Primus Bank와 Secundus Bank가 모두 데이터 공동작업자입니다. 암호화된 고객 목록을 Confidential Space에서 실행되는 워크로드에 제공합니다. Secundus Bank는 다시 워크로드 운영자가 됩니다. 이 워크로드는 공통 고객을 찾기 위해 Secundus Bank의 암호화된 고객 목록에도 액세스해야 하므로 Secundus Bank에서도 승인해야 합니다. 이 경우 Primus Bank의 4단계에서 언급한 워크로드를 실행하는 사용자, 워크로드의 작업 내용, 워크로드가 실행되는 위치의 속성을 기반으로 워크로드가 고객 데이터에 액세스하도록 Secundus Bank에서 승인합니다.
2. Cloud 리소스 설정
시작하기 전에
- 아래 명령어를 사용하여 이 저장소를 클론하여 이 Codelab의 일부로 사용되는 필수 스크립트를 가져옵니다.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- 이 Codelab의 디렉터리를 변경합니다.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
- 아래와 같이 필요한 프로젝트 환경 변수를 설정했는지 확인합니다. GCP 프로젝트를 만드는 방법에 관한 자세한 내용은 이 Codelab을 참고하세요. 여기에서 프로젝트 ID를 검색하는 방법과 프로젝트 ID가 프로젝트 이름 및 프로젝트 번호와 다른 점 등에 대해 자세히 알아보세요.
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
- 프로젝트에 결제를 사용 설정합니다.
- 두 프로젝트 모두에 Confidential Computing 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 프로젝트의 해당하는 기존 클라우드 리소스가 사용됩니다. 변수를 설정하지 않으면 cloud resource name이 project-name에서 생성되고 다음의 일부로 새 cloud-resource가 생성됩니다.
| Primus Bank의 고객 데이터 파일을 저장하는 버킷입니다. |
| Primus Bank의 워크로드 아이덴티티 풀 (WIP)로, 사용자의 주장을 확인합니다. |
| Primus Bank의 워크로드 아이덴티티 풀 제공업체로, 증명 검증자 서비스에서 서명한 토큰에 사용할 승인 조건이 포함되어 있습니다. |
|
|
| Primus Bank의 |
| Primus Bank의 암호화 키 |
| 워크로드 Docker 이미지가 푸시될 아티팩트 저장소입니다. |
- Secundus 프로젝트에서 기존 클라우드 리소스 이름으로 다음 변수를 설정할 수 있습니다. 변수가 설정되면 Secundus 프로젝트의 해당하는 기존 클라우드 리소스가 사용됩니다. 변수가 설정되지 않으면 cloud resource name이 project-name에서 생성되고 새 cloud-resource가 다음의 일부로 생성됩니다.
| Secundus 은행의 고객 데이터 파일을 저장하는 버킷 |
| 소유권 주장을 확인하는 Secundus Bank의 워크로드 아이덴티티 풀 (WIP)입니다. |
| 증명 검사기 서비스에서 서명한 토큰에 사용할 승인 조건이 포함된 Secundus Bank의 워크로드 ID 풀 제공업체입니다. |
|
|
| Secundus Bank의 |
| Secundus Bank의 암호화 키 |
| 워크로드 결과를 저장하는 버킷입니다. |
| 워크로드 컨테이너 이미지 이름입니다. |
| 워크로드 컨테이너 이미지의 태그입니다. |
| 워크로드를 실행하는 Confidential VM에 액세스할 권한이 있는 서비스 계정입니다. |
- 아래에 언급된 대로 이 Codelab의 일부로 사용되는 아티팩트는 몇 가지 있습니다.
primus_customer_list.csv
: Primus Bank의 고객 데이터가 포함된 파일입니다. 다음은 이 Codelab에서 사용되는 샘플 파일입니다.secundus_customer_list.csv
: Secundus Bank의 고객 데이터가 포함된 파일입니다. 다음은 이 Codelab에서 사용되는 샘플 파일입니다.- 다음 두 프로젝트에 대한 특정 권한이 필요합니다.
$PRIMUS_PROJECT_ID
의 경우 Cloud KMS 관리자, 스토리지 관리자, 아티팩트 레지스트리 관리자, 서비스 계정 관리자, IAM 워크로드 ID 풀 관리자가 필요합니다.$SECUNDUS_PROJECT_ID
의 경우 Compute 관리자, 스토리지 관리자, 서비스 계정 관리자, Cloud KMS 관리자, IAM 워크로드 ID 풀 관리자, 보안 관리자 (선택사항)가 필요합니다.- 다음 스크립트를 실행하여 리소스 이름의 프로젝트 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
): 공급업체에 구성된 속성 조건에 따라 클레임을 확인합니다. - 위에 언급된 워크로드 ID 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL
)에 연결된 서비스 계정 ($PRIMUS_SERVICE_ACCOUNT
)은 KMS 키를 사용하여 데이터를 복호화 (roles/cloudkms.cryptoKeyDecrypter
역할 사용), 클라우드 스토리지 버킷에서 데이터를 읽기 (objectViewer
역할 사용), 서비스 계정을 워크로드 ID 풀에 연결 (roles/iam.workloadIdentityUser
사용)할 수 있는 액세스 권한이 있습니다.
./setup_primus_bank_resources.sh
Secundus Bank의 클라우드 리소스 설정
Secundus Bank의 경우 다음과 같은 클라우드 리소스가 필요합니다. 이 스크립트를 실행하여 Secundus Bank 리소스를 설정합니다. 이 단계의 일환으로 아래에 언급된 리소스가 생성됩니다.
- Secundus Bank의 암호화된 고객 데이터 파일을 저장할 Cloud Storage 버킷 (
$SECUNDUS_INPUT_STORAGE_BUCKET
) - KMS의 암호화 키 (
$SECUNDUS_ENC_KEY
) 및 키링 ($SECUNDUS_ENC_KEYRING
): Secundus Bank의 데이터 파일을 암호화합니다. - 워크로드 아이덴티티 풀 (
$SECUNDUS_WORKLOAD_IDENTITY_POOL
): 공급업체에 구성된 속성 조건에 따라 클레임을 확인합니다. - 위에 언급된 워크로드 ID 풀 (
$SECUNDUS_WORKLOAD_IDENTITY_POOL
)에 연결된 서비스 계정 ($SECUNDUS_SERVICE_ACCOUNT
)은 KMS 키를 사용하여 데이터를 복호화 (roles/cloudkms.cryptoKeyDecrypter
역할 사용), 클라우드 스토리지 버킷에서 데이터를 읽기 (objectViewer
역할 사용), 서비스 계정을 워크로드 ID 풀에 연결 (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
역할을 부여합니다. 이렇게 하면 Confidential Space 환경에서 직렬 콘솔 외에도 Cloud Logging에 로그를 쓸 수 있으므로 VM이 종료된 후에도 로그를 사용할 수 있습니다. objectViewer
:$PRIMUS_INPUT_STORAGE_BUCKET
Cloud Storage 버킷에서 데이터를 읽습니다.objectViewer
:$SECUNDUS_INPUT_STORAGE_BUCKET
Cloud Storage 버킷에서 데이터를 읽습니다.objectAdmin
를 사용하여 워크로드 결과를$SECUNDUS_RESULT_STORAGE_BUCKET
Cloud Storage 버킷에 씁니다.
./create_workload_service_account.sh
워크로드 만들기
이 단계에서는 이 Codelab에서 사용되는 워크로드의 Docker 이미지를 만듭니다. 워크로드는 다음을 실행하는 간단한 GoLang 애플리케이션입니다.
- 지정된 지리적 위치의 고객 수를 집계합니다.
- 각 Cloud Storage 버킷에 저장된 고객 목록에서 Primus 은행과 Secundus 은행의 공통 고객을 찾습니다.
다음 스크립트를 실행하여 다음 단계가 실행되는 워크로드를 만듭니다.
- 워크로드가 게시될 Primus Bank 소유의 Artifact Registry (
$PRIMUS_ARTIFACT_REPOSITORY
)를 만듭니다. - 코드를 생성하고 필요한 리소스 이름으로 업데이트합니다. 이 Codelab에 사용된 워크로드 코드는 여기에서 확인할 수 있습니다.
- 코드를 빌드하고 Docker 이미지에 패키징합니다. 해당 Dockerfile은 여기에서 확인할 수 있습니다.
- Primus Bank가 소유한 Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY
)에 Docker 이미지를 게시합니다. - 서비스 계정
$WORKLOAD_SERVICE_ACCOUNT
에 Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY
)에 대한 읽기 권한을 부여합니다.
./create_workload.sh
4. 워크로드 승인 및 실행
워크로드 승인
Primus Bank는 다음 리소스의 속성을 기반으로 워크로드가 고객 데이터에 액세스하도록 승인하려고 합니다.
- 내용: 확인된 코드
- 위치: 안전한 환경
- Who: 신뢰할 수 있는 운영자
Primus는 워크로드 아이덴티티 제휴를 사용하여 이러한 요구사항에 따라 액세스 정책을 시행합니다.
워크로드 ID 제휴를 사용하면 속성 조건을 지정할 수 있습니다. 이러한 조건은 워크로드 아이덴티티 풀 (WIP)로 인증할 수 있는 ID를 제한합니다. 증명 검사기 서비스를 워크로드 ID 풀 제공업체로 WIP에 추가하여 측정값을 표시하고 정책을 적용할 수 있습니다.
워크로드 아이덴티티 풀은 이전에 클라우드 리소스 설정 단계의 일부로 이미 생성되었습니다. 이제 Primus Bank에서 새 OIDC 워크로드 ID 풀 공급업체를 만듭니다. 지정된 --attribute-condition
는 워크로드 컨테이너에 대한 액세스를 승인합니다. 이를 위한 요구사항은 다음과 같습니다.
- 내용: 최신
$WORKLOAD_IMAGE_NAME
가$PRIMUS_ARTIFACT_REPOSITORY
저장소에 업로드되었습니다. - 위치: 완전히 지원되는 Confidential Space VM 이미지에서 Confidential Space 신뢰할 수 있는 실행 환경이 실행 중입니다.
- 담당자: 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 환경
- Who: 워크로드를 실행하는 계정 (
$WORKLOAD_SERVICE_ACCOUNT
)입니다.
Primus Bank는 이미지 태그가 포함된 image_reference
소유권 주장을 사용하여 액세스를 승인해야 하는지 결정합니다. 원격 저장소를 제어하므로 데이터가 유출되지 않는 이미지에만 태그를 지정할 수 있습니다.
반면 Secundus Bank는 이미지를 가져오는 저장소를 제어하지 않으므로 이러한 가정을 안전하게 할 수 없습니다. 대신 image_digest
를 기반으로 워크로드에 대한 액세스를 승인합니다. Primus Bank가 다른 이미지를 가리키도록 변경할 수 있는 image_reference
와 달리 Primus Bank는 image_digest
가 이전 단계에서 Secundus Bank가 감사한 이미지 이외의 이미지를 참조하도록 할 수 없습니다.
워크로드 아이덴티티 풀 제공업체를 만들기 전에 제공업체의 속성 조건에 사용될 워크로드 컨테이너 이미지의 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는 Confidential Space에서 워크로드를 실행합니다. 이 워크로드는 Primus의 워크로드 ID 풀과 Secundus의 워크로드 ID 풀에서 액세스 토큰을 가져와 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 프로젝트에서 첫 번째 워크로드의 결과를 확인합니다. 워크로드가 실행을 완료하고 결과를 Cloud Storage 버킷에서 사용할 수 있을 때까지 3~5분 정도 기다립니다.
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
결과는 3
여야 합니다. primus_customer_list.csv
파일에 등록된 시애틀 출신의 인원 수가 이 숫자이기 때문입니다.
두 번째 워크로드 실행
두 번째 워크로드 실행의 일환으로 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 프로젝트에서 두 번째 워크로드의 결과를 확인합니다. 워크로드가 실행을 완료하고 결과를 Cloud Storage 버킷에서 사용할 수 있을 때까지 3~5분 정도 기다립니다.
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
Primus 은행과 Secundus 은행의 공통 고객이므로 결과는 다음 목록이어야 합니다.
출력:
Eric
Clinton
Ashley
Cooper
승인되지 않은 워크로드 실행
Primus Bank의 데이터에 대한 Secundus 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 Project-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가 Primus Bank가 소유한 버킷으로 Secundus Bank의 전체 고객 목록을 전송하도록 워크로드를 몰래 수정하면 악의적인 워크로드의 다이제스트가 Secundus Bank의 워크로드 ID 풀에서 승인된 이미지 다이제스트와 다르므로 이러한 시도는 실패합니다.
5. 삭제
다음은 이 Codelab의 일부로 만든 리소스를 정리하는 데 사용할 수 있는 스크립트입니다. 이번 정리 작업의 일환으로 다음 리소스가 삭제됩니다.
- Primus Bank의 Cloud Storage 버킷 (
$PRIMUS_INPUT_STORAGE_BUCKET)
)을 입력합니다. - Primus Bank의 서비스 계정 (
$PRIMUS_SERVICE_ACCOUNT
) - 이미지 서명을 보유한 Primus Bank의 아티팩트 레지스트리 (
$PRIMUS_COSIGN_REPOSITORY
)입니다. - Primus Bank의 워크로드 ID 풀(
$PRIMUS_WORKLOAD_IDENTITY_POOL
) - Secundus Bank의 워크로드 서비스 계정 (
$WORKLOAD_SERVICE_ACCOUNT
) - Secundus Bank의 Cloud Storage 버킷을 입력합니다 (
$SECUNDUS_INPUT_STORAGE_BUCKET)
). - Secundus 은행의 서비스 계정 (
$SECUNDUS_SERVICE_ACCOUNT
) - 이미지 서명을 보유한 Secundus Bank의 아티팩트 레지스트리 (
$SECUNDUS_COSIGN_REPOSITORY
)입니다. - Secundus Bank(
$SECUNDUS_WORKLOAD_IDENTITY_POOL
)의 워크로드 ID 풀입니다. - Secundus Bank의 워크로드 서비스 계정 (
$WORKLOAD_SERVICE_ACCOUNT
) - 워크로드 컴퓨팅 인스턴스
- Secundus Bank의 결과 저장소 버킷 (
$SECUNDUS_RESULT_STORAGE_BUCKET
)입니다. - Primus Bank의 아티팩트 저장소 (
$PRIMUS_ARTIFACT_REPOSITORY
)
./cleanup.sh
탐색이 완료되면 프로젝트를 삭제하는 것이 좋습니다.
- Cloud Platform Console로 이동합니다.
- 종료하려는 프로젝트를 선택한 다음 상단에서 '삭제'를 클릭합니다. 그러면 프로젝트가 삭제되도록 예약됩니다.
축하합니다
축하합니다. Codelab을 완료했습니다.
Confidential Space를 사용하여 공유 데이터를 보호하면서 기밀을 유지하는 방법을 알아봤습니다.
다음 단계
다음과 같은 유사한 Codelab을 확인해 보세요.