Os colaboradores de dados precisam configurar os seguintes recursos para que os dados confidenciais sejam acessíveis a uma carga de trabalho:
Dados criptografados, armazenados em Google Cloud.
Um pool de Identidade da carga de trabalho (WIP, na sigla em inglês) para autorizar a carga de trabalho. Depois que uma carga de trabalho é autorizada por um WIP, ela pode acessar e operar os dados confidenciais dos colaboradores de dados.
Além disso, os colaboradores de dados precisam escolher onde os resultados da carga de trabalho do Confidential Space serão armazenados e se eles serão exclusivos para cada colaborador ou compartilhados. Por exemplo, é possível gerar o mesmo resultado em vários buckets do Cloud Storage pertencentes a cada colaborador de dados.
Armazenar seus dados criptografados
É possível usar qualquer serviço Google Cloud que armazene dados para hospedar seus dados confidenciais. Por exemplo, você pode usar um dos seguintes serviços:
Verifique se esses dados estão criptografados em repouso, usando recursos integrados ou algo como o Cloud Key Management Service (Cloud KMS).
Autorizar a carga de trabalho com um WIP
Um WIP é o mecanismo que o Confidential Space usa para permitir que uma carga de trabalho externa acesse e trabalhe com seus dados confidenciais como uma identidade federada. Uma identidade federada é uma entidade externa tratada como um principal no seu projeto. Isso permite conceder papéis do IAM a ela para dar acesso a recursos específicos ou personificar contas de serviço para fazer o mesmo.
Como colaborador de dados, você configura um provedor em um WIP que define as regras para entidades que se autenticam como uma identidade federada. Para o Confidential Space, você precisa definir o seguinte em um provedor:
Um serviço de atestado: esse serviço verifica se a carga de trabalho é uma instância de VM confidencial e, por fim, retorna um token de atestado do OpenID Connect (OIDC) ao provedor de WIP. O operador de carga de trabalho define o serviço de atestado usado, que precisa corresponder ao serviço de atestado adicionado ao provedor WIP para que o acesso seja concedido.
Mapeamentos de atributos: atributos nos tokens de acesso do Security Token Service que são mapeados para declarações feitas pela entidade de autenticação. Nesse caso, a instância de VM que está executando a carga de trabalho. As declarações são feitas pela própria instância de VM, pela imagem do Confidential Space e pelo contêiner de carga de trabalho, e são transmitidas ao provedor WIP pela carga de trabalho. Esses atributos são usados para coisas como trilhas de auditoria no Cloud Logging e para conceder papéis pelo IAM com base na autenticação de declarações de entidades, como resumos de contêineres de imagens de carga de trabalho. Leia mais sobre mapeamentos de atributos.
Uma política de comprovação: uma série de condições que as entidades de autenticação precisam atender para ter acesso, com base nas declarações feitas.
Quando uma carga de trabalho é iniciada, o inicializador do Confidential Space envia o relatório de atestado para um serviço de atestado definido pelo operador da carga de trabalho, que verifica a instância da VM confidencial e retorna um token de atestado OIDC. Esse token dura uma hora e é atualizado automaticamente.
Em seguida, o token de atestado é transmitido ao provedor de WIP pela carga de trabalho, e o provedor o usa para verificar se as declarações atendem à política de atestado definida no provedor. Se sim, a carga de trabalho terá acesso aos recursos confidenciais.
Acesso a cargas de trabalho externas
Antes de configurar um WIP e um provedor, escolha como a carga de trabalho vai acessar seus recursos: acesso direto a recursos ou representação de conta de serviço.
Acesso direto a recursos
Recomendamos o método de acesso direto a recursos para cargas de trabalho.
Esse método envolve a configuração de uma identidade federada em um provedor WIP vinculada às declarações de uma entidade autenticadora. Assim, uma carga de trabalho pode ser autorizada a acessar recursos diretamente por vinculações do IAM, com base em atributos como o resumo da imagem do contêiner da carga de trabalho.
O acesso direto a recursos tem as seguintes vantagens:
Configurar um ambiente do Confidential Space leva menos etapas, já que os colaboradores de dados não precisam configurar contas de serviço para uma conta de serviço de carga de trabalho personificar.
A carga de trabalho só pode acessar recursos específicos, conforme determinado pelo IAM. Isso é mais seguro do que o método de representação de conta de serviço, em que contas de serviço com permissões excessivas ou direitos de representação podem dar a um usuário mal-intencionado mais acesso do que o pretendido.
Cada acesso a recursos é registrado com a identidade federada de uma instância de VM de carga de trabalho, em vez da identidade de uma conta de serviço representada que pode ser compartilhada por várias cargas de trabalho. A identidade de uma instância de VM de carga de trabalho pode incluir detalhes como o resumo da imagem de um contêiner, o número do projeto em que a carga de trabalho está operando e o ID da instância de VM que executa a carga de trabalho, fornecendo uma trilha de auditoria mais detalhada.
Não é necessário mapear a propriedade da instância de VM
selfLink
para o atributogoogle.subject
em um provedor de WIP. ValoresselfLink
muito longos podem exceder o limite de 127 bytes desse atributo, causando falha na autenticação do provedor WIP.
Representação da conta de serviço:
O método de representação da conta de serviço envolve cada colaborador de dados configurando uma conta de serviço para descriptografar os dados particulares e anexando essa conta de serviço ao próprio WIP. Eles também especificam a conta de serviço da carga de trabalho no provedor WIP, o que permite que ela use uma identidade temporária das contas de serviço dos colaboradores de dados para recuperar e operar os dados confidenciais.
A representação de conta de serviço só deve ser usada nos seguintes cenários:
Quando você precisa usar assinaturas de imagem como uma credencial de autenticação, já que a sintaxe usada por assinaturas não funciona com mapeamentos de atributos.
Ao acessar APIs que não oferecem suporte a identidades federadas.
O método de personificação da conta de serviço pode não autenticar um provedor
WIP se uma instância de VM tiver uma propriedade
selfLink
muito longa. Isso acontece porque a declaração sub
no token de atestado, que
é definida como o valor selfLink
, é mapeada no provedor WIP para o
atributo google.subject
, que tem um limite de 127 bytes.
Para valores de selfLink
da instância de VM que excedam 127 bytes, renomeie as instâncias de VM para encurtar o selfLink
ou use o método de acesso direto a recursos.
Configurar um WIP e um provedor
As etapas para configurar um provedor variam dependendo se você usa acesso direto a recursos ou representação de conta de serviço.
Acesso direto a recursos
O método de acesso direto a recursos envolve a configuração de um WIP e um provedor e, em seguida, a configuração de papéis do IAM com base em um resumo específico da imagem do contêiner de carga de trabalho.
Configurar um WIP e um provedor
Para configurar um WIP e um provedor, siga estas instruções:
Crie o WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Crie um provedor OIDC no WIP:
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \ --issuer-uri="https://confidentialcomputing.googleapis.com/" \ --allowed-audiences="https://sts.googleapis.com" \ --attribute-mapping="google.subject=\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest" \ --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
Este exemplo usa os seguintes valores:
Um
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, o que significa que o atestado do Google Cloud é usado como o serviço de atestado.Um
allowed-audiences
dehttps://sts.googleapis.com
. Esse é o Security Token Service do Google, que troca credenciais por tokens de acesso.Um
attribute-mapping
degoogle.subject
, com o seguinte valor:\"gcpcs::\"+assertion.submods.container.image_digest+\"::\"+assertion.submods.gce.project_number+\"::\"+assertion.submods.gce.instance_id,attribute.image_digest=assertion.submods.container.image_digest
Esse valor é construído usando a Common Expression Language (CEL). Os valores a seguir são atribuídos ao atributo
gcpcs
e aparecem no Cloud Logging sempre que a carga de trabalho acessa recursos:assertion.submods.container.image_digest
: o resumo da imagem do contêiner da carga de trabalho.assertion.submods.gce.project_number
: o número do projeto da instância de VM.assertion.submods.gce.instance_id
: o ID da instância de VM.
Além disso,
attribute.image_digest
é definido comoassertion.submods.container.image_digest
, o resumo da imagem do contêiner da carga de trabalho. Esse atributo é mapeado para que você possa conceder papéis do IAM à identidade federada com base em um resumo de imagem específico.É possível mapear qualquer uma das asserções de carga de trabalho disponíveis, desde que o comprimento total do valor
google.subject
seja menor que 127 bytes.Os seguintes
attribute-conditions
, que formam uma política de atestado. Se essas condições corresponderem às declarações da carga de trabalho, ela poderá acessar os recursos confidenciais como uma identidade federada:assertion.swname == 'CONFIDENTIAL_SPACE'
: verifica se o Confidential Space é o software em execução na VM, com todas as garantias de segurança integradas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica se a imagem de produção do Confidential Space está sendo usada e tem o atributo de suporteSTABLE
.
Para mais condições de atributo que podem ser usadas, consulte Criar uma política de atestado.
Conceder papéis do IAM à identidade federada
Depois de criar um provedor de WIP, é possível conceder à identidade federada um papel do IAM com base em se o resumo do contêiner da imagem da carga de trabalho da identidade corresponde a um valor esperado.
O exemplo a seguir demonstra como conceder a uma identidade federada a capacidade de descriptografar uma chave específica do Cloud Key Management Service:
gcloud kms keys add-iam-policy-binding \
projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \
--member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/attribute.image_digest/WORKLOAD_CONTAINER_IMAGE_DIGEST" \
--role=roles/cloudkms.cryptoKeyDecrypter
Representação da conta de serviço:
O método de representação de conta de serviço envolve o seguinte:
Criar contas de serviço em cada um dos projetos de colaborador de dados e conceder permissão para descriptografar os dados confidenciais.
Criar WIPs em cada um dos projetos de colaborador de dados e anexar a conta de serviço de cada projeto que acabou de ser criada ao respectivo WIP.
Criar provedores de WIP em cada WIP, que especificam a conta de serviço da carga de trabalho como a conta que pode representar as contas de serviço do colaborador de dados.
Configurar contas de serviço para descriptografar dados confidenciais
Crie as contas de serviço nos projetos do colaborador de dados:
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
Conceda às contas de serviço as permissões necessárias para descriptografar os dados confidenciais. Por exemplo, é possível criptografar arquivos confidenciais no Cloud Storage com o Cloud KMS. Portanto, é necessário conceder à conta de serviço permissão para descriptografar esses dados:
gcloud kms keys add-iam-policy-binding \ projects/DATA_COLLABORATOR_PROJECT_ID/locations/global/keyRings/DATA_COLLABORATOR_KEYRING_NAME/cryptoKeys/DATA_COLLABORATOR_KEY_NAME \ --member=serviceAccount:DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudkms.cryptoKeyDecrypter
Configurar um WIP e um provedor
Para configurar um WIP e um provedor, siga estas instruções em cada projeto de colaborador de dados:
Crie o WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Anexe a conta de serviço que será representada ao WIP, com o papel
roles/iam.workloadIdentityUser
:gcloud iam service-accounts add-iam-policy-binding \ DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME@DATA_COLLABORATOR_PROJECT_ID.iam.gserviceaccount.com \ --member="principalSet://iam.googleapis.com/projects/DATA_COLLABORATOR_PROJECT_NUMBER/locations/global/workloadIdentityPools/DATA_COLLABORATOR_POOL_NAME/*" \ --role=roles/iam.workloadIdentityUser
Crie um provedor OIDC no WIP e defina a conta de serviço da carga de trabalho para que ela possa personificar a conta de serviço do colaborador de dados:
gcloud iam workload-identity-pools providers create-oidc attestation-verifier \ --location=global \ --workload-identity-pool=DATA_COLLABORATOR_POOL_NAME \ --issuer-uri="https://confidentialcomputing.googleapis.com/" \ --allowed-audiences="https://sts.googleapis.com" \ --attribute-mapping="google.subject=assertion.sub" \ --attribute-condition="assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST' \ && 'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_OPERATOR_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts \ && assertion.swname == 'CONFIDENTIAL_SPACE' \ && 'STABLE' in assertion.submods.confidential_space.support_attributes"
Este exemplo usa os seguintes valores:
Um
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, o que significa que o atestado do Google Cloud é usado como o serviço de atestado.Um
allowed-audiences
dehttps://sts.googleapis.com
. Esse é o Security Token Service do Google, que troca credenciais por tokens de acesso.Um
attribute-mapping
degoogle.subject
, com o valorassertion.sub
. Esse é oselfLink
da instância de VM, conforme definido na declaraçãosub
no token de comprovação.A instância de VM
selfLink
aparece no Cloud Logging sempre que a carga de trabalho acessa recursos.Os seguintes
attribute-conditions
, que formam uma política de atestado. Se essas condições corresponderem às declarações da carga de trabalho, ela poderá acessar recursos como uma identidade federada:assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST'
: verifica se o resumo da imagem do contêiner da carga de trabalho corresponde ao valor esperado.'WORKLOAD_SERVICE_ACCOUNT_NAME@WORKLOAD_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts
: verifica se a conta de serviço anexada à carga de trabalho corresponde à conta de serviço esperada e a usa para representar a conta de serviço do colaborador de dados.assertion.swname == 'CONFIDENTIAL_SPACE'
: verifica se o Confidential Space é o software em execução na VM, com todas as garantias de segurança integradas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica se a imagem de produção do Confidential Space está sendo usada e tem o atributo de suporteSTABLE
.
Para mais condições de atributo que podem ser usadas, consulte Criar uma política de atestado.
Criar uma política de atestado
Como parte da criação de um WIP, é necessário criar uma política de atestado. As declarações de uma entidade autenticadora precisam corresponder à sua política para acessar seus dados.
As políticas são escritas em
Common Expression Language
(CEL) e são compostas por uma série de instruções que podem ser encadeadas
com o operador &&
.
As instruções usam asserções da imagem do Confidential Space, da imagem do contêiner de carga de trabalho
ou da instância de VM como variáveis, e o valor especificado como a expressão.
Por exemplo, confira uma política que exige que a carga de trabalho use
o Confidential Space, uma
imagem do Confidential Space STABLE
e que a zona em que a instância de VM da carga de trabalho está sendo executada seja
us-central1-a
:
assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"
Consulte declarações de atestado para mais informações.
Declarações de atestado
As declarações disponíveis para criar uma política de atestado são detalhadas na tabela a seguir. As políticas podem validar declarações feitas pela imagem do Confidential Space, pelo contêiner de carga de trabalho e pela instância de VM.
Declarações de imagem
Declaração | Tipo | Descrição |
---|---|---|
Interage com:
|
String definida |
Verifica se a imagem do Confidential Space é a versão de depuração ou de produção. Os valores válidos são:
ExemplosO código a seguir verifica se a versão de depuração da imagem do Confidential Space está sendo usada:
O código a seguir verifica se a versão de produção da imagem do Confidential Space está sendo usada:
|
assertion.submods.confidential_space.support_attributes |
Matriz de strings |
Verifica se a versão de segurança do TEE é uma imagem de produção do Confidential Space. As imagens de depuração do Confidential Space não têm um atributo de suporte definido. Há três atributos de suporte:
ExemploO código a seguir verifica se uma versão estável da imagem do Confidential Space está sendo usada:
|
assertion.swname |
String definida |
Verifica o software em execução na entidade de atestado. O valor é sempre Exemplo
|
assertion.swversion |
Matriz de strings |
Verifica a versão do software da imagem do Confidential Space. Recomendamos usar
Exemplo
|
Declarações de contêiner
Declaração | Tipo | Descrição |
---|---|---|
Interage com:
|
Matriz de strings |
Verifica os comandos e parâmetros do CMD usados na imagem da carga de trabalho. ExemplosO código a seguir verifica se o CMD da imagem da carga de trabalho não foi substituído:
O código a seguir verifica se
|
Interage com:
|
objeto JSON |
Verifica se as variáveis de ambiente e os respectivos valores foram transmitidos explicitamente para o contêiner. ExemploO código a seguir verifica se a variável de ambiente
|
Interage com:
|
String |
Verifica se o operador de carga de trabalho substituiu as variáveis de ambiente no contêiner. ExemplosO código a seguir verifica se o operador de carga de trabalho não substituiu a variável de ambiente
O código a seguir verifica se o operador de carga de trabalho não substituiu nenhuma variável de ambiente:
|
assertion.submods.container.image_digest |
String |
Verifica o resumo da imagem do contêiner da carga de trabalho. Especificar essa condição permite que várias partes concordem com uma carga de trabalho autorizada que tenha permissão para acessar os dados delas. Exemplo
|
assertion.submods.container.image_id |
String |
Verifica o ID da imagem do contêiner da carga de trabalho. Exemplo
|
Interage com:
|
String |
Verifica o local do contêiner da carga de trabalho em execução sobre a imagem do Confidential Space. Exemplo
|
Interage com:
|
objeto JSON |
Verifica se a imagem tem uma determinada assinatura ou se foi assinada por uma chave pública e um algoritmo de assinatura. Especificar essa condição permite que várias partes concordem com uma carga de trabalho autorizada que tenha permissão para acessar os dados delas. A declaração pode incluir os seguintes elementos:
Exemplo
|
Interage com:
|
String definida |
Verifica a política de reinicialização do inicializador do contêiner quando a carga de trabalho é interrompida. Os valores válidos são:
Exemplo
|
Declarações de VM
Declaração | Tipo | Descrição |
---|---|---|
Interage com:
|
Matriz de strings |
Verifica se uma conta de serviço especificada está conectada à
VM que está executando a carga de trabalho ou se foi listada usando
Exemplo
|
assertion.hwmodel |
String |
Verifica a tecnologia de Computação confidencial subjacente. As plataformas compatíveis são as seguintes:
Exemplo
|
Interage com:
|
Booleano |
Verifica o estado de monitoramento na entidade de atestado. Exemplo
|
assertion.submods.gce.instance_id |
String |
Verifica o ID da instância de VM. Exemplo
|
assertion.submods.gce.instance_name |
String |
Verifica o nome da instância de VM. Exemplo
|
assertion.submods.gce.project_id |
String |
Verifica se a VM está executando um projeto Google Cloud com o ID do projeto especificado. Exemplo
|
assertion.submods.gce.project_number |
String |
Verifica se a VM está em execução em um projeto Google Cloud com o número de projeto especificado. Exemplo
|
Interage com:
|
String |
Verifica se a VM está em execução na zona especificada. Exemplo
|
Interage com:
|
String definida |
Verifica o status do driver de computação confidencial da NVIDIA. Os valores válidos são:
Exemplo
|