Use chaves de encriptação geridas pelo cliente (CMEK)

Esta página descreve como realizar tarefas relacionadas com as chaves de encriptação geridas pelo cliente (CMEK) para o Firestore no modo Datastore. Para mais informações sobre a CMEK em geral, incluindo quando e por que motivo a ativar, consulte a documentação do Cloud KMS.

Prepare as suas chaves CMEK

Antes de poder criar uma base de dados do modo Datastore protegida por CMEK, tem de concluir os seguintes passos:

  1. Peça acesso à funcionalidade CMEK do modo Datastore.
  2. Crie (ou obtenha) um agente de serviço do modo Datastore.
  3. Crie uma chave CMEK.
  4. Configure as definições da IAM para essa chave.

Conclua estes passos para cada projeto que vai conter bases de dados do Firestore protegidas com CMEK. Se criar posteriormente uma nova chave CMEK, tem de configurar as definições do IAM para essa chave.

Pedir acesso

Antes de criar um agente de serviço do modo Datastore, peça acesso à funcionalidade CMEK preenchendo este formulário.

Crie um agente de serviço do modo Datastore

Antes de criar uma chave CMEK, tem de ter um agente de serviço do modo Datastore, que é um tipo de conta de serviço gerida pela Google que o modo Datastore usa para aceder à chave.

Execute o comando services identity create para criar o agente de serviço que o modo Datastore usa para aceder à chave CMEK em seu nome. Este comando cria a conta de serviço, se ainda não existir, e, em seguida, apresenta-a.

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

Substitua FIRESTORE_PROJECT pelo projeto que planeia usar para as suas bases de dados do modo Datastore.

O comando apresenta o ID do agente de serviço, que está formatado como um endereço de email. Registe a string de email de saída, porque a vai usar num passo posterior.

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

Crie uma chave

Pode usar uma chave criada diretamente no Cloud KMS ou uma chave gerida externamente que disponibiliza com o Cloud External Key Manager.

A localização da chave do Cloud KMS tem de ser igual à localização da base de dados do modo Datastore que vai ser usada com a mesma.

  • Para localizações de bases de dados regionais, use o mesmo nome de localização para o anel de chaves, a chave e a base de dados, porque os nomes de localização têm um mapeamento individual.

    Por exemplo, se quiser criar uma base de dados protegida por CMEK em us-west1, crie um anel de chaves e uma chave em us-west1.

  • Para localizações de bases de dados multirregionais, use o nome da localização da localização multirregional do KMS:

    • Use a localização us multirregional do Cloud KMS para a localização nam5 multirregional do modo Datastore.
    • Use a localização europe multirregional do Cloud KMS para a localização eur3 multirregional do modo Datastore.

No Google Cloud projeto onde quer gerir as suas chaves, conclua o seguinte:

  1. Ative a API Cloud KMS.

  2. Crie um conjunto de chaves e uma chave através de uma das seguintes opções:

Configure as definições do IAM para a chave

Consola

Para conceder uma função do Cloud KMS ao seu agente do serviço, faça o seguinte: Também pode conceder autorização ao nível da chave ou do conjunto de chaves se quiser uma granularidade inferior.

  1. Na Google Cloud consola, aceda à página IAM.

    Aceda à página do IAM

  2. Clique em Adicionar.

  3. Introduza o ID formatado em email do agente de serviço do modo Datastore.

  4. Selecione a função Encriptador/desencriptador de CryptoKey do Cloud KMS.

  5. Clique em Guardar.

gcloud

Conceda a função cloudkms.cryptoKeyEncrypterDecrypter ao seu agente do serviço:

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

Substitua o seguinte:

  • KMS_KEY com o nome que atribuiu à chave
  • KMS_KEYRING com o conjunto de chaves do KMS que contém a chave
  • KMS_LOCATION com a região que contém o conjunto de chaves
  • SERVICE_AGENT_EMAIL com o identificador formatado em email do agente de serviço ao qual está a conceder acesso
  • KMS_PROJECT com o projeto que contém a chave

