Proteger dados compartilhados em uso com o Confidential Space

Proteger dados compartilhados em uso com o Confidential Space

Sobre este codelab

subjectÚltimo nov. 22, 2024 atualizado
account_circleEscrito por Priya Pandey, Jiankun Lu, Meetrajsinh Vala

1. Visão geral

O Confidential Space oferece compartilhamento e colaboração de dados seguros com várias partes, permitindo que as organizações preservem a confidencialidade dos dados. Isso significa que as organizações podem colaborar entre si, mantendo o controle dos dados e protegendo-os contra acesso não autorizado.

O Confidential Space permite que você agregue e analise dados sensíveis e regulamentados, mantendo o controle total sobre eles. Com o Confidential Space, as organizações ganham valor mútuo ao agregar e analisar dados sensíveis, como informações de identificação pessoal (PII), informações protegidas de saúde (PHI), propriedade intelectual e segredos criptográficos, mantendo o controle total sobre eles.

O que é necessário

O que você vai aprender

  • Como configurar os recursos do Cloud necessários para executar o Espaço confidencial
  • Como executar a carga de trabalho em uma VM confidencial que executa a imagem da VM do Confidential Space
  • Como autorizar o acesso a recursos protegidos com base nos atributos do código da carga de trabalho (o quê), no ambiente do Espaço confidencial (onde) e na conta que está executando a carga de trabalho (quem).

Neste codelab, você vai configurar um Espaço confidencial entre os bancos Primus e Secundus para determinar os clientes em comum sem compartilhar listas de contas completas entre si. Isso envolve as seguintes etapas:

  • Etapa 1: configure os recursos de nuvem necessários para os bancos Primus e Secundus. Esses recursos incluem buckets do Cloud Storage, chaves do KMS, pools de identidade da carga de trabalho e contas de serviço para os bancos Primus e Secundus. O Primus Bank e o Secundus Bank armazenam os dados dos clientes em buckets do Cloud Storage e criptografam os dados usando chaves do serviço de gerenciamento de chaves do Cloud.
  • Etapa 2: crie uma conta de serviço de carga de trabalho que será usada pela VM da carga de trabalho. O Secundus Bank, que será o operador da carga de trabalho, vai iniciar a VM da carga de trabalho. O Primus Bank criaria o código da carga de trabalho.
  • Etapa 3: crie uma carga de trabalho que inclua dois comandos da CLI, um para contar os clientes do local fornecido e outro para encontrar clientes comuns do Primus e do Secundus Bank. A carga de trabalho seria criada pelo Primus Bank e empacotada como uma imagem do Docker. Essa imagem do Docker será publicada no Artifact Registry.
  • Etapa 4: autorizar uma carga de trabalho. O Primus Bank usaria um pool de identidade da carga de trabalho para autorizar o acesso dos dados dos clientes com base nos atributos de quem está executando a carga de trabalho, o que ela faz e onde está sendo executada.
  • Etapa 5: quando a carga de trabalho fosse executada, ela solicitaria acesso aos recursos de nuvem dos colaboradores de dados (Primus Bank e Secundus Bank) oferecendo um token do serviço de verificação de atestado com declarações de carga de trabalho e ambiente. Se as reivindicações de medição de carga de trabalho no token corresponderem à condição de atributo nos pools de identidade de carga de trabalho dos bancos Primus e Secundus, ele vai retornar o token de acesso da conta de serviço que tem permissão para acessar os respectivos recursos de nuvem. Os recursos da nuvem só vão ser acessíveis à carga de trabalho executada no Confidential Space.
  • Etapa 5(a): execute a primeira carga de trabalho que conta os clientes do Primus Bank em locais específicos. Para essa carga de trabalho, o Primus Bank seria um colaborador de dados e autor da carga de trabalho, fornecendo a lista de clientes criptografada para a carga de trabalho em execução no Confidential Space. O Secundus Bank seria um operador de carga de trabalho e executaria a carga de trabalho em um Confidential Space.
  • Etapa 5(b): execute a segunda carga de trabalho, que encontra os clientes comuns dos bancos Primus e Secundus. Para essa carga de trabalho, Primus Bank e Secundus Bank seriam colaboradores de dados. Ele forneceria as listas de clientes criptografadas para a carga de trabalho em execução no Confidential Space. O Secundus Bank seria novamente um operador de carga de trabalho. Essa carga de trabalho também seria autorizada pelo Secundus Bank porque ela precisa acessar as listas de clientes criptografadas do banco para encontrar os clientes comuns. Nesse caso, o Secundus Bank autorizaria a carga de trabalho a acessar os dados do cliente com base nos atributos de quem está executando a carga de trabalho, o que ela faz e onde está sendo executada, conforme mencionado na etapa 4 do Primus Bank.

