Criar e conceder acesso a recursos confidenciais


Os colaboradores de dados precisam configurar os seguintes recursos para que os dados confidenciais sejam acessados por uma carga de trabalho:

Além disso, os colaboradores de dados precisam escolher onde os resultados da carga de trabalho do Confidential Space sã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

Você pode usar qualquer serviço do 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 cargas de trabalho do Confidential Space e reduz a exposição humana a esses dados usando contas de serviço.

Por exemplo, você pode criptografar arquivos confidenciais no Cloud Storage com o Cloud KMS e criar uma conta de serviço que tenha 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 baseada em outro projeto pode usar esse WIP para imitar 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 de dados confidenciais é restrita aos proprietários deles. 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 que usam 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 Confidential Space confidencial para conferir um exemplo.

Criar um WIP e um provedor para a validação do 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 dela. O processo é baseado em medições de inicialização e de execução estendidas da VM protegida 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 a 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 o WIP autorizar a carga de trabalho, ela poderá imitar contas de serviço no projeto para descriptografar e extrair 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 o papel iam.workloadIdentityUser.

  3. Crie um provedor OIDC com os seguintes detalhes:

    • Um URI do 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 atestado para ver as opções disponíveis.

Criar uma política de atestado

Como parte da criação de um WIP, você adiciona condições de atributo, condições que uma carga de trabalho precisa passar 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 identidade da 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, o contêiner de carga de trabalho e a VM.

Afirmaçõ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 do Confidential Space de produção. 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: essa versão da imagem tem suporte 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 própria 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 o uso de 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 abaixo 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 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 é 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

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

  • signature: a assinatura sobre um payload que é 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 com suporte são as seguintes:

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 da 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 do 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 do 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 de --zone .
String

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

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