O terminal deve apresentar uma resposta semelhante à seguinte:

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

Crie uma base de dados com CMEK ativada

Depois de criar e configurar as chaves CMEK, pode criar uma base de dados protegida por CMEK. As bases de dados do modo Datastore existentes protegidas pela encriptação predefinida da Google não podem ser convertidas para usar CMEK.

Só pode escolher um tipo de encriptação e uma chave quando cria uma base de dados com a CMEK ativada.

Consola

  1. Na Google Cloud consola, aceda à página Bases de dados.

    Aceda à página Bases de dados

  2. Clique em Criar base de dados.

  3. Selecione o modo da base de dados. Clique em Continuar.

  4. Na página Configure a sua base de dados, introduza um ID da base de dados.

  5. Selecione uma localização.

  6. Clique em Mostrar opções de encriptação e, de seguida, selecione Chave do Cloud KMS.

  7. Selecione ou introduza o nome do recurso da chave CMEK que quer usar para a base de dados.

  8. A lista de chaves está limitada ao Google Cloud projeto atual e à localização da base de dados que selecionou. Para usar uma chave de um Google Cloud projeto diferente, clique em Mudar de projeto ou Introduzir chave manualmente.

  9. Se lhe for pedido para conceder autorização de chave à conta de serviço do modo Datastore, clique em Conceder. Para criar uma base de dados CMEK, tem de conceder a função cloudkms.cryptoKeyEncrypterDecrypter à conta de serviço do modo Datastore.

  10. Selecione regras de segurança para clientes Web e para dispositivos móveis.

  11. Clique em Criar base de dados.

Depois de criar a base de dados, pode verificar se a mesma tem a CMEK ativada, consultando os detalhes da base de dados:

  • Se a sua base de dados estiver protegida por CMEK, o campo Tipo de encriptação é apresentado como Gerido pelo cliente e o campo Chave de encriptação apresenta o Cloud KMS correspondente e a versão da chave usada para proteger esta base de dados.
  • Se a sua base de dados não estiver protegida por CMEK, o campo Tipo de encriptação é apresentado como Gerido pela Google.

gcloud

Antes de criar uma base de dados com CMEK através da CLI gcloud, instale a versão mais recente e autorize a CLI gcloud. Para mais informações, consulte o artigo Instale a CLI gcloud.

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

Substitua o seguinte:

  • FIRESTORE_DATABASE_LOCATION com a localização do modo Datastore para a base de dados
  • DATABASE_ID com um ID para a base de dados
  • KMS_KEY_NAME com o nome que atribuiu à chave. Use o nome completo do recurso para a chave no seguinte formato:

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore

API REST

Pedido HTTP:

POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

No corpo do pedido, configure a CMEK no campo cmek_config.kms_key_name.

Definido como o ID de recurso completo de uma chave do Cloud KMS. Só é permitida uma chave na mesma localização que esta base de dados.

Este valor deve ser o ID do recurso da chave do Cloud KMS no formato de projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Para mais informações sobre outros campos, consulte a página database create.

Exemplo de pedido:

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

Para criar uma base de dados com CMEK ativada, use o campo Nome da chave do KMS. Se não especificar o parâmetro --kms-key-name, o modo Datastore cria uma base de dados não CMEK por predefinição.

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

Substitua o seguinte:

  • DATABASE_ID com o ID da sua base de dados
  • LOCATION com a localização da sua base de dados
  • KMS_PROJECT com o projeto que contém a sua chave CMEK
  • KMS_LOCATION com a localização que contém a sua chave CMEK e conjunto de chaves
  • KMS_KEYRING_ID com o ID do seu conjunto de chaves CMEK
  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore

Confirme se a base de dados do modo Datastore está protegida com a Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