fdef93a6868a976.png

2. Configurar recursos do Cloud

Antes de começar

  • Clone este repositório usando o comando abaixo para receber os scripts necessários que são usados como parte deste codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Mude o diretório para este codelab.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • Verifique se você definiu as variáveis de ambiente do projeto necessárias, conforme mostrado abaixo. Para mais informações sobre como criar um projeto do GCP, consulte este codelab. Consulte este link para saber como recuperar o ID do projeto e como ele é diferente do nome e do número do projeto.
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
  • Ative o faturamento dos seus projetos.
  • Ative a API Confidential Computing e as APIs a seguir para ambos os projetos.
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
  • Defina as variáveis para os nomes dos recursos, conforme mencionado abaixo, usando este comando. É possível substituir os nomes de recursos usando estas variáveis (por exemplo, export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket')
  • É possível definir as variáveis a seguir com nomes de recursos do Cloud no projeto Primus. Se a variável for definida, o recurso de nuvem correspondente do projeto Primus será usado. Se a variável não for definida, o nome do recurso da nuvem será gerado a partir do nome do projeto, e um novo recurso da nuvem será criado como parte do seguinte:

$PRIMUS_INPUT_STORAGE_BUCKET

O bucket que armazena o arquivo de dados do cliente do Primus Bank.

$PRIMUS_WORKLOAD_IDENTITY_POOL

O pool de identidade da carga de trabalho (WIP, na sigla em inglês) do Primus Bank que valida as reivindicações.

$PRIMUS_WIP_PROVIDER

O provedor de pool de identidade da carga de trabalho do Primus Bank, que inclui a condição de autorização a ser usada para tokens assinados pelo serviço de verificação de atestados.

$PRIMUS_SERVICE_ACCOUNT

A conta de serviço do Primus Bank que $PRIMUS_WORKLOAD_IDENTITY_POOL usa para acessar os recursos protegidos. Nesta etapa, ele tem permissão para acessar os dados do cliente armazenados no bucket $PRIMUS_INPUT_STORAGE_BUCKET.

$PRIMUS_ENC_KEY

A chave do KMS usada para criptografar os dados armazenados em $PRIMUS_INPUT_STORAGE_BUCKET para o Primus Bank.

$PRIMUS_ENC_KEYRING

O keyring do KMS que será usado para criar a chave de criptografia $PRIMUS_ENC_KEY para o Primus Bank.

$PRIMUS_ARTIFACT_REPOSITORY

O repositório de artefatos para onde a imagem do Docker da carga de trabalho será enviada.

  • É possível definir as variáveis a seguir com nomes de recursos do Cloud atuais no projeto Secundus. Se a variável for definida, o recurso de nuvem correspondente do projeto Secundus será usado. Se a variável não estiver definida, o nome do recurso da nuvem será gerado a partir do nome do projeto, e um novo recurso da nuvem será criado como parte do seguinte:

$SECUNDUS_INPUT_STORAGE_BUCKET

O bucket que armazena o arquivo de dados do cliente do Secundus Bank

$SECUNDUS_WORKLOAD_IDENTITY_POOL

O pool de identidade da carga de trabalho (WIP, na sigla em inglês) do Secundus Bank que valida as declarações.

$SECUNDUS_WIP_PROVIDER

O provedor de pool de identidade da carga de trabalho do Secundus Bank, que inclui a condição de autorização a ser usada para tokens assinados pelo serviço de verificação de atestados.

$SECUNDUS_SERVICE_ACCOUNT

Conta de serviço do Secundus Bank que $SECUNDUS_WORKLOAD_IDENTITY_POOL usa para acessar os recursos protegidos. Nesta etapa, ele tem permissão para acessar os dados do cliente armazenados no bucket $SECUNDUS_INPUT_STORAGE_BUCKET.

$SECUNDUS_ENC_KEY

A chave do KMS usada para criptografar os dados armazenados em $SECUNDUS_INPUT_STORAGE_BUCKET para o Secundus Bank.

$SECUNDUS_ENC_KEYRING

O chaveiro do KMS usado para criar a chave de criptografia $SECUNDUS_ENV_KEY do Secundus Bank.

$SECUNDUS_RESULT_STORAGE_BUCKET

O bucket que armazena os resultados da carga de trabalho.

$WORKLOAD_IMAGE_NAME

O nome da imagem do contêiner da carga de trabalho.

$WORKLOAD_IMAGE_TAG

A tag da imagem do contêiner da carga de trabalho.

$WORKLOAD_SERVICE_ACCOUNT

A conta de serviço que tem permissão para acessar a VM confidencial que executa a carga de trabalho.

  • Há alguns artefatos usados como parte deste codelab, conforme mencionado abaixo:
  • primus_customer_list.csv: o arquivo que contém os dados do cliente do Primus Bank. Confira o arquivo de exemplo usado neste codelab.
  • secundus_customer_list.csv: o arquivo que contém os dados do cliente do Secundus Bank. Confira o arquivo de exemplo usado neste codelab.
  • Você vai precisar de algumas permissões para esses dois projetos:
  • Para o $PRIMUS_PROJECT_ID, você precisa de administrador do Cloud KMS, administrador do Storage, administrador do Registro de artefatos, administrador da conta de serviço e administrador do pool de Identidade da carga de trabalho do IAM.
  • Para o $SECUNDUS_PROJECT_ID, você precisa de administrador do Compute, administrador do Storage, administrador da conta de serviço, administrador do Cloud KMS, administrador do pool de identidade da carga de trabalho do IAM e administrador de segurança (opcional).
  • Execute o script abaixo para definir os nomes das variáveis restantes como valores com base no ID do projeto para nomes de recursos.
source config_env.sh

Configurar recursos de nuvem para o Primus Bank

Os seguintes recursos de nuvem são necessários para o Primus Bank. Execute este script para configurar os recursos do Primus Bank:

  • Bucket do Cloud Storage ($PRIMUS_INPUT_STORAGE_BUCKET) para armazenar o arquivo de dados do cliente criptografados do Primus Bank.
  • Chave de criptografia ($PRIMUS_ENC_KEY) e chaveiro ($PRIMUS_ENC_KEYRING) no KMS para criptografar o arquivo de dados do cliente do Primus Bank.
  • Pool de Identidade da carga de trabalho ($PRIMUS_WORKLOAD_IDENTITY_POOL) para validar declarações com base nas condições de atributos configuradas no provedor.
  • A conta de serviço ($PRIMUS_SERVICE_ACCOUNT) anexada ao pool de identidade da carga de trabalho ($PRIMUS_WORKLOAD_IDENTITY_POOL) mencionado acima tem acesso para descriptografar dados usando a chave KMS (usando o papel roles/cloudkms.cryptoKeyDecrypter), ler dados do bucket de armazenamento em nuvem (usando o papel objectViewer) e conectar a conta de serviço ao pool de identidade da carga de trabalho (usando roles/iam.workloadIdentityUser).
./setup_primus_bank_resources.sh

Configurar recursos de nuvem para o Secundus Bank

Para o Secundus Bank, os seguintes recursos de nuvem são necessários. Execute este script para configurar os recursos do Secundus Bank. Como parte destas etapas, os recursos abaixo serão criados:

  • Bucket do Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) para armazenar o arquivo de dados do cliente criptografados do Secundus Bank.
  • Chave de criptografia ($SECUNDUS_ENC_KEY) e chaveiro ($SECUNDUS_ENC_KEYRING) no KMS para criptografar o arquivo de dados do Secundus Bank.
  • Pool de Identidade da carga de trabalho ($SECUNDUS_WORKLOAD_IDENTITY_POOL) para validar declarações com base nas condições de atributos configuradas no provedor.
  • A conta de serviço ($SECUNDUS_SERVICE_ACCOUNT) anexada ao pool de identidade da carga de trabalho ($SECUNDUS_WORKLOAD_IDENTITY_POOL) mencionado acima tem acesso para descriptografar dados usando a chave do KMS (usando o papel roles/cloudkms.cryptoKeyDecrypter), ler dados do bucket de armazenamento em nuvem (usando o papel objectViewer) e conectar a conta de serviço ao pool de identidade da carga de trabalho (usando o papel roles/iam.workloadIdentityUser).
  • Bucket do Cloud Storage ($SECUNDUS_RESULT_STORAGE_BUCKET) para armazenar o resultado da execução da carga de trabalho pelo Secundus Bank.
