Proteger dados compartilhados em uso com o Confidential Space

1. Visão geral

O Confidential Space oferece compartilhamento e colaboração de dados seguros entre 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 sobre os dados e protegendo-os contra acesso não autorizado.

O Confidential Space permite agregar e analisar dados sensíveis, muitas vezes regulamentados, para gerar valor mútuo, mantendo o controle total sobre eles. Com o Confidential Space, as organizações podem agregar e analisar dados sensíveis, como informações de identificação pessoal (PII), informações protegidas de saúde (PHI), propriedade intelectual e secrets 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 Confidential Space
  • Como executar a carga de trabalho em uma VM confidencial com 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 Confidential Space (onde) e na conta que está executando a carga de trabalho (quem).

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

  • Etapa 1: configurar 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 Cloud Key Management Service.
  • Etapa 2: crie uma conta de serviço de carga de trabalho que será usada pela VM de 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 estaria criando 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 identidades da carga de trabalho para autorizar cargas de trabalho a acessar os dados dos clientes com base em atributos de quem está executando a carga de trabalho, o que ela faz e onde ela está sendo executada.
  • Etapa 5: quando a carga de trabalho for executada, ela vai solicitar 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 declarações de medição da carga de trabalho no token corresponderem à condição de atributo nos pools de identidade da carga de trabalho dos bancos Primus e Secundus, ele vai retornar o token de acesso da conta de serviço com permissão para acessar os recursos de nuvem respectivos. Os recursos da nuvem só poderão ser acessados pela carga de trabalho em execução no Confidential Space.
  • Etapa 5a: execute a primeira carga de trabalho, que conta os clientes do Primus Bank de locais específicos. Para essa carga de trabalho, o Primus Bank seria um colaborador de dados e autor de 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, o Primus Bank e o Secundus Bank seriam colaboradores de dados. Eles fornecem 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 em comum. Nesse caso, o Secundus Bank autorizaria a carga de trabalho a acessar os dados dos clientes com base nos atributos de quem está executando a carga de trabalho, o que ela faz e onde ela está sendo executada, conforme mencionado na etapa 4 para o 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 usados como parte deste codelab.
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
  • Mude o diretório deste codelab.
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
  • Verifique se você definiu as variáveis de ambiente necessárias do projeto, 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 a diferença entre ele, o nome e o 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 projetos.
  • Ative a API Confidential Computing e as seguintes APIs nos dois 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 nomes de 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 seguintes variáveis com nomes de recursos de nuvem existentes no projeto do Primus. Se a variável estiver definida, o recurso de nuvem correspondente do projeto Primus será usado. Se a variável não estiver definida, o nome do recurso de nuvem será gerado com base em "project-name", e um novo recurso de nuvem será criado como parte do seguinte:

$PRIMUS_INPUT_STORAGE_BUCKET

O bucket que armazena o arquivo de dados de clientes 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 declarações.

$PRIMUS_WIP_PROVIDER

Provedor de pool de identidades da carga de trabalho do Primus Bank, que inclui a condição de autorização para usar tokens assinados pelo serviço de verificação de atestado.

$PRIMUS_SERVICE_ACCOUNT

A conta de serviço do Primus Bank que o $PRIMUS_WORKLOAD_IDENTITY_POOL usa para acessar os recursos protegidos. Nesta etapa, ele tem permissão para ver 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 em que a imagem Docker da carga de trabalho será enviada.

  • É possível definir as seguintes variáveis com nomes de recursos da nuvem no projeto Secundus. Se a variável estiver definida, o recurso de nuvem correspondente do projeto Secundus será usado. Se a variável não estiver definida, o nome do recurso de nuvem será gerado com base em "project-name", e um novo recurso de nuvem será criado como parte do seguinte:

$SECUNDUS_INPUT_STORAGE_BUCKET

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

$SECUNDUS_WORKLOAD_IDENTITY_POOL

O pool de Identidade da carga de trabalho (WIP) do Secundus Bank que valida declarações.

$SECUNDUS_WIP_PROVIDER

Provedor de pool de identidades da carga de trabalho do Secundus Bank, que inclui a condição de autorização para usar tokens assinados pelo serviço de verificação de atestado.

$SECUNDUS_SERVICE_ACCOUNT