As seguintes informações da CMEK aparecem na mensagem de resposta:

  • O campo Nome da chave do KMS indica o nome completo do recurso da chave que é usado para encriptar a base de dados CMEK do modo Datastore.
  • O campo Versões de chaves ativas apresenta uma lista de todas as versões de chaves atualmente usadas por esta base de dados CMEK. Durante a rotação de chaves, pode ter várias versões de chaves ativas.

Terraform

Para criar uma base de dados com CMEK ativada, use o recurso google_firestore_database. Para mais informações e exemplos, consulte google_firestore_database.

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

Substitua o seguinte:

  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore
  • DATABASE_ID com um ID para a base de dados
  • FIRESTORE_DATABASE_LOCATION com a localização do modo Datastore para a base de dados
  • DATABASE_TYPE com FIRESTORE_NATIVE para o modo nativo ou DATASTORE_MODE para o modo Datastore.
  • KMS_KEY_NAME com o nome que atribuiu à chave. Use o nome completo do recurso para a chave no formato:

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

Aceda a uma base de dados protegida por CMEK

Todas as operações de leitura, escrita e consulta enviadas para uma base de dados protegida por CMEK devem funcionar da mesma forma que com uma base de dados encriptada predefinida da Google. Por exemplo, não tem de fornecer uma chave para cada pedido.

Restaure uma base de dados protegida por CMEK

Antes de restaurar a base de dados protegida pela CMEK a partir de uma cópia de segurança:

  • Decida se quer restaurar a base de dados para a encriptação CMEK, para a encriptação predefinida da Google (não CMEK) ou para a mesma encriptação da cópia de segurança.
  • Prepare a chave (primary-version) e a versão da chave que usou para encriptar a cópia de segurança. Ative a chave e a versão da chave.

gcloud

Restaure uma base de dados protegida por CMEK para a encriptação CMEK

Para restaurar a encriptação CMEK, execute o comando gcloud firestore databases restore com as flags opcionais encryption-type e kms-key-name para configurar o tipo de encriptação para a base de dados restaurada. Se não especificar o tipo de encriptação, a base de dados restaurada usa a mesma configuração de encriptação que a cópia de segurança.

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

Substitua KMS_KEY_NAME pelo nome que atribuiu à chave. Use o nome completo do recurso para a chave no seguinte formato:

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

Restaure uma base de dados protegida por CMEK para a encriptação predefinida

Para restaurar a encriptação predefinida da Google (não CMEK), defina a flag encryption-type da seguinte forma:

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

Restaure uma base de dados protegida por CMEK para o mesmo tipo de encriptação da cópia de segurança

Para restaurar o mesmo tipo de encriptação da cópia de segurança, defina a flag encryption-type da seguinte forma:

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

Restaure uma base de dados protegida por CMEK para a encriptação CMEK

Para restaurar a encriptação CMEK, use a flag encryption-type e kms-key-name opcional. Se não especificar o tipo de encriptação, a base de dados restaurada usa a mesma configuração de encriptação que a cópia de segurança.

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

Substitua o seguinte:

  • DATABASE_ID com o ID da sua base de dados
  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore
  • FIRESTORE_LOCATION com a localização da sua base de dados no modo Datastore
  • BACKUP_ID com o ID da sua cópia de segurança
  • KMS_PROJECT com o projeto que contém a sua chave CMEK
  • KMS_LOCATION com a localização que contém a sua chave CMEK e conjunto de chaves
  • KMS_KEYRING_ID com o ID do seu conjunto de chaves CMEK

Confirme que a base de dados do modo Datastore restaurada está encriptada com CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Restaure uma base de dados protegida por CMEK para a encriptação predefinida

Para restaurar a encriptação predefinida da Google (não CMEK), defina a flag encryption-type da seguinte forma:

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

Substitua o seguinte:

  • DATABASE_ID com o ID da sua base de dados
  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore
  • FIRESTORE_LOCATION com a localização da sua base de dados no modo Datastore
  • BACKUP_ID com o ID da sua cópia de segurança

