Como usar chaves de criptografia gerenciadas pelo cliente

Esta página descreve como usar uma chave de criptografia do Cloud Key Management Service (Cloud KMS) com o Dataflow. Com uma chave de criptografia gerenciada pelo cliente (CMEK, na sigla em inglês), é possível criptografar dados em repouso com uma chave controlada por meio do Cloud KMS. É possível criar um pipeline em lote ou de streaming protegido por uma CMEK ou acessar dados protegidos por CMEK em fontes e coletores.

Outra opção é usar o Cloud HSM, um serviço de módulo de segurança de hardware (HSM, na sigla em inglês) hospedado na nuvem. Com ele, é possível hospedar chaves de criptografia e executar operações de criptografia em um cluster de HSMs Nível 3 de FIPS 140-2 (em inglês) certificados. Para mais informações sobre cotas extras para o Cloud HSM, consulte Cotas do Cloud KMS.

Para mais informações, veja opções de criptografia no Google Cloud.

Antes de começar

  1. Verifique se você tem o SDK do Apache Beam para Java 2.13.0 ou mais recente ou o SDK do Apache Beam para o Python 2.13.0 ou mais recente.

    Para mais informações, consulte Como instalar o SDK do Apache Beam.

  2. Decida se você executará o Dataflow e o Cloud KMS no mesmo projeto do Google Cloud ou em projetos diferentes. Nesta página, usa-se a seguinte convenção:

    • PROJECT_ID é o ID do projeto que está executando o Dataflow.
    • PROJECT_NUMBER é o número do projeto que está executando o Dataflow.
    • KMS_PROJECT_ID é o ID do projeto que está executando o Cloud KMS.

    Para informações sobre os códigos de projeto e os números de projeto do Google Cloud, consulte Como identificar projetos.

  3. No projeto do Google Cloud que você quer executar o Cloud KMS:

    1. Ative a API Cloud KMS.
    2. Crie um keyring e uma chave, conforme descrito em Como criar chaves simétricas. O Cloud KMS e o Dataflow são serviços regionalizados. A região do CMEK e o endpoint regional para o job do Dataflow precisam ser iguais.

Como conceder permissões de criptografador/descriptografador

  1. Atribua o papel Cloud KMS CryptoKey Encrypter/Decrypter à conta de serviço do Dataflow. Isso concede à conta de serviço do Dataflow a permissão para criptografar e descriptografar com o CMEK especificado. Se você usar o Console do Google Cloud e a página Criar job a partir do modelo, essa permissão será concedida automaticamente e você poderá ignorar esta etapa.

    Use a ferramenta de linha de comando gcloud para atribuir o papel:

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@dataflow-service-producer-prod.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    Substitua KMS_PROJECT_ID pelo ID do seu projeto do Google Cloud que está executando o Cloud KMS e substitua PROJECT_NUMBER pelo número do projeto do Google Cloud (não confundir com o ID do projeto) que executa os recursos do Dataflow.

  2. Atribua o papel Cloud KMS CryptoKey Encrypter/Decrypter à conta de serviço do Compute Engine. Isso concede a ela a permissão para criptografar e descriptografar com a CMEK especificada.

    Use a ferramenta de linha de comando gcloud para atribuir o papel:

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    Substitua KMS_PROJECT_ID pelo código do projeto do Google Cloud que está executando o Cloud KMS e substitua PROJECT_NUMBER pelo número do projeto (sem ser o código do projeto) do Google Cloud que executa os recursos do Compute Engine.

Crie um pipeline protegido pelo Cloud KMS

Ao criar um pipeline em lote ou de streaming, selecione uma chave do Cloud KMS para criptografar o estado dele. O estado do pipeline são os dados armazenados pelo Dataflow no armazenamento temporário.

Interface de linha de comando

Para criar um novo pipeline com estado de pipeline protegido por uma chave do Cloud KMS, adicione a sinalização relevante aos parâmetros dele. O exemplo a seguir demonstra a execução de um pipeline de contagem de palavras com o Cloud KMS.

Java

O Dataflow não é compatível com a criação de caminhos padrão do Cloud Storage para arquivos temporários ao usar uma chave do Cloud KMS. É necessário especificar gcpTempLocation.

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \
  -Dexec.args="--inputFile=gs://dataflow-samples/shakespeare/kinglear.txt \
               --output=gs://STORAGE_BUCKET/counts \
               --runner=DataflowRunner --project=PROJECT_ID \
               --gcpTempLocation=gs://STORAGE_BUCKET/tmp \
               --dataflowKmsKey=KMS_KEY"
  -Pdataflow-runner

Python

O Dataflow não é compatível com a criação de caminhos padrão do Cloud Storage para arquivos temporários ao usar uma chave do Cloud KMS. É necessário especificar temp_location.

