Os colaboradores de dados têm de configurar os seguintes recursos para que os respetivos dados confidenciais sejam acessíveis por uma carga de trabalho:
Dados encriptados, armazenados no Google Cloud.
Um Workload Identity Pool (WIP) para autorizar a carga de trabalho. Depois de uma carga de trabalho ser autorizada por um WIP, pode aceder aos dados confidenciais dos colaboradores de dados e operar sobre eles.
Além disso, os colaboradores de dados têm de escolher onde os resultados da carga de trabalho do espaço confidencial são armazenados e se esses resultados são exclusivos de cada colaborador ou partilhados. Por exemplo, pode optar por gerar o mesmo resultado em vários contentores do Cloud Storage pertencentes a cada colaborador de dados.
Armazene os seus dados encriptados
Pode usar qualquer Google Cloud serviço que armazene dados para alojar os seus dados confidenciais. Por exemplo, pode usar um dos seguintes serviços:
Deve certificar-se de que estes dados estão encriptados em repouso, quer use funcionalidades incorporadas ou algo como o Cloud Key Management Service (Cloud KMS).
Autorize a carga de trabalho com um WIP
Um WIP é o mecanismo que o espaço confidencial usa para permitir que uma carga de trabalho externa aceda e trabalhe com os seus dados confidenciais como uma identidade federada. Uma identidade federada é uma entidade externa tratada como se fosse um principal no seu próprio projeto, o que lhe permite conceder funções de IAM para dar acesso a recursos específicos ou roubar a identidade de contas de serviço para fazer o mesmo.
Como colaborador de dados, configura um fornecedor num WIP que define as regras para entidades que se autenticam como uma identidade federada. Para o Confidential Space, tem de definir o seguinte num fornecedor:
Um serviço de atestação: este serviço verifica se a carga de trabalho é uma instância de VM confidencial e, em última análise, devolve um token de atestação do OpenID Connect (OIDC) ao fornecedor do WIP. O operador da carga de trabalho define o serviço de atestação usado e tem de corresponder ao serviço de atestação adicionado ao fornecedor do WIP para que o acesso seja concedido.
Mapeamentos de atributos: atributos nos tokens de acesso do serviço de tokens de segurança que são mapeados para afirmações feitas pela entidade de autenticação, neste caso, a instância de VM que está a executar a carga de trabalho. As afirmações são feitas pela própria instância da VM, pela imagem do espaço confidencial e pelo contentor da carga de trabalho, e são transmitidas ao fornecedor da WIP pela carga de trabalho. Estes atributos são usados para itens como rastos de auditoria no Cloud Logging e para conceder funções através do IAM com base na autenticação de afirmações de entidades, como resumos de contentores de imagens de cargas de trabalho. Leia mais acerca dos mapeamentos de atributos.
Uma política de atestação: uma série de condições que as entidades de autenticação têm de cumprir para obter acesso, com base nas declarações que fazem.
Quando uma carga de trabalho é iniciada, o Confidential Space Launcher envia o respetivo relatório de atestação a um serviço de atestação definido pelo operador da carga de trabalho, que valida a instância de VM confidencial e, em seguida, devolve um token de atestação OIDC. Este token dura uma hora e é atualizado automaticamente.
Em seguida, o token de atestação é transmitido ao fornecedor da WIP pela carga de trabalho, e o fornecedor usa-o para verificar se as afirmações passam na política de atestação definida no fornecedor. Se o fizer, a carga de trabalho tem acesso aos recursos confidenciais.
Acesso a cargas de trabalho externas
Antes de configurar um WIP e um fornecedor, tem de escolher como a carga de trabalho vai aceder aos seus recursos: acesso direto aos recursos ou roubo de identidade da conta de serviço.
Acesso direto aos recursos
Recomendamos o método de acesso direto aos recursos para cargas de trabalho.
Este método envolve a configuração de uma identidade federada num fornecedor do WIP associado às afirmações de uma entidade de autenticação. Desta forma, uma carga de trabalho pode ser autorizada a aceder a recursos diretamente através de associações da IAM, com base em atributos como o resumo da imagem do contentor da carga de trabalho.
O acesso direto aos recursos tem as seguintes vantagens:
A configuração de um ambiente do espaço confidencial requer menos passos, uma vez que os colaboradores de dados não têm de configurar contas de serviço para uma conta de serviço de carga de trabalho se fazer passar por outra.
A carga de trabalho só tem permissão para aceder a recursos específicos, conforme determinado pela IAM. Isto é mais seguro do que o método de roubo de identidade da conta de serviço, em que as contas de serviço com autorizações excessivas ou os direitos de roubo de identidade podem dar a um agente malicioso mais acesso do que o pretendido.
Cada acesso a recursos é registado com a identidade federada de uma instância de VM de carga de trabalho, em vez da identidade de uma conta de serviço roubada que pode ser partilhada 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 contentor, o número do projeto a partir do qual a carga de trabalho está a operar e o ID da instância de VM que executa a carga de trabalho, o que fornece uma trilha de auditoria mais detalhada.
Não precisa de mapear a propriedade da instância de VM
selfLink
para o atributogoogle.subject
num fornecedor de WIP. Os valoresselfLink
muito longos podem exceder o limite de 127 bytes deste atributo, o que faz com que a autenticação do fornecedor do WIP falhe.
Simulação de identidade de conta de serviço
O método de roubo de identidade da conta de serviço envolve a configuração de uma conta de serviço por parte de cada colaborador de dados para desencriptar os respetivos dados privados e, em seguida, anexar essa conta de serviço ao respetivo WIP. Também especificam a conta de serviço da carga de trabalho no respetivo fornecedor do WIP, o que permite que a conta de serviço da carga de trabalho se faça passar pelas contas de serviço do colaborador de dados para poder obter e operar nos respetivos dados confidenciais.
A representação de contas de serviço só deve ser usada nos seguintes cenários:
Quando precisa de usar assinaturas de imagens como uma credencial de autenticação, uma vez que a sintaxe usada pelas assinaturas não funciona com mapeamentos de atributos.
Quando acede a APIs que não suportam identidades federadas.
O método de roubo de identidade da conta de serviço pode não conseguir autenticar-se num fornecedor de WIP se uma instância de VM tiver uma propriedade selfLink
muito longa. Isto deve-se ao facto de a reivindicação sub
no token de atestação, que
está definida para o valor selfLink
, ser mapeada no fornecedor de WIP para o
atributo google.subject
, que tem um limite de 127 bytes.
Para valores de selfLink
de instâncias de VM que excedam 127 bytes, tem de mudar o nome das instâncias de VM para encurtar o selfLink
ou usar o método de acesso direto aos recursos.
Configure um WIP e um fornecedor
Os passos para configurar um fornecedor variam consoante use o acesso direto aos recursos ou a representação da conta de serviço.
Acesso direto aos recursos
O método de acesso direto aos recursos envolve a configuração de um WIP e de um fornecedor e, em seguida, a configuração de funções da IAM com base num resumo da imagem do contentor de carga de trabalho específico.
Configure um WIP e um fornecedor
Para configurar um WIP e um fornecedor, siga estas instruções:
Crie o WIP:
gcloud iam workload-identity-pools create DATA_COLLABORATOR_POOL_NAME \ --location=global
Crie um fornecedor de 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:
Uma
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, o que significa que a Atestação do Google Cloud é usada como o serviço de atestação.Um
allowed-audiences
dehttps://sts.googleapis.com
. Este é o serviço de tokens de segurança da 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
Este valor é construído através do Idioma de expressão comum (IEC). Os seguintes valores são atribuídos ao atributo
gcpcs
e são apresentados no Cloud Logging sempre que a carga de trabalho acede a recursos:assertion.submods.container.image_digest
: o resumo da imagem do contentor 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
está definido comoassertion.submods.container.image_digest
, o resumo da imagem do contentor da carga de trabalho. Este atributo é mapeado para que possa conceder funções de IAM de identidade federada com base num resumo de imagem específico.Pode mapear qualquer uma das afirmações da carga de trabalho disponíveis, desde que o comprimento total do valor
google.subject
seja inferior a 127 bytes.O seguinte
attribute-conditions
, que forma uma política de atestação. Se estas condições corresponderem às afirmações da carga de trabalho, a carga de trabalho tem autorização para aceder aos 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 respetivas garantias de segurança incorporadas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica se a imagem do espaço confidencial de produção está a ser usada e tem oSTABLE
atributo support.
Para ver mais condições de atributos que pode usar, consulte o artigo Crie uma política de atestação.
Conceda as funções IAM de identidade federada
Depois de criar um fornecedor do WIP, pode conceder à identidade federada uma função do IAM com base no facto de o resumo do contentor da imagem da carga de trabalho da identidade corresponder ou não a um valor esperado.
O exemplo seguinte demonstra a concessão a uma identidade federada da capacidade de desencriptar 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
Simulação de identidade de conta de serviço
O método de simulaçã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-lhes autorização para desencriptar os dados confidenciais.
Criar WIPs em cada um dos projetos de colaborador de dados e, em seguida, anexar a conta de serviço de cada projeto que acabou de ser criada ao respetivo WIP.
Criar fornecedores de WIP em cada WIP que especifiquem a conta de serviço da carga de trabalho como a conta que pode roubar a identidade das contas de serviço de colaborador de dados.
Configure contas de serviço para desencriptar dados confidenciais
Crie as contas de serviço nos projetos de colaborador de dados:
gcloud iam service-accounts create DATA_COLLABORATOR_SERVICE_ACCOUNT_NAME
Conceda às contas de serviço as autorizações necessárias para desencriptar os dados confidenciais. Por exemplo, pode encriptar ficheiros confidenciais no Cloud Storage com o Cloud KMS, pelo que tem de conceder à conta de serviço autorização para desencriptar 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
Configure um WIP e um fornecedor
Para configurar um WIP e um fornecedor, siga as instruções abaixo 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 vai ser simulada ao WIP com a função
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 fornecedor OIDC no WIP e defina a conta de serviço da carga de trabalho no mesmo para que possa roubar a identidade da 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:
Uma
issuer-uri
dehttps://confidentialcomputing.googleapis.com/
, o que significa que a Atestação do Google Cloud é usada como o serviço de atestação.Um
allowed-audiences
dehttps://sts.googleapis.com
. Este é o serviço de tokens de segurança da Google, que troca credenciais por tokens de acesso.Um
attribute-mapping
degoogle.subject
, com o valorassertion.sub
. Este é oselfLink
da instância de VM, conforme definido na reivindicaçãosub
no token de atestação.A instância de VM
selfLink
é apresentada no Cloud Logging sempre que a carga de trabalho acede a recursos.O seguinte
attribute-conditions
, que forma uma política de atestação. Se estas condições corresponderem às afirmações da carga de trabalho, a carga de trabalho tem autorização para aceder aos recursos como uma identidade federada:assertion.submods.container.image_digest == 'WORKLOAD_CONTAINER_IMAGE_DIGEST'
: Verifica se o resumo da imagem do contentor 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, em seguida, usa-a para simular 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 respetivas garantias de segurança incorporadas.'STABLE' in assertion.submods.confidential_space.support_attributes
: Verifica se a imagem do espaço confidencial de produção está a ser usada e tem oSTABLE
atributo support.
Para ver mais condições de atributos que pode usar, consulte o artigo Crie uma política de atestação.
Crie uma política de atestação
Como parte da criação de um WIP, tem de criar uma política de atestação. As afirmações de uma entidade de autenticação têm de corresponder à sua política para poder aceder aos seus dados.
As políticas são escritas no
Idioma de expressão comum
(IEC) e são compostas por uma série de declarações que podem ser encadeadas
com o operador &&
.
As declarações usam afirmações da imagem do espaço confidencial, da imagem do contentor de carga de trabalho ou da instância de VM como variáveis e o valor especificado como a expressão.
Por exemplo, aqui está uma política que impõe que a carga de trabalho está a usar o espaço confidencial, tem de usar uma STABLE
imagem do espaço confidencial e que a zona em que a instância de VM da carga de trabalho está a ser executada tem de ser us-central1-a
:
assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes" \
&& assertion.submods.gce.zone == "us-central1-a"
Consulte as afirmações de atestação para mais informações.
Afirmações de atestação
As afirmações disponíveis para criar uma política de atestação estão detalhadas na tabela seguinte. As políticas podem validar as afirmações feitas pela imagem do espaço confidencial, pelo contentor de carga de trabalho e pela instância de VM.
Afirmações de imagens
Afirmação | Tipo | Descrição |
---|---|---|
Interage com:
|
String definida |
Verifica se a imagem do espaço confidencial é a versão de depuração ou de produção. Os valores válidos são:
ExemplosO código seguinte verifica se está a ser usada a versão de depuração da imagem do Confidential Space:
O código seguinte verifica se está a ser usada a versão de produção da imagem do Confidential Space:
|
assertion.submods.confidential_space.support_attributes |
Matriz de strings |
Verifica se a versão de segurança do AEF é uma imagem do Confidential Space de produção. As imagens do espaço confidencial de depuração não têm o atributo de suporte definido. Existem três atributos de apoio técnico:
ExemploO código seguinte verifica se está a ser usada uma versão estável da imagem do Confidential Space:
|
assertion.swname |
String definida |
Valida o software em execução na entidade de atestação. O valor é sempre Exemplo
|
assertion.swversion |
Matriz de strings |
Valida a versão do software da imagem do Confidential Space. Recomendamos que use
Exemplo
|
Afirmações do contentor
Afirmação | Tipo | Descrição |
---|---|---|
Interage com:
|
Matriz de strings |
Valida os comandos e os parâmetros CMD usados na imagem da carga de trabalho. ExemplosO código seguinte valida se o CMD da imagem da carga de trabalho não foi substituído:
O código seguinte verifica se
|
Interage com:
|
Objeto JSON |
Verifica se as variáveis de ambiente e os respetivos valores foram transmitidos explicitamente para o contentor. ExemploO código seguinte verifica se a variável de ambiente
|
Interage com:
|
String |
Verifica se o operador da carga de trabalho substituiu as variáveis de ambiente no contentor. ExemplosO código seguinte verifica se o operador da carga de trabalho não substituiu a variável de ambiente
O código seguinte verifica se o operador da carga de trabalho não substituiu nenhuma variável de ambiente:
|
assertion.submods.container.image_digest |
String |
Valida o resumo da imagem do contentor da carga de trabalho. A especificação desta condição permite que várias partes concordem numa carga de trabalho autorizada que tem permissão para aceder aos respetivos dados. Exemplo
|
assertion.submods.container.image_id |
String |
Valida o ID da imagem do contentor da carga de trabalho. Exemplo
|
Interage com:
|
String |
Valida a localização do contentor de carga de trabalho em execução na parte superior da imagem do espaço confidencial. Exemplo
|
Interage com:
|
Objeto JSON |
Valida se a imagem tem uma determinada assinatura ou se está assinada por uma chave pública e um algoritmo de assinatura. A especificação desta condição permite que várias partes concordem numa carga de trabalho autorizada que tem permissão para aceder aos respetivos dados. A declaração pode incluir os seguintes elementos:
Exemplo
|
Interage com:
|
String definida |
Verifica a política de reinício do iniciador de contentores para quando a carga de trabalho para. Os valores válidos são:
Exemplo
|
Afirmações de VMs
Afirmação | Tipo | Descrição |
---|---|---|
Interage com:
|
Matriz de strings |
Verifica se uma conta de serviço especificada está ligada à VM que executa a carga de trabalho ou se foi listada através de Exemplo
|
assertion.hwmodel |
String |
Valida a tecnologia de computação confidencial subjacente. As plataformas suportadas são as seguintes:
Exemplo
|
Interage com:
|
Booleano |
Valida o estado de monitorização na entidade de atestação. Exemplo
|
assertion.submods.gce.instance_id |
String |
Valida o ID da instância de VM. Exemplo
|
assertion.submods.gce.instance_name |
String |
Valida o nome da instância de VM. Exemplo
|
assertion.submods.gce.project_id |
String |
Verifica se a VM está a executar um Google Cloud projeto com o ID do projeto especificado. Exemplo
|
assertion.submods.gce.project_number |
String |
Verifica se a VM está a ser executada num Google Cloud projeto com o número do projeto especificado. Exemplo
|
Interage com:
|
String |
Verifica se a VM está a ser executada na zona especificada. Exemplo
|
Interage com:
|
String definida |
Valida o estado do controlador de computação confidencial da NVIDIA. Os valores válidos são:
Exemplo
|