Restaure uma base de dados protegida por CMEK para o mesmo tipo de encriptação da cópia de segurança

Para restaurar o mesmo tipo de encriptação da cópia de segurança, defina a flag encryption-type da seguinte forma:

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

Substitua o seguinte:

  • DATABASE_ID com o ID da sua base de dados
  • FIRESTORE_PROJECT com o projeto a usar para a sua base de dados do modo Datastore
  • FIRESTORE_LOCATION com a localização da sua base de dados no modo Datastore
  • BACKUP_ID com o ID da sua cópia de segurança

Clone uma base de dados protegida por CMEK

Antes de clonar uma base de dados protegida por CMEK:

  • Decida se quer clonar a base de dados para a encriptação CMEK, para a encriptação predefinida da Google (não CMEK) ou para a mesma encriptação que a base de dados de origem.
  • Prepare a chave (versão principal) e a versão da chave que usou para encriptar a base de dados de origem. Ative a chave e a versão da chave.

gcloud

Clone uma base de dados protegida por CMEK para a encriptação CMEK

Para clonar para a encriptação CMEK, execute o comando gcloud alpha firestore databases clone com as flags opcionais encryption-type e kms-key-name para configurar o tipo de encriptação para a base de dados clonada. Se não especificar o tipo de encriptação, a base de dados clonada usa a mesma configuração de encriptação que a base de dados de origem.

gcloud alpha firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME

Substitua KMS_KEY_NAME pelo nome que atribuiu à chave. Use o nome completo do recurso para a chave no seguinte formato:

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

Clone uma base de dados protegida por CMEK para a encriptação predefinida

Para clonar para a encriptação predefinida da Google (não CMEK), defina a flag encryption-type da seguinte forma:

gcloud alpha firestore databases clone \
--encryption-type=google-default-encryption

Clone uma base de dados protegida por CMEK para o mesmo tipo de encriptação que a base de dados de origem

Para clonar para o mesmo tipo de encriptação que a base de dados de origem, defina a flag encryption-type da seguinte forma:

gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption

Veja a chave em utilização

gcloud

Pode usar o comando databases describe da CLI gcloud para confirmar a configuração da CMEK da base de dados:

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

Deve ver informações sobre a CMEK no campo cmekConfig na resposta semelhantes às seguintes:

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

A resposta inclui as seguintes informações:

  • kmsKeyName: o nome completo do recurso da chave que é usado para encriptar a base de dados protegida por CMEK.
  • activeKeyVersion: uma lista de todas as versões de chaves atualmente em utilização pela base de dados protegida por CMEK. Durante a rotação de chaves, pode ter várias versões de chaves ativas. A versão da chave antiga e a versão da chave nova têm de estar disponíveis durante a alteração da chave. Não desative a versão antiga da chave até que esta deixe de aparecer no campo activeKeyVersion.

API REST

Pedido HTTP:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

No corpo do pedido, configure a CMEK no campo cmek_config.kms_key_name. Definido como o ID de recurso completo de uma chave do Cloud KMS. Só é permitida uma chave na mesma localização que esta base de dados.

Este valor deve ser o ID do recurso da chave do Cloud KMS no formato de projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Para mais informações sobre outros campos, consulte a página database create.

Exemplo de pedido e resposta:

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

----------------------------------------- Response --------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  ……
}

Desative uma chave

Para desativar uma chave associada a uma base de dados, conclua o seguinte:

  1. Ver as versões das chaves em utilização para uma base de dados.
  2. Desative estas versões de chaves em utilização.
  3. Aguarde que a alteração entre em vigor e verifique se os dados já não estão acessíveis. Normalmente, as alterações entram em vigor numa fração de minutos, mas podem demorar até 3 horas.

Quando uma chave usada por uma base de dados é desativada, espera receber uma exceção FAILED_PRECONDITION com detalhes adicionais na mensagem de erro, por exemplo:

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

Ative uma chave