python -m apache_beam.examples.wordcount \
  --input gs://dataflow-samples/shakespeare/kinglear.txt \
  --output gs://STORAGE_BUCKET/counts \
  --runner DataflowRunner \
  --project PROJECT_ID \
  --temp_location gs://STORAGE_BUCKET/tmp/ \
  --dataflow_kms_key=KMS_KEY

Cloud Console

  1. Abra a IU de monitoramento do Dataflow.
    Acessar a IU da Web do Dataflow
  2. Selecione Criar job a partir do modelo.
  3. Na seção Criptografia, selecione Chave gerenciada pelo cliente.
As opções de criptografia na página

Na primeira vez que você tentar executar um job com uma determinada chave do Cloud KMS, a conta de serviço do Compute Engine e/ou a conta de serviço do Dataflow podem não ter recebido as permissões para criptografar e descriptografar usando essa chave. Nesse caso, uma mensagem de aviso será exibida solicitando que você conceda a permissão para a conta de serviço.

Solicitações para a concessão de permissões para criptografar e descriptografar as contas de serviço do Compute Engine e do Cloud Dataflow usando uma CMEK específica.

Criptografia de artefatos de estado do pipeline

Os dados que um pipeline do Dataflow lê a partir de origens de dados especificadas pelo usuário são criptografados, exceto pelas chaves de dados que o usuário especificou para transformações baseadas em chave.

As chaves de dados usadas em operações baseadas em chaves, como gerenciamento de janelas, agrupamento e junção, não são protegidas pela criptografia da CMEK. Se essas chaves contiverem informações de identificação pessoal (PII, na sigla em inglês), você precisará gerar um hash ou transformar as chaves antes que elas entrem no pipeline do Dataflow. Os valores dos pares de chave-valor estão no escopo da criptografia da CMEK.

Os metadados do job não são criptografados com chaves do Cloud KMS. Eles incluem:

  • dados fornecidos pelo usuário, como nomes e valores de parâmetro de jobs e grafo de pipeline;
  • dados gerados pelo sistema, como IDs de jobs e endereços IP de workers.

Criptografia de locais de estado do pipeline

Os seguintes locais de armazenamento são protegidos com chaves do Cloud KMS:

  • Discos permanentes anexados a workers do Dataflow e usados para armazenamento de estado de streaming e embaralhamento baseados em disco permanente.
  • Estado Embaralhamento do Dataflow para pipelines de lote.
  • buckets do Cloud Storage que armazenam dados temporários de exportação ou importação. O Dataflow só é compatível com chaves padrão definidas pelo usuário no nível do bucket.
  • Buckets do Cloud Storage usados para armazenar arquivos binários contendo código de pipeline. O Dataflow só é compatível com chaves padrão definidas pelo usuário no nível do bucket.

Atualmente, o estado do Dataflow Streaming Engine não pode ser protegido por CMEK e é criptografado por uma chave gerenciada pelo Google. Se você quiser que todo o estado do pipeline seja protegido por CMEKs, não use esse recurso opcional.

Como verificar o uso da chave do Cloud KMS

Você pode verificar se o pipeline usa uma chave do Cloud KMS usando o Console do Cloud ou a ferramenta de linha de comando gcloud.

Console

  1. Abra a IU de monitoramento do Dataflow.
    Acessar a IU da Web do Dataflow
  2. Selecione seu job do Dataflow para ver os detalhes do job.
  3. Na seção Resumo do job, o tipo de chave é listado no campo Tipo de criptografia.
    Seção de resumo do job listando os detalhes de um job do Cloud Dataflow.
          O tipo de chave usada pelo job é listado no campo

CLI

Execute o comando describe usando a ferramenta gcloud:

gcloud dataflow jobs describe JOB_ID

Busque a linha que contém serviceKmsKeyName. Essas informações mostram que uma chave do Cloud KMS foi usada para a criptografia de estado do pipeline do Dataflow.

Você pode verificar o uso da chave do Cloud KMS para criptografar fontes e coletores usando as páginas e ferramentas do Console do Cloud dessas fontes e coletores, incluindo Pub/Sub, Cloud Storage e BigQuery. Você também pode verificar o uso da chave do Cloud KMS visualizando os registros de auditoria do Cloud KMS.

Registro de auditoria de uso da chave do Cloud KMS

O Dataflow permite que o Cloud KMS use o Cloud Audit Logs para registrar operações importantes, como criptografar e descriptografar. O Dataflow fornece o ID do job como contexto para um autor da chamada do Cloud KMS. Isso permite que você acompanhe cada instância em que uma chave específica do Cloud KMS é usada para um job do Dataflow.

O Cloud Audit Logs mantém registros de auditoria para cada projeto, pasta e organização do Google Cloud. Você tem várias opções para visualizar seus registros de auditoria do Cloud KMS.

