Usar chaves de criptografia gerenciadas pelo cliente (CMEK)
Esta página descreve como executar tarefas relacionadas à chaves de criptografia gerenciadas pelo cliente (CMEK, na sigla em inglês) para o Firestore. Para obter mais informações sobre CMEK, em geral, como quando e por que ativar, consulte a documentação do Cloud KMS.
Preparar suas chaves CMEK
Antes de criar um banco de dados do Firestore protegido por CMEK, você precisa concluir as seguintes etapas:
- Solicite acesso ao recurso CMEK do Firestore.
- Crie (ou extraia) um agente de serviço do Firestore.
- Crie uma chave CMEK.
- Defina as configurações do IAM para essa chave.
Conclua estas etapas para cada projeto que terá proteção de CMEK bancos de dados do Firestore. Se depois você criar uma chave CMEK, é preciso definir as configurações do IAM para essa chave.
Solicitar acesso
Antes de criar um agente de serviço do Firestore, solicite acesso ao CMEK, preenchendo este formulário.
Criar um agente de serviço do Firestore
Antes de criar uma chave CMEK, você precisa ter Agente de serviço, que é um tipo de conta de serviço gerenciado pelo Google que O Firestore usa para acessar a chave.
Execute o comando services Identity create para criar o agente de serviço que o Firestore usa para acessar a CMEK chave em seu nome. Esse comando cria a conta de serviço, se ela ainda não existir, e depois a exibe.
gcloud beta services identity create \ --service=firestore.googleapis.com \ --project FIRESTORE_PROJECT
Substitua FIRESTORE_PROJECT
pelo projeto que você planeja.
para usar nos bancos de dados do Firestore.
O comando exibe o código do agente de serviço, que está formatado como um endereço de e-mail. Registre a string de e-mail de saída, porque você a usará em uma etapa posterior.
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
Crie uma chave
É possível usar uma chave criada diretamente no Cloud KMS ou uma chave gerenciada externamente que você disponibiliza com o Cloud External Key Manager.
O local da chave do Cloud KMS precisa ser mesmo que o local do banco de dados do Firestore em que ele será usado. com
Para locais regionais do banco de dados, use o mesmo nome de local para keyring, chave e banco de dados porque os nomes dos locais têm um mapeamento de um para um.
Por exemplo, se você quiser criar um banco de dados protegido pelo CMEK no
us-west1
, crie um keyring e uma chave emus-west1
.Para locais do banco de dados multirregionais, use o nome do local multirregional do KMS:
- Use o local multirregional
us
do Cloud KMS para o local multirregionalnam5
do Firestore. - Use o local multirregional
europe
do Cloud KMS para o local multirregionaleur3
do Firestore.
- Use o local multirregional
No projeto do Google Cloud em que você quer gerenciar as chaves, faça o seguinte:
Crie um keyring e uma chave usando uma das seguintes opções:
- Crie o keyring e a chave diretamente no Cloud KMS.
- Usar uma chave gerenciada externamente. Crie a chave externa e depois crie uma chave do Cloud EKM para disponibilizá-la por meio do Cloud KMS.
Como definir as configurações do IAM da chave
Console
Para conceder um papel do Cloud KMS ao seu agente de serviço, faça o seguinte. Também é possível conceder permissão no nível da chave ou do keyring para a granularidade mais baixa.
No console do Google Cloud, abra a página IAM.
Clique em Adicionar.
Insira o ID com formato de e-mail para o agente de serviço do Firestore.
Selecione o papel Criptografador/Descriptografador de CryptoKey do Cloud KMS.
Clique em Save.
gcloud
Conceda o papel
cloudkms.cryptoKeyEncrypterDecrypter
ao seu agente de 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
Preencha o seguinte:
KMS_KEY
: nome atribuído à chave;KMS_KEYRING
: keyring do KMS que contém a chave;KMS_LOCATION
: região que contém o keyring;SERVICE_AGENT_EMAIL
: identificador formatado pelo e-mail do agente de serviço a que você está concedendo acesso;KMS_PROJECT
: projeto que contém a chave.
O terminal vai exibir 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
Criar um banco de dados ativado para CMEK
Depois de criar e configurar as chaves CMEK, é possível criar uma instância no seu banco de dados. Os bancos de dados do Firestore que estão protegidos pela criptografia padrão do Google não podem ser convertidos para usar CMEK. Só é possível escolher um tipo de criptografia e uma chave no momento da criação.
gcloud
gcloud alpha firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
--database=DATABASE_ID \
--kms-key-name=KMS_KEY_NAME \
--project=FIRESTORE_PROJECT
Preencha o seguinte:
FIRESTORE_DATABASE_LOCATION
: o local do Firestore para o banco de dadosDATABASE_ID
: um ID para o banco de dados.KMS_KEY_NAME
: o nome atribuído à chave. Use o nome completo do recurso para a chave no formato do seguinte:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECT
: o projeto que será usado no Banco de dados do Firestore
API REST
Solicitação HTTP:
POST https://firestore.googleapis.com/v1/projects/{FIRESOTRE_PROJECT}/databases
No corpo da solicitação, configure a CMEK no campo cmek_config.kms_key_name
.
Defina como o ID de recurso completo de uma chave do Cloud KMS. Somente uma chave no mesmo local que este banco de dados é permitida.
Esse valor precisa ser o ID do recurso da chave do Cloud KMS no formato
projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}
Para mais detalhes sobre outros campos, consulte a página database create
.
Exemplo de solicitação:
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"
}
}'
Terraform
Para criar um banco de dados ativado para CMEK, use o google_firestore_database
recurso. 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"
}
}
Preencha o seguinte:
FIRESTORE_PROJECT
: o projeto que será usado no Banco de dados do FirestoreDATABASE_ID
: um ID para o banco de dados.FIRESTORE_DATABASE_LOCATION
: o local do Firestore para o banco de dadosDATABASE_TYPE
: FIRESTORE_NATIVE para o modo nativo ou DATASTORE_MODE para o modo Datastore.KMS_KEY_NAME
: o nome atribuído à chave. Use o nome completo do recurso para a chave no formato do seguinte:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Acessar um banco de dados protegido pelo CMEK
Todas as operações de leitura, gravação e consulta enviadas para um banco de dados protegido pela CMEK deve funcionar da mesma forma que um banco de dados criptografado padrão do Google. Por exemplo, não é preciso fornecer uma chave para cada solicitação.
Ver a chave em uso
gcloud
Você pode usar o databases describe CLI gcloud para confirmar a configuração da CMEK do banco de dados:
gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT
Você verá informações da CMEK no campo cmekConfig
na resposta
semelhante a:
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 usada para criptografar seu banco de dados protegido pelo CMEK.activeKeyVersion
: uma lista de todas as versões de chave atualmente em uso. pelo banco de dados protegido pela CMEK. Durante a rotação de chaves, pode haver várias versões de chaves ativas.
API REST
Solicitação HTTP:
GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}
No corpo da solicitação, configure o CMEK no campo cmek_config.kms_key_name
.
Defina como o ID de recurso completo de uma chave do Cloud KMS. Apenas uma chave no mesmo
porque esse banco de dados é permitido.
Esse valor precisa ser o ID do recurso da chave do Cloud KMS no formato
projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}
Para mais detalhes sobre outros campos, consulte a página database create
.
Exemplo de solicitação 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"
]
},
……
}
Desativar uma chave
Para desativar uma chave associada a um banco de dados, faça o seguinte:
- Conferir as versões da chave em uso em um banco de dados
- Desativar essas versões da chave
- Aguarde a mudança entrar em vigor e verifique se os dados não estão mais acessíveis. As alterações geralmente entram em vigor em minutos, mas isso pode levar até três horas.
Quando uma chave usada por um banco de dados for desativada, espere 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)" } ] } }
Ativar uma chave
Para reativar uma chave associada a um banco de dados, faça o seguinte:
- Conferir as versões da chave em uso em um banco de dados
- Ativar essas versões de chave
- Aguarde a mudança entrar em vigor e verifique se os dados não estão mais acessíveis. As alterações geralmente entram em vigor em minutos, mas isso pode levar até três horas.
Visualizar registros de auditoria para chave do Cloud KMS
Antes de ativar os registros de auditoria de acesso a dados do Cloud KMS, familiarize-se com os registros de auditoria do Cloud.
Os registros de auditoria de acesso a dados do Cloud KMS mostram quando o Firestore ou qualquer outro produto configurado para usar sua A chave CMEK faz chamadas de criptografia/descriptografia para o Cloud KMS. O Firestore não emite uma chamada de criptografia/descriptografia em todas as solicitações de dados, mas mantém um aplicativo de pesquisa que verifica a chave periodicamente. Os resultados da pesquisa aparecem nos registros de auditoria.
É possível configurar e interagir com os registros de auditoria no Console do Google Cloud:
Verifique se a geração de registros está ativada para a API Cloud KMS no seu projeto.
Acesse o Cloud Logging no Console do Google Cloud.
Limite as entradas de registro na 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
Preencha o seguinte:
KMS_KEY
: nome da chave CMEK;KMS_KEYRING
: keyring do KMS que contém a chave;KMS_LOCATION
: o local da chave e do keyring
O registro mostra algumas entradas de registro a cada cinco minutos por banco de dados. As entradas de registro serã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 Noções básicas sobre registros de auditoria para detalhes sobre como interpretar registros de auditoria.
Configurar uma política da organização de CMEK
Especificar requisitos de conformidade de criptografia para o Firestore bancos de dados na sua organização, use uma restrição de política da organização de CMEK.
Exigir proteção de CMEK
Configure constraints/gcp.restrictNonCmekServices
para exigir CMEK na
criação do banco de dados do Firestore. Defina a restrição como deny
e
adicione firestore.googleapis.com
à lista de bloqueio, por exemplo:
gcloud resource-manager org-policies deny gcp.restrictNonCmekServices is:firestore.googleapis.com --project=FIRESTORE_PROJECT
Substitua FIRESTORE_PROJECT
pelo projeto a ser restrito.
Para saber mais sobre como configurar políticas da organização, consulte Criar e editar políticas.
Depois que a política entrar em vigor, você receberá uma exceção FAILED_PRECONDITION
e uma mensagem de erro se tentar criar um banco de dados não CMEK no projeto afetado. Por exemplo, uma exceção é semelhante a esta:
{ "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." } ]
Limitar o uso de chaves para a CMEK
Para limitar quais chaves do Cloud KMS são usadas para proteção CMEK,
configure a restrição constraints/gcp.restrictCmekCryptoKeyProjects
.
Como restrição de lista, os valores aceitos são indicadores da hierarquia de recursos (por
exemplo, projects/PROJECT_ID
, under:folders/FOLDER_ID
e
under:organizations/ORGANIZATION_ID
). Use essa restrição configurando
lista de indicadores de hierarquia de recursos e definir a restrição como Permitir.
Esta configuração restringe os serviços com suporte para que as chaves CMEK possam ser escolhidas
apenas dos projetos, pastas e organizações listados. Solicitações para criar
Os recursos protegidos pela CMEK em serviços configurados não funcionam sem uma
Chave do Firestore de um dos recursos permitidos.
O exemplo a seguir permite apenas chaves do ALLOWED_KEY_PROJECT_ID para bancos de dados protegidos por CMEK no projeto especificado:
gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \ under:projects/ALLOWED_KEY_PROJECT_ID \ --project=FIRESTORE_PROJECT
Depois que a política entrar em vigor, você receberá uma exceção FAILED_PRECONDITION
.
e uma mensagem de erro se você violar a restrição. Uma exceção
será assim:
{ "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." } ] } ] } }