Para reativar uma chave associada a uma base de dados, conclua o seguinte:

  1. Veja as versões principais em utilização para uma base de dados
  2. Ative estas versões de chaves em utilização
  3. Aguarde que a alteração entre em vigor e verifique se os dados já não estão acessíveis. Normalmente, as alterações entram em vigor numa fração de minutos, mas podem demorar até 3 horas.

Veja os registos de auditoria de uma chave do Cloud KMS

Antes de ativar os registos de auditoria de acesso aos dados do Cloud KMS, deve estar familiarizado com os registos de auditoria do Google Cloud.

Os registos de auditoria de acesso a dados do Cloud KMS mostram quando o modo Datastore ou quaisquer outros produtos configurados para usar a sua chave CMEK fazem chamadas de encriptação/desencriptação para o Cloud KMS. O modo Datastore não emite uma chamada de encriptação/desencriptação em cada pedido de dados, mas mantém um inquiridor que verifica a chave periodicamente. Os resultados da sondagem são apresentados nos registos de auditoria.

Pode configurar e interagir com os registos de auditoria na Google Cloud consola:

  1. Certifique-se de que o registo está ativado para a API Cloud KMS no seu projeto.

  2. Aceda ao Cloud Logging na Google Cloud consola.

    Aceda ao Cloud Logging

  3. Limite as entradas do registo à sua chave do Cloud KMS adicionando as seguintes linhas ao criador de consultas:

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    Substitua o seguinte:

    • KMS_KEY com o nome da chave CMEK
    • KMS_KEYRING com o conjunto de chaves do KMS que contém a chave
    • KMS_LOCATION com a localização da chave e do conjunto de chaves

    O registo mostra algumas entradas de registo a cada cinco minutos por base de dados. As entradas do registo são semelhantes a estes exemplos:

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

Consulte o artigo Compreender os registos de auditoria para ver detalhes sobre a interpretação dos registos de auditoria.

Configure uma política da organização de CMEK

Para especificar os requisitos de conformidade da encriptação para bases de dados no modo Datastore na sua organização, use uma restrição da política da organização da CMEK.

Exija proteção CMEK

Configure constraints/gcp.restrictNonCmekServices para exigir CMEK para a criação de bases de dados no modo Datastore. Defina a restrição como deny e adicione firestore.googleapis.com à lista de negações, por exemplo:

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

Substitua FIRESTORE_PROJECT pelo projeto a restringir.

Para saber como configurar políticas da organização, consulte o artigo Criar e editar políticas.

Após a entrada em vigor da política, recebe uma exceção FAILED_PRECONDITION e uma mensagem de erro se tentar criar uma base de dados não CMEK no projeto afetado. Por exemplo, uma exceção tem o seguinte aspeto:

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

Limite a utilização de chaves para CMEK

Para limitar as chaves do Cloud KMS usadas para a proteção CMEK, configure a restrição constraints/gcp.restrictCmekCryptoKeyProjects.

Como restrição de lista, os valores aceites são indicadores da hierarquia de recursos (por exemplo, projects/PROJECT_ID, under:folders/FOLDER_ID e under:organizations/ORGANIZATION_ID). Use esta restrição configurando uma lista de indicadores da hierarquia de recursos e definindo a restrição como Permitir. Esta configuração restringe os serviços suportados para que as chaves CMEK só possam ser escolhidas a partir dos projetos, das pastas e das organizações indicados. Os pedidos de criação de recursos protegidos por CMEK em serviços configurados não são bem-sucedidos sem uma chave do modo Datastore de um dos recursos permitidos.

O exemplo seguinte permite apenas chaves do ALLOWED_KEY_PROJECT_ID para bases de dados protegidas por CMEK no projeto especificado:

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

Depois de a política entrar em vigor, recebe uma exceção FAILED_PRECONDITION e uma mensagem de erro se violar a restrição. Uma exceção tem o seguinte aspeto:

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

O que se segue?