O Cloud KMS grava registros de auditoria de Atividades do administrador para seus jobs do Dataflow com a criptografia CMEK. Esses registros gravam operações que modificam a configuração ou os metadados de um recurso. Não é possível desativar os registros de auditoria de Atividades do administrador.

Se ativado explicitamente, o Cloud KMS grava registros de auditoria de acesso a dados dos jobs do Dataflow com a criptografia CMEK. Esses registros contêm as chamadas de API que leem a configuração ou os metadados dos recursos, além daquelas baseadas no usuário que criam, modificam ou leem os dados dos recursos inseridos pelo usuário. Para instruções sobre como ativar alguns ou todos os registros de auditoria de acesso a dados, acesse Como configurar registros de acesso a dados.

Como remover o acesso do Dataflow à chave do Cloud KMS

Você pode remover o acesso do Dataflow à chave do Cloud KMS usando as etapas a seguir:

  1. Revogue o papel Cloud KMS CryptoKey Encrypter/Decrypter da conta de serviço do Dataflow usando o Console do Cloud ou a ferramenta gcloud.
  2. Revogue o papel Cloud KMS CryptoKey Encrypter/Decrypter da conta de serviço do Compute Engine usando o Console do Cloud ou a ferramenta gcloud.
  3. Opcionalmente, você também pode destruir o material da versão da chave para impedir ainda mais o Dataflow e outros serviços de acessar o estado do pipeline.

É possível destruir o material da versão da chave, mas não excluir as chaves e os keyrings. Os keyrings e as chaves não têm custos faturáveis ou limitações de cota. Por isso, a existência deles não afeta os custos e os limites de produção.

Os jobs do Dataflow validam periodicamente se a conta de serviço do Dataflow pode usar com êxito a chave do Cloud KMS fornecida. Se uma solicitação de criptografia ou descriptografia falhar, o serviço do Dataflow interromperá toda a ingestão e processamento de dados assim que possível e começará imediatamente a limpar os recursos do Google Cloud vinculados ao job.

Como usar fontes e coletores do GCP protegidos com chaves do Cloud KMS

O Dataflow pode acessar fontes e coletores protegidos por chaves do Cloud KMS sem que você precise especificar a chave do Cloud KMS dessas fontes e coletas, desde que não esteja criando novos objetos. Se o pipeline do Dataflow puder criar novos objetos em um coletor, será preciso definir parâmetros de pipeline que especifiquem as chaves do Cloud KMS para esse coletor e transmitir essa chave do Cloud KMS para os métodos apropriados do conector de E/S.

Para fontes e coletores do pipeline do Dataflow que não são compatíveis com o CMEK gerenciado pelo Cloud KMS, como Confluent Kafka hospedado no Google Cloud ou no Amazon Simple Storage Service (S3), as configurações do CMEK do Dataflow são irrelevantes.

Permissões de chave do Cloud KMS

Ao acessar os serviços protegidos com chaves do Cloud KMS, certifique-se de atribuir o papel Cloud KMS CryptoKey Encrypter/Decrypter a esse serviço. As contas têm o seguinte formato:

  • Cloud Storage: service-{project_number}@gs-project-accounts.iam.gserviceaccount.com
  • BigQuery: bq-{project_number}@bigquery-encryption.iam.gserviceaccount.com
  • Pub/Sub: service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com

Cloud Storage

Se quiser proteger os buckets temporários e de preparo especificados com os parâmetros de pipeline TempLocation/temp_location e stagingLocation/staging_location, consulte Como configurar buckets do Cloud Storage protegidos pela CMEK.

BigQuery

Java

Use o método with_kms_key() nos valores de retorno de BigQueryIO.readTableRows(), BigQueryIO.read(), BigQueryIO.writeTableRows() e BigQueryIO.write().

É possível encontrar um exemplo no repositório do GitHub do Apache Beam (em inglês).

Python

Use o argumento kms_key em BigQuerySource e BigQuerySink (links em inglês).

É possível encontrar um exemplo no repositório do GitHub do Apache Beam (em inglês).

Pub/Sub

O Dataflow processa o acesso a tópicos protegidos pelo CMEK usando a configuração de tópico do CMEK.

Para ler e gravar tópicos do Pub/Sub protegidos pelo CMEK, consulte as instruções de Pub/Sub para usar o CMEK.

Preço

Você pode usar chaves de criptografia do Cloud KMS com o Dataflow em todos os endpoints regionais do Dataflow em que o Cloud KMS esteja disponível.

Essa integração não gera custos adicionais além das operações principais, que são faturadas para seu projeto do Google Cloud. Sempre que a conta de serviço do Dataflow usa sua chave do Cloud KMS, a operação é faturada com base nas operações de chave do Cloud KMS.

Para mais informações, consulte Detalhes do preço do Cloud KMS.