1. 개요
이 Codelab은 Confidential Space Codelab을 기반으로 합니다. 워크로드 아이덴티티 풀 (WIP) 정책에서 이미지 다이제스트를 지정하는 대신 증명된 공개 키를 사용하여 컨테이너를 인증하는 옵션이 제공되는 서명된 컨테이너 이미지 지원
Confidential Space의 서명된 컨테이너 이미지 지원에서 변경된 사항:
사용성 개선: 서명된 컨테이너 이미지 기능이 도입됨에 따라 이제 워크로드 이미지 다이제스트 접근 방식에서 이미지를 승인하는 공동작업자/감사자를 위한 컨테이너 서명 접근 방식으로 전환할 수 있습니다.
- 이미지 다이제스트를 직접 사용하는 경우 리소스 소유자는 새 이미지를 승인할 때마다 이미지 다이제스트로 정책을 업데이트해야 합니다. 이미지 서명을 사용하면 정책에 공개 키 지문이 포함됩니다. 해당 비공개 키는 공동작업자/감사자가 소유하고 감사된 이미지에 서명하는 데 사용됩니다.
- 일부 보안 모델의 경우 신뢰할 수 있는 이미지 서명 키를 참조하는 것이 새 이미지 다이제스트 값 목록을 업데이트하는 것보다 더 편리합니다.
보안 회귀 없음: 이 컨테이너 서명 접근 방식은 신뢰 경계가 동일하게 유지되므로 이전 이미지 다이제스트 접근 방식에 비해 보안 회귀를 가져오지 않습니다. 컨테이너 서명 접근 방식에서 리소스 소유자는 WIP 정책에 신뢰할 수 있는 공개 키 지문을 지정하여 확인 키를 승인하고 승인 확인은 증명 확인자 서비스와 WIP에 의해 실행됩니다. 증명 확인자 서비스는 서명이 실행 중인 워크로드와 연결되어 있는지 확인하고 WIP 정책은 서비스에서 어설션한 공개 키가 정책에 의해 승인되었는지 확인합니다.
강력한 보안: 컨테이너 이미지 서명을 사용하면 이미지 서명자에게 어느 정도의 신뢰를 위임할 수 있습니다. 증명 정책에 신뢰할 수 있는 서명자의 공개 키 지문을 지정하면 리소스 소유자가 해당 서명자에게 정책을 충족하는 컨테이너 이미지에 대한 보증을 할 수 있는 권한을 부여합니다. 증명 확인자 서비스는 서명이 실행 중인 워크로드와 연결되어 있는지 확인하고 정책은 서명을 만든 공개 키가 정책에 의해 승인되었는지 확인합니다. 이를 통해 이미지 서명이 제공하는 간접 참조 계층이 추가되어 Confidential Space의 강력한 보안 보장이 유지됩니다.
이러한 접근 방식의 유일한 차이점은 후자의 접근 방식이 서명 키로 워크로드 이미지를 승인하는 간접 참조 계층을 추가로 사용한다는 것입니다. 신뢰 경계가 동일하게 유지되므로 새로운 보안 취약점이 도입되지 않습니다.
학습할 내용
이 Codelab에서는 컨테이너 이미지 서명을 활용하여 보호된 리소스에 대한 액세스 권한을 부여하는 방법을 알아봅니다.
cosign를 사용하여 감사된 컨테이너 이미지에 서명하는 방법- 서명 검색 및 저장을 위해 컨테이너 이미지 서명을 OCI 레지스트리에 업로드하는 방법
- 컨피덴셜 스페이스를 실행하는 데 필요한 클라우드 리소스를 구성하는 방법
- 서명된 컨테이너 이미지 지원을 사용하여 Confidential Space에서 워크로드를 실행하는 방법
이 Codelab에서는 Confidential Space를 사용하여 Google Compute Engine에서 실행되는 신뢰할 수 있는 키로 서명된 컨테이너 이미지를 원격 증명하는 방법을 보여줍니다.
필요한 항목
- Confidential Space Codelab 완료
- Google Cloud Platform 프로젝트
- 브라우저(Chrome, Firefox 등)
- Vim, Emacs, Nano 등의 표준 Linux 텍스트 편집기에 관한 기본 지식
- Sigstore cosign에 관한 기본 지식
- Google Compute Engine ( 코드랩), 컨피덴셜 VM, 컨테이너, 원격 저장소에 대한 기본 지식
- Cloud KMS에 대한 기본 지식 ( 코드랩)
- 서비스 계정, 워크로드 아이덴티티 제휴, 속성 조건에 관한 기본 지식
- Artifact Registry에 관한 기본 지식
- 디지털 서명에 관한 기본 지식
서명된 컨테이너 이미지가 있는 Confidential Space에 관련된 역할
이 Codelab에서 Primus Bank는 감사자이자 리소스 소유자로서 다음을 담당합니다.
- 샘플 데이터로 필수 리소스를 설정합니다.
- 워크로드 코드 감사
cosign를 사용하여 워크로드 이미지에 서명합니다.- 저장소에 서명을 업로드합니다.
- 고객 데이터를 보호하기 위해 WIP 정책을 구성합니다.
Secundus Bank는 워크로드 작성자이자 운영자이며 다음을 담당합니다.
- 결과를 저장하는 데 필요한 리소스를 설정합니다.
- 워크로드 코드 작성
- 워크로드 이미지 게시
- 서명된 컨테이너 이미지 지원으로 Confidential Space에서 워크로드 실행
Secundus Bank는 클라우드 스토리지 버킷에 저장되고 Primus Bank가 소유한 고객 데이터를 쿼리하는 워크로드를 개발하고 게시합니다. Primus Bank는 워크로드를 감사하고, 컨테이너 이미지에 서명하고, 승인된 워크로드가 데이터에 액세스할 수 있도록 WIP 정책을 구성합니다. 이 워크로드 실행의 결과는 Secundus 은행 소유의 클라우드 스토리지 버킷에 저장됩니다.
Confidential Space 설정과 관련된 리소스
이 Codelab에서는 GCP 프로젝트에 적합한 값으로 설정해야 하는 여러 변수를 참조합니다. 이 Codelab의 명령어는 이러한 변수가 설정되었다고 가정합니다. (예를 들어 export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'을 사용하여 Primus 은행의 입력 스토리지 버킷 이름을 설정할 수 있습니다.) 리소스 이름의 변수가 설정되지 않은 경우 GCP 프로젝트 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: 감사자/데이터 공동작업자 (이 경우 primus bank)가 워크로드 이미지에 서명하는 데 사용한 KMS 키입니다.
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에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 진행됩니다.
- 워크로드가 WIP에서
$PRIMUS_SERVICEACCOUNT의 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 검증 도구 서비스 토큰을 제공합니다. - 증명 검증 도구 서비스 토큰의 워크로드 측정 클레임이 WIP의 속성 조건과 일치하면
$PRIMUS_SERVICEACCOUNT.의 액세스 토큰을 반환합니다. - 워크로드는
$PRIMUS_SERVICEACCOUNT와 연결된 서비스 계정 액세스 토큰을 사용하여$PRIMUS_INPUT_STORAGE_BUCKET버킷의 고객 데이터에 액세스합니다. - 워크로드는 해당 데이터에 대한 작업을 실행합니다.
- 워크로드는
$WORKLOAD_SERVICEACCOUNT서비스 계정을 사용하여 해당 작업의 결과를$SECUNDUS_RESULT_STORAGE_BUCKET버킷에 씁니다.
서명된 컨테이너 지원이 포함된 새로운 워크플로
서명된 컨테이너 지원은 아래에 강조 표시된 대로 기존 워크플로에 통합됩니다. 서명된 컨테이너 이미지 지원을 사용하여 Confidential Space에서 워크로드를 실행하면 구성된 리소스를 사용하여 다음 프로세스가 진행됩니다.
- Confidential Space는 현재 실행 중인 워크로드 이미지와 관련된 컨테이너 서명을 검색하여 증명 검증 도구에 전송합니다. 증명 확인자는 서명을 확인하고 유효한 서명을 증명 클레임에 포함합니다.
- 워크로드가 WIP에서
$PRIMUS_SERVICEACCOUNT의 일반 Google 액세스 토큰을 요청합니다. 워크로드 및 환경 클레임이 포함된 증명 검증 도구 서비스 토큰을 제공합니다. - 증명 검증 도구 서비스 토큰의 컨테이너 서명 클레임이 WIP의 속성 조건과 일치하면
$PRIMUS_SERVICEACCOUNT의 액세스 토큰을 반환합니다. - 워크로드는
$PRIMUS_SERVICEACCOUNT와 연결된 서비스 계정 액세스 토큰을 사용하여$PRIMUS_INPUT_STORAGE_BUCKET버킷의 고객 데이터에 액세스합니다. - 워크로드는 해당 데이터에 대한 작업을 실행합니다.
- 워크로드는
$WORKLOAD_SERVICEACCOUNT를 사용하여 해당 작업의 결과를$SECUNDUS_RESULT_STORAGE_BUCKET버킷에 씁니다.
2. 클라우드 리소스 설정
컨피덴셜 스페이스 설정의 일환으로 먼저 Primus 은행과 Secundus 은행의 GCP 프로젝트에서 필요한 클라우드 리소스를 만듭니다. 이 Codelab에서 새로 사용되는 리소스는 다음과 같습니다.
Primus 프로젝트에서 다음을 실행합니다.
- 코드를 감사한 후 Secundus 워크로드에 서명하는 데 사용되는 KMS 서명 키입니다.
- Cosign 서명을 저장할 Artifact Registry 저장소
Secundus 프로젝트에는 새 리소스가 없습니다. 이러한 리소스가 설정되면 필요한 역할과 권한이 있는 워크로드의 서비스 계정을 만듭니다. 그런 다음 워크로드 이미지를 만들고 감사자인 Primus bank가 워크로드 이미지에 서명합니다. 그러면 데이터 공동작업자 (이 Codelab에서는 Primus Bank)가 워크로드를 승인하고 워크로드 운영자 (이 경우 Secundus Bank)가 워크로드를 실행합니다.
컨피덴셜 스페이스 설정의 일환으로 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) - 공급업체에 구성된 속성 조건을 기반으로 클레임을 검증하는 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL) - 다음 IAM 액세스 권한이 있는 위에서 언급한 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL)에 연결된 서비스 계정 ($PRIMUS_SERVICEACCOUNT) roles/cloudkms.cryptoKeyDecrypterKMS 키를 사용하여 데이터를 복호화합니다.objectViewer를 사용하여 클라우드 스토리지 버킷에서 데이터를 읽습니다.- 이 서비스 계정을 워크로드 아이덴티티 풀에 연결하는 데 사용되는
roles/iam.workloadIdentityUser.
./setup_primus_bank_resources.sh
Secundus 은행 리소스 설정
이 단계에서는 Secundus 은행에 필요한 클라우드 리소스를 설정합니다. 다음 스크립트를 실행하여 Secundus 은행의 리소스를 설정합니다. 이 단계에서는 아래에 언급된 리소스가 생성됩니다.
- Secundus 은행의 워크로드 실행 결과를 저장하는 클라우드 스토리지 버킷 (
$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클라우드 스토리지 버킷에서 데이터를 읽습니다.objectAdmin를 사용하여 워크로드 결과를$SECUNDUS_RESULT_STORAGE_BUCKETCloud 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 이미지를 빌드하고 게시합니다. $SECUNDUS_ARTIFACT_REGISTRY에 대한$WORKLOAD_SERVICEACCOUNT읽기 권한을 부여합니다. 이는 워크로드 컨테이너가 Artifact Registry에서 워크로드 Docker 이미지를 가져오는 데 필요합니다.
./create_workload.sh
워크로드 서명
워크로드 이미지에 서명하는 데 Cosign이 사용됩니다. Cosign은 기본적으로 서명하는 이미지와 동일한 저장소에 서명을 저장합니다. 서명에 다른 저장소를 지정하려면 COSIGN_REPOSITORY 환경 변수를 설정하면 됩니다.
여기에서는 Artifact Registry를 예로 사용합니다. Docker Hub, AWS CodeArtifact와 같은 다른 OCI 기반 레지스트리를 선택할 수도 있습니다.
- 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}
- 워크로드 이미지 서명을 위해 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}
- Artifact Registry의 경우
$LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME와 같은 전체 이미지 이름이 필요합니다. 서명 저장소에 컨테이너 이미지를 업로드할 수 있습니다.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
$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이 키 쌍으로 서명하기만 하면 됩니다. 이 서명된 컨테이너 이미지 기능에는 Cosign 키리스 서명이 지원되지 않습니다.
키 쌍으로 서명할 때는 다음 두 가지 옵션이 있습니다.
- Cosign에서 생성된 로컬 키 쌍으로 서명합니다.
- 다른 곳 (예: KMS)에 저장된 키 쌍으로 서명합니다.
- 키 쌍이 없는 경우 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의 키 경로를 참조합니다.
- 확인을 위해 공개 키를 가져옵니다.
// 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
- Cosign을 사용하여 워크로드에 서명합니다. 공개 키에 패딩이 없는 base64 인코딩 실행
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
- 내보낸 공개 키와 서명 알고리즘이 첨부된 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에서 생성된 키 쌍의 기본 서명 알고리즘이기도 합니다.
- Docker 저장소에 서명 업로드
Cosign 서명은 지정된 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 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 워크로드 아이덴티티 풀 (
$PRIMUS_WORKLOAD_IDENTITY_POOL) - Secundus Bank (
$WORKLOAD_SERVICEACCOUNT)의 워크로드 서비스 계정 - 워크로드 컴퓨팅 인스턴스
- Secundus Bank (
$SECUNDUS_RESULT_STORAGE_BUCKET)의 결과 스토리지 버킷 - Secundus Bank (
$SECUNDUS_ARTIFACT_REGISTRY)의 아티팩트 레지스트리 - Secundus Bank (
$WORKLOAD_VM)의 워크로드 VM
./cleanup.sh
탐색을 완료한 경우 프로젝트를 삭제하는 것이 좋습니다.
- Cloud Platform Console로 이동합니다.
- 종료할 프로젝트를 선택한 다음 상단의 '삭제'를 클릭합니다. 그러면 프로젝트가 삭제 예약됩니다.
축하합니다
축하합니다. Codelab을 완료했습니다.
서명된 컨테이너 이미지 기능을 활용하여 Confidential Space의 유용성을 개선하는 방법을 알아봤습니다.
다음 단계
다음과 유사한 Codelab을 확인해 보세요.
- Confidential Space를 사용하여 사용 중인 공유 데이터 보안
- 다자간 컴퓨팅 및 컨피덴셜 스페이스로 디지털 애셋을 거래하는 방법
- Confidential Space로 기밀 데이터 분석하기