./setup_secundus_bank_resources.sh

3. Criar carga de trabalho

Criar uma conta de serviço de carga de trabalho

Agora, você vai criar uma conta de serviço para a carga de trabalho com as funções e permissões necessárias, conforme mencionado abaixo. Execute o script abaixo para criar uma conta de serviço de carga de trabalho no projeto Secundus Bank. A VM que executa a carga de trabalho usaria essa conta de serviço.

Essa conta de serviço de carga de trabalho ($WORKLOAD_SERVICE_ACCOUNT) terá as seguintes funções:

  • Conceda o papel confidentialcomputing.workloadUser à conta de serviço da carga de trabalho . Isso permite que a conta do usuário gere um token de atestado.
  • Conceda o papel logging.logWriter à permissão da conta de serviço da carga de trabalho. Isso permite que o ambiente do Confidential Space grave registros no Cloud Logging, além do console serial, para que os registros fiquem disponíveis após a VM ser encerrada.
  • objectViewer para ler dados do bucket de armazenamento em nuvem $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectViewer para ler dados do bucket de armazenamento em nuvem $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectAdmin para gravar o resultado da carga de trabalho no bucket de armazenamento em nuvem $SECUNDUS_RESULT_STORAGE_BUCKET.
./create_workload_service_account.sh