Conta de serviço do Secundus Bank que o $SECUNDUS_WORKLOAD_IDENTITY_POOL usa para acessar os recursos protegidos. Nesta etapa, ele tem permissão para ver 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 keyring 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 com permissão para acessar a VM confidencial que executa a carga de trabalho.

  • Há poucos 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. Aqui está o arquivo de exemplo usado neste codelab.
  • secundus_customer_list.csv: o arquivo que contém os dados do cliente do Secundus Bank. Aqui está o arquivo de exemplo usado neste codelab.
  • Você vai precisar de determinadas permissões para esses dois projetos:
  • Para o $PRIMUS_PROJECT_ID, você vai precisar de Administrador do Cloud KMS, Administrador do Storage, Administrador do Artifact Registry, Administrador da conta de serviço e Administrador do pool de Identidade da carga de trabalho do IAM.
  • Para o $SECUNDUS_PROJECT_ID, você vai precisar de administrador do Compute, administrador do Storage, administrador da conta de serviço, administrador do Cloud KMS, administrador do pool de identidades da carga de trabalho do IAM e administrador de segurança (opcional).
  • Execute o script a seguir para definir os nomes de 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 criptografados de clientes do Primus Bank.
  • Chave de criptografia ($PRIMUS_ENC_KEY) e keyring ($PRIMUS_ENC_KEYRING) no KMS para criptografar o arquivo de dados do cliente do Primus Bank.
  • Pool de identidades 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 identidades da carga de trabalho ($PRIMUS_WORKLOAD_IDENTITY_POOL) mencionado acima tem acesso para descriptografar dados usando a chave do KMS (com o papel roles/cloudkms.cryptoKeyDecrypter), ler dados do bucket do Cloud Storage (com o papel objectViewer) e conectar a conta de serviço ao pool de identidades da carga de trabalho (com o papel 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 dessas etapas, os recursos mencionados abaixo serão criados:

  • Bucket do Cloud Storage ($SECUNDUS_INPUT_STORAGE_BUCKET) para armazenar o arquivo de dados criptografados de clientes do Secundus Bank.
  • Chave de criptografia ($SECUNDUS_ENC_KEY) e keyring ($SECUNDUS_ENC_KEYRING) no KMS para criptografar o arquivo de dados do Secundus Bank.
  • Pool de identidades 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 identidades da carga de trabalho ($SECUNDUS_WORKLOAD_IDENTITY_POOL) mencionado acima tem acesso para descriptografar dados usando a chave do KMS (com o papel roles/cloudkms.cryptoKeyDecrypter), ler dados do bucket do Cloud Storage (com o papel objectViewer) e conectar a conta de serviço ao pool de identidades da carga de trabalho (com 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 conta de serviço da carga de trabalho

Agora, crie uma conta de serviço para a carga de trabalho com os papéis e as permissões necessários, conforme mencionado abaixo. Execute o seguinte script para criar uma conta de serviço de carga de trabalho no projeto do Secundus Bank. A VM que executa a carga de trabalho usaria essa conta de serviço.

Essa conta de serviço da carga de trabalho ($WORKLOAD_SERVICE_ACCOUNT) terá os seguintes papéis:

  • Conceda o papel confidentialcomputing.workloadUser à conta de serviço da carga de trabalho . Isso permite que a conta de usuário gere um token de comprovação.
  • 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 o encerramento da VM.
  • objectViewer para ler dados do bucket do Cloud Storage $PRIMUS_INPUT_STORAGE_BUCKET.
  • objectViewer para ler dados do bucket do Cloud Storage $SECUNDUS_INPUT_STORAGE_BUCKET.
  • objectAdmin para gravar o resultado da carga de trabalho no bucket $SECUNDUS_RESULT_STORAGE_BUCKET do Cloud Storage.
./create_workload_service_account.sh

Criar carga de trabalho

Como parte desta 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 clientes em um local geográfico especificado.
  • Encontra clientes em comum do Primus e do Secundus Bank nas listas de clientes armazenadas nos respectivos buckets do Cloud Storage.

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

  • Crie um 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 de recursos necessários. O código da 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.
  • Publique a imagem do Docker no Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) de propriedade do Primus Bank.
  • Conceda à conta de serviço $WORKLOAD_SERVICE_ACCOUNT permissão de leitura para o Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY).
./create_workload.sh

4. Autorizar e executar cargas de trabalho

Autorizar 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 quê: 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.

Com a federação de identidade da carga de trabalho, é possível especificar condições de atributo. Essas condições restringem quais identidades podem ser autenticadas com o pool de identidades da carga de trabalho (WIP). É possível adicionar o serviço de verificação de atestado 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 identidades de carga de trabalho já foi criado como parte da etapa de configuração dos recursos da nuvem. Agora, o Primus Bank vai criar um novo provedor de pool de identidades de carga de trabalho do OIDC. O --attribute-condition especificado autoriza o acesso ao contêiner da 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 de VM do Confidential Space totalmente compatível.
  • Quem: conta de serviço do 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"

Assim como o WIP criado para o Primus Bank, o Secundus Bank quer autorizar 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 deve autorizar o acesso. Eles controlam o repositório remoto e, portanto, podem garantir que apenas imagens que não vazam dados sejam marcadas.

Em comparação, o Secundus Bank não controla o repositório de onde 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 image_digest não poderia se referir a uma imagem diferente daquela que o Secundus Bank auditou na etapa anterior.

Antes de criar provedores de pool de identidades de carga de trabalho, coletamos o image_digest da imagem do contêiner de 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 dessa etapa, o Secundus Bank vai executar a carga de trabalho no Confidential Space. Essa carga de trabalho vai receber os tokens de acesso dos pools de identidades de carga de trabalho do Primus e do Secundus para ler e descriptografar os dados dos clientes do Primus Bank e do Secundus Bank, respectivamente.

Os argumentos obrigatórios do TEE são transmitidos usando a flag de metadados. Os argumentos do 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 de 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 3 a 5 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, já que 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 da 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 3 a 5 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 precisa ser a lista a seguir, já que esses são os clientes em comum entre o Primus 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 expira. Assim, 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 atestado e autorize 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. Mais tarde, o Primus Bank usaria isso para atualizar a condição de atributo do provedor de pool de identidades da carga de trabalho. O banco Primus não vai parar de autorizar as contas de serviço da 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 é 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 da carga de trabalho do Secundus Bank, agora a conta de serviço da 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 ver o erro, exclua o arquivo de resultados original e a instância de 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 toda a lista de clientes do Secundus Bank para um bucket de propriedade do Primus Bank, essa tentativa vai falhar, já que 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

Aqui está 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 imagens ($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 Secundus Bank ($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 imagens ($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á terminou de explorar, considere excluir o projeto.

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

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 codelabs semelhantes:

Leia mais