Criar e conceder acesso a recursos confidenciais


Os colaboradores de dados precisam configurar os seguintes recursos para que uma carga de trabalho possa acessar os dados confidenciais:

Além disso, os colaboradores de dados precisam escolher onde os resultados da carga de trabalho do Confidential Space serão armazenados e se os dados apresentados são exclusivos ou compartilhados. Por exemplo, é possível gerar o mesmo resultado para vários buckets do Cloud Storage pertencentes a cada colaborador de dados.

Armazenar seus dados

É 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).

Criar uma conta de serviço para descriptografar dados confidenciais

Você disponibiliza seus dados confidenciais para as cargas de trabalho do Confidential Space e reduz a exposição humana a eles usando contas de serviço.

Por exemplo, é possível criptografar arquivos confidenciais no Cloud Storage com o Cloud KMS e criar uma conta de serviço com permissão para acessar esses dados e a chave para descriptografá-los.

Em seguida, conecte essa conta de serviço a um WIP. Uma carga de trabalho autorizada do Confidential Space em outro projeto pode usar esse WIP para representar a conta de serviço que descriptografa os dados, recuperar os dados descriptografados e processá-los.

Como as contas de serviço são usadas para descriptografar e processar os dados confidenciais, a visibilidade deles é restrita aos proprietários. Como a carga de trabalho opera em uma VM confidencial, a criptografia de memória baseada em hardware garante que seus dados permaneçam particulares durante o uso. O SSH também é desativado em VMs de carga de trabalho usando a imagem do Confidential Space de produção, o que significa que ninguém pode acessar a VM enquanto ela está em execução.

Consulte Criar seu primeiro ambiente do Confidential Space para conferir um exemplo.

Criar um WIP e um provedor para validação de atestado

Para ajudar a proteger os dados contra operadores de carga de trabalho não confiáveis, o Confidential Space implementa um processo de atestado que detecta modificações em uma imagem de carga de trabalho ou no TEE. O processo é baseado em medições da VM protegida de inicialização e do ambiente de execução estendido e captura as medições da sequência de inicialização em um registro protegido somente para extensão no dispositivo de Módulo de plataforma confiável virtual (vTPM, na sigla em inglês).

O serviço de atestado do Confidential Space gera tokens do OpenID Connect (OIDC) que incluem esses atestados de vTPM em um formato que pode ser validado por um WIP, que os verifica em relação às políticas adicionadas como condições de atributo a um provedor. Esses tokens são assinados pelo Google, duram uma hora e são atualizados automaticamente.

Se a WIP autorizar a carga de trabalho, ela poderá representar contas de serviço no projeto para descriptografar e recuperar dados confidenciais.

Para configurar um WIP e um provedor, siga estas instruções:

  1. Crie o WIP.

  2. Conecte sua conta de serviço de descriptografia ao WIP com a função iam.workloadIdentityUser.

  3. Crie um provedor OIDC com os seguintes detalhes:

    • Um URI de emissor de https://confidentialcomputing.googleapis.com/.

    • Um público-alvo permitido de https://sts.googleapis.com.

    • Um mapeamento de atributo do provedor de google.subject, com um valor de assertion.sub.

    • Condições de atributo usadas para validar os atestados da carga de trabalho. Consulte Criar uma política de comprovação para conferir as opções disponíveis.

Criar uma política de atestado

Ao criar uma WIP, você adiciona condições de atributo, que são condições que uma carga de trabalho precisa atender para acessar seus dados. No Confidential Space, essas condições de atributo formam sua política de atestado.

As políticas são escritas em Common Expression Language (CEL) e são compostas por uma série de declarações que podem ser encadeadas com o operador &&.

Confira um exemplo de como adicionar um provedor a um pool de identidade de carga de trabalho usando a CLI gcloud, além da opção attribute-condition que define as políticas:

gcloud iam workload-identity-pools providers create-oidc attestation-verifier \
    --location=global \
    --workload-identity-pool=user-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 =='sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b' \
&& 'service-account@my-project.iam.gserviceaccount.com' in assertion.google_service_accounts \
&& assertion.swname == 'CONFIDENTIAL_SPACE' \
&& 'STABLE' in assertion.submods.confidential_space.support_attributes"

Neste exemplo, uma identidade externa que tenta representar uma conta de serviço conectada ao pool de identidades de carga de trabalho precisa atestar e corresponder aos seguintes detalhes:

  • O resumo da imagem do contêiner da carga de trabalho

  • O endereço da conta de serviço conectada à VM da carga de trabalho

  • Esse CONFIDENTIAL_SPACE é o software em execução na VM, com todas as garantias de segurança integradas.

  • O atributo de suporte à imagem de produção do Confidential Space

Declarações de atestado

As declarações disponíveis para criar uma política de atestado são detalhadas na tabela a seguir. Eles podem validar declarações feitas pela imagem do Confidential Space, pelo contêiner de carga de trabalho e pela VM.

Declarações de imagem

Declaração Tipo Descrição

assertion.dbgstat

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:

  • enable: verifique se a imagem de depuração está sendo usada.
  • disabled-since-boot: verifique se a imagem de produção está sendo usada.
Exemplos

O código a seguir verifica se a versão de depuração da imagem do Confidential Space está sendo usada:

assertion.dbgstat == "enable"

O código a seguir verifica se a versão de produção da imagem do Confidential Space está sendo usada:

assertion.dbgstat == "disabled-since-boot"
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:

  • LATEST: essa é a versão mais recente da imagem e é compatível. A imagem LATEST também é STABLE e USABLE.
  • STABLE: esta versão da imagem é compatível e monitorada em busca de vulnerabilidades. Uma imagem STABLE também é USABLE.
  • USABLE: uma imagem com apenas esse atributo não tem suporte e não é mais monitorada em busca de vulnerabilidades. Use por sua conta e risco.
Exemplo

O código a seguir verifica se uma versão estável da imagem do Confidential Space está sendo usada:

"STABLE" in assertion.submods.confidential_space.support_attributes
assertion.swname String definida

Verifica o software em execução na entidade de atestado. O valor é sempre CONFIDENTIAL_SPACE.

Exemplo
assertion.swname == "CONFIDENTIAL_SPACE"
assertion.swversion Matriz de strings

Verifica a versão do software da imagem do Confidential Space. Recomendamos usar assertion.submods.confidential_space.support_attributes para acessar a versão mais recente de uma imagem.

Exemplo
int(assertion.swversion[0]) == 230103

Declarações de contêiner

Declaração Tipo Descrição

assertion.submods.container.cmd_override

Interage com:

Matriz de strings

Verifica os comandos e parâmetros do CMD usados na imagem da carga de trabalho.

Exemplos

O código a seguir verifica se o CMD da imagem da carga de trabalho não foi substituído:

size(assertion.submods.container.cmd_override) == 0

O código a seguir verifica se program é o único conteúdo nas substituições do CMD:

assertion.submods.container.cmd_override == ['program']

assertion.submods.container.env

Interage com:

objeto JSON

Verifica se as variáveis de ambiente e os respectivos valores foram transmitidos explicitamente para o contêiner.

Exemplo

O código a seguir verifica se a variável de ambiente example-env-1 está definida como value-1 e example-env-2 está definida como value-2.

assertion.submods.container.env == {"example-env-1": "value-1", "example-env-2": "value-2"}

assertion.submods.container.env_override

Interage com:

String

Verifica se o operador de carga de trabalho substituiu as variáveis de ambiente no contêiner.

Exemplos

O código a seguir verifica se o operador de carga de trabalho não substituiu a variável de ambiente example:

!has(assertion.submods.container.env_override.example)

O código a seguir verifica se o operador de carga de trabalho não substituiu nenhuma variável de ambiente:

size(assertion.submods.container.env_override) == 0
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_digest == "sha256:837ccb607e312b170fac7383d7ccfd61fa5072793f19a25e75fbacb56539b86b"
assertion.submods.container.image_id String

Verifica o ID da imagem do contêiner da carga de trabalho.

Exemplo
assertion.submods.container.image_id == "sha256:652a44b0e911271ba07cf2915cd700fdfa50abd62a98f87a57fdebc59843d93f"

assertion.submods.container.image_reference

Interage com:

String

Verifica o local do contêiner da carga de trabalho em execução sobre a imagem do Confidential Space.

Exemplo
assertion.submods.container.image_reference == "us-docker.pkg.dev/PROJECT_ID/WORKLOAD_CONTAINER:latest"

assertion.submods.container.image_signatures

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:

  • key_id: a impressão digital hexadecimal da chave pública. Para encontrar a impressão digital, execute o seguinte comando:

    openssl pkey -pubin -in public_key.pem -outform DER | openssl sha256

    Em que public_key.pem é sua chave pública no formato PEM.

  • signature: a assinatura em um payload associado ao contêiner assinado e que segue o formato de assinatura simples.
  • signature_algorithm: o algoritmo usado para assinar a chave. Opções:

    • RSASSA_PSS_SHA256 (RSASSA-PSS com um resumo SHA-256)
    • RSASSA_PKCS1V15_SHA256 (RSASSA-PKCS1 v1_5 com um resumo SHA-256)
    • ECDSA_P256_SHA256 (ECDSA na curva P-256 com um resumo SHA-256)
Exemplo
assertion.swname == 'CONFIDENTIAL_SPACE' && ['ECDSA_P256_SHA256:PUBLIC_KEY_FINGERPRINT'].exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig, sig.signature_algorithm+':'+sig.key_id)) && 'serviceaccount.iam.gserviceaccount.com' in assertion.google_service_accounts"

assertion.submods.container.restart_policy

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:

  • Never (padrão)
  • Always
  • OnFailure
Exemplo
assertion.submods.container.restart_policy == "Never"

Declarações de VM

Declaração Tipo Descrição

assertion.google_service_accounts

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 tee-impersonate-service-accounts nos metadados da VM.

Exemplo
workload-service-account@my-project.iam.gserviceaccount.com in assertion.google_service_accounts
assertion.hwmodel String

Verifica a tecnologia de Computação confidencial subjacente. As plataformas compatíveis são as seguintes:

  • GCP_AMD_SEV
  • INTEL_TDX
Exemplo
assertion.hwmodel == "GCP_AMD_SEV"

assertion.submods.confidential_space.monitoring_enabled

Interage com:

Booleano

Verifica o estado de monitoramento na entidade de atestado.

Exemplo
assertion.submods.confidential_space.monitoring_enabled.memory == true
assertion.submods.gce.instance_id String

Verifica o ID da instância de VM.

Exemplo
assertion.submods.gce.instance_id == "0000000000000000000"
assertion.submods.gce.instance_name String

Verifica o nome da instância de VM.

Exemplo
assertion.submods.gce.instance_name == "workload-vm"
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_id == "project-id"
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
assertion.submods.gce.project_number == "00000000000"

assertion.submods.gce.zone

Interage com:

  • Operador de carga de trabalho: o valor --zone .
String

Verifica se a VM está em execução na zona especificada.

Exemplo
assertion.submods.gce.zone == "us-central1-a"