Criar carga de trabalho

Nesta etapa, você vai criar uma imagem do Docker para a carga de trabalho usada neste codelab. A carga de trabalho é um aplicativo GoLang simples que:

  • Conta os clientes em um local geográfico especificado.
  • Encontra clientes comuns do Primus Bank e do Secundus Bank nas listas de clientes armazenadas nos respectivos buckets de armazenamento em nuvem.

Execute o script abaixo para criar uma carga de trabalho em que as etapas a seguir estão sendo realizadas:

  • Crie o Artifact Registry ($PRIMUS_ARTIFACT_REPOSITORY) de propriedade do Primus Bank, em que a carga de trabalho será publicada.
  • Gere o código e atualize-o com os nomes dos recursos necessários. O código de carga de trabalho usado neste codelab pode ser encontrado aqui.
  • Crie o código e empacote-o em uma imagem do Docker. O Dockerfile correspondente pode ser encontrado aqui.
  • Publicar a imagem do Docker no Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) do Primus Bank.
  • Conceda à conta de serviço a permissão de leitura $WORKLOAD_SERVICE_ACCOUNT para o Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY).
./create_workload.sh

4. Autorizar e executar cargas de trabalho

Autorizar a carga de trabalho

O Primus Bank quer autorizar cargas de trabalho a acessar os dados dos clientes com base nos atributos dos seguintes recursos:

  • O que é: código verificado
  • Onde: um ambiente seguro
  • Quem: um operador confiável

O Primus usa a Federação de identidade da carga de trabalho para aplicar uma política de acesso com base nesses requisitos.

A federação de identidade da carga de trabalho permite especificar condições de atributo. Essas condições restringem quais identidades podem ser autenticadas com o pool de identidade da carga de trabalho (WIP, na sigla em inglês). É possível adicionar o serviço de verificação de atestados ao WIP como um provedor de pool de identidade da carga de trabalho para apresentar medições e aplicar a política.

O pool de Identidade da carga de trabalho já foi criado anteriormente como parte da etapa de configuração dos recursos da nuvem. Agora, o Primus Bank vai criar um novo provedor de pool de identidade de carga de trabalho do OIDC. O --attribute-condition especificado autoriza o acesso ao contêiner de carga de trabalho. Ela requer:

  • O quê: o $WORKLOAD_IMAGE_NAME mais recente foi enviado por upload para o repositório $PRIMUS_ARTIFACT_REPOSITORY.
  • Onde: o ambiente de execução confiável do Confidential Space está sendo executado na imagem da VM do Confidential Space com suporte total.
  • Quem: conta de serviço $WORKLOAD_SERVICE_ACCOUNT do Secundus Bank.
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"

Assim como o WIP criado para o Primus Bank, o Secundus Bank quer autorizar as cargas de trabalho a acessar os dados dos clientes com base em:

  • O quê: a carga de trabalho.
  • Onde: o ambiente do Confidential Space.
  • Quem: a conta ($WORKLOAD_SERVICE_ACCOUNT) que está executando a carga de trabalho.

O Primus Bank usa a declaração image_reference, que inclui a tag de imagem, para determinar se o acesso deve ser autorizado. Eles controlam o repositório remoto, então podem ter certeza de que estão marcando apenas imagens que não vazam dados.

Em comparação, o Secundus Bank não controla o repositório em que a imagem está sendo extraída. Portanto, não é possível fazer essa suposição com segurança. Em vez disso, eles autorizam o acesso à carga de trabalho com base no image_digest dela. Ao contrário do image_reference, que o Primus Bank poderia mudar para apontar para uma imagem diferente, o Primus Bank não poderia ter o image_digest se referindo a uma imagem diferente daquela que o Secundus Bank auditou na etapa anterior.

Antes de criar provedores de pool de identidade da carga de trabalho, coletávamos o image_digest para a imagem do contêiner da carga de trabalho, que seria usado nas condições de atributo do provedor.

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"

Executar cargas de trabalho

Como parte desta etapa, o Secundus Bank vai executar a carga de trabalho no Confidential Space. Essa carga de trabalho vai receber os tokens de acesso do pool de identidade da carga de trabalho do Primus e do Secundus para ler e descriptografar os dados do cliente do Primus Bank e do Secundus Bank, respectivamente.

Os argumentos necessários do TEE são transmitidos usando a flag de metadados. Os argumentos para o contêiner de carga de trabalho são transmitidos usando a parte "tee-cmd" da flag. O resultado da execução da carga de trabalho será publicado em $SECUNDUS_RESULT_STORAGE_BUCKET.

Executar a primeira carga de trabalho

Como parte da primeira execução da carga de trabalho, ela vai contar os clientes do Primus Bank do local fornecido nos argumentos do contêiner da carga de trabalho. Como mostrado abaixo, a primeira carga de trabalho vai executar o comando "count-location", e o resultado será armazenado em $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\"]""

Ver resultados

No projeto Secundus, confira os resultados da primeira carga de trabalho. Aguarde de três a cinco minutos para que a carga de trabalho conclua a execução e o resultado fique disponível no bucket do Cloud Storage.

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

O resultado deve ser 3, porque esse é o número de pessoas de Seattle listadas no arquivo primus_customer_list.csv.

Executar a segunda carga de trabalho

Como parte da segunda execução de carga de trabalho, vamos encontrar os clientes comuns do Primus Bank e do Secundus Bank. Como mostrado abaixo, a segunda carga de trabalho vai executar o comando "list-common-customers", e o resultado será armazenado em $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\"]""

Ver resultados

No projeto Secundus, confira os resultados da segunda carga de trabalho. Aguarde de três a cinco minutos para que a carga de trabalho conclua a execução e o resultado fique disponível no bucket do Cloud Storage.

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

O resultado será a lista a seguir, porque esses são os clientes comuns entre o Primus Bank e o Secundus Bank.

Saída:

Eric
Clinton
Ashley
Cooper

Executar carga de trabalho não autorizada

O contrato do Primus Bank que permite o acesso do Secundus Bank aos dados dele expira. O Primus Bank atualiza a condição de atributo para permitir VMs com a conta de serviço do novo parceiro, o Tertius Bank.

O Primus Bank modifica o provedor do pool de Identidade da carga de trabalho

No $PRIMUS_PROJECT_ID, atualize a condição do atributo para o provedor de identidade do verificador de atestados para autorizar cargas de trabalho em um novo local.

  1. Defina o projeto como $PRIMUS_PROJECT_ID.
gcloud config set project $PRIMUS_PROJECT_ID
  1. Exporte o ID do projeto do GCP do Tertius Bank usando o comando abaixo. Depois, o Primus Bank vai usar isso para atualizar a condição de atributo do provedor de pool de identidade da carga de trabalho. O banco Primus não vai deixar de autorizar as contas de serviço de carga de trabalho do banco Secundus. Agora, ele vai permitir contas de serviço de carga de trabalho do Tertius Bank.
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
  1. Atualize o provedor OIDC no pool de identidade da carga de trabalho. Aqui, '$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts foi alterado para '$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.. Em vez de autorizar a conta de serviço de carga de trabalho do Secundus Bank, agora a conta de serviço de carga de trabalho do Tertius Bank será autorizada.
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"

Executar a carga de trabalho novamente

Quando o Secundus Bank tenta executar a carga de trabalho original, ocorre uma falha. Para conferir o erro, exclua o arquivo de resultados original e a instância da VM e tente executar a carga de trabalho novamente.

Excluir o arquivo de resultados e a instância de VM

  1. Defina o projeto como $SECUNDUS_PROJECT_ID.
gcloud config set project $SECUNDUS_PROJECT_ID
  1. Exclua o arquivo de resultados.
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
  1. Exclua a instância de VM confidencial.
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}

Execute a carga de trabalho não autorizada:

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\"]""

Ver erro

Em vez dos resultados da carga de trabalho, você vê um erro (The given credential is rejected by the attribute condition).

gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result

Da mesma forma, se o Primus Bank modificar secretamente a carga de trabalho para enviar a lista completa de clientes do Secundus Bank para um bucket que o Primus Bank possui, essa tentativa falhará, porque o resumo da carga de trabalho maliciosa será diferente do resumo da imagem autorizado no pool de identidade da carga de trabalho do Secundus Bank.

5. Limpeza

Este é o script que pode ser usado para limpar os recursos criados como parte deste codelab. Como parte dessa limpeza, os seguintes recursos serão excluídos:

  • Bucket de entrada do Cloud Storage do Primus Bank ($PRIMUS_INPUT_STORAGE_BUCKET).
  • Uma conta de serviço do Primus Bank ($PRIMUS_SERVICE_ACCOUNT).
  • Um registro de artefatos do Primus Bank que contém assinaturas de imagem ($PRIMUS_COSIGN_REPOSITORY).
  • Um pool de identidade da carga de trabalho do Primus Bank($PRIMUS_WORKLOAD_IDENTITY_POOL).
  • Uma conta de serviço de carga de trabalho do banco Secundus ($WORKLOAD_SERVICE_ACCOUNT).
  • Bucket de entrada do Cloud Storage do Secundus Bank ($SECUNDUS_INPUT_STORAGE_BUCKET).
  • Uma conta de serviço do Secundus Bank ($SECUNDUS_SERVICE_ACCOUNT).
  • Um registro de artefatos do Secundus Bank que contém assinaturas de imagem ($SECUNDUS_COSIGN_REPOSITORY).
  • Um pool de identidade da carga de trabalho do Secundus Bank($SECUNDUS_WORKLOAD_IDENTITY_POOL).
  • Uma conta de serviço de carga de trabalho do Secundus Bank ($WORKLOAD_SERVICE_ACCOUNT).
  • Instâncias de computação de carga de trabalho.
  • O bucket de armazenamento de resultados do Secundus Bank ($SECUNDUS_RESULT_STORAGE_BUCKET).
  • Um repositório de artefatos do Primus Bank ($PRIMUS_ARTIFACT_REPOSITORY).
./cleanup.sh

Se você já tiver terminado de explorar, considere excluir seu projeto.

  • Acesse o Console do Cloud Platform.
  • Selecione o projeto que você quer encerrar e clique em "Excluir" na parte de cima. Isso vai programar o projeto para exclusão.

Parabéns

Parabéns, você concluiu o codelab.

Você aprendeu a proteger dados compartilhados e manter a confidencialidade deles usando o Espaço confidencial.

Qual é a próxima etapa?

Confira alguns desses codelabs semelhantes:

Leia mais