Como usar chaves de criptografia gerenciadas pelo cliente

As chaves de criptografia gerenciadas pelo cliente (CMEKs, na sigla em inglês) para Pub/Sub fornecem uma camada extra de controle sobre o acesso aos dados de mensagens armazenados em repouso. Os tópicos podem ser configurados para usar uma CryptoKey do Cloud Key Management Service para criptografia de mensagens.

  • Por padrão, as chaves gerenciadas pelo Google são usadas.

  • A CMEK permite que você gerencie o acesso às chaves usando o Cloud KMS. Para impedir que o Pub/Sub descriptografe as mensagens, desative essa chave.

O Pub/Sub usa o padrão de criptografia do envelope. Nessa abordagem, as mensagens não são criptografadas pelo Cloud KMS. Em vez disso, o Cloud KMS é usado para criptografar chaves de criptografia de dados (DEKs, na sigla em inglês) criadas pelo Pub/Sub para cada tópico. Essas DEKs são armazenadas apenas em formato criptografado ou agrupado pelo Pub/Sub. Antes de armazenar uma DEK, o serviço a envia para o Cloud KMS para ser criptografada com a chave de criptografia de chaves (KEK, na sigla em inglês) especificada no tópico. Uma nova DEK é gerada para cada tópico aproximadamente a cada seis horas.

Antes de o Pub/Sub publicar mensagens em uma assinatura, ele as criptografa usando a DEK mais recente que foi gerada para o tópico. O Pub/Sub descriptografa as mensagens pouco antes de elas serem entregues aos assinantes.

O Pub/Sub usa uma conta de serviço do Google Cloud para acessar o Cloud KMS. A conta de serviço é mantida internamente pelo Pub/Sub para cada projeto e não ficará visível em sua lista de contas de serviço. A conta de serviço tem o formato service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com. Para que o recurso de CMEK funcione, é necessário conceder a esta conta o papel Criptografador/Descriptografador do Cloud KMS CryptoKey no Cloud Identity and Access Management.

Como configurar e desativar a CMEK

Como configurar tópicos

Configure a CMEK usando o Console do Google Cloud ou a ferramenta de linha de comando gcloud. Para os pré-requisitos, você precisa ter:

Consulte o guia de início rápido do Cloud KMS para instruções sobre como realizar essas tarefas.

Como os recursos do Pub/Sub são globais, é altamente recomendável que você use chaves globais do Cloud KMS para configurar tópicos compatíveis com a CMEK. Dependendo da localização dos editores e assinantes de um tópico, o uso de uma chave regional do Cloud KMS pode introduzir dependências desnecessárias em links de rede entre regiões.

Como usar o Console do Cloud

Use a caixa de diálogo de criação de tópicos do Console do Cloud para adicionar suas chaves de criptografia. Consulte o guia de início rápido do Console do Cloud para informações sobre como acessar essa caixa de diálogo.

Se você não vir a lista suspensa

O Console do Cloud:

  • simplifica a configuração do Cloud IAM e garante que a conta de serviço do Pub/Sub tenha as permissões apropriadas;

  • permite configurar a criptografia na caixa de diálogo de criação de tópicos.

Como usar a linha de comando

Este exemplo ilustra como usar a ferramenta de linha de comando gcloud para configurar a CMEK em um tópico:


   # Grant the Pub/Sub service account the Cloud KMS CryptoKey
   # Encrypter/Decrypter role. This service account is different
   # from the service account you are using to authorize requests to GCP.

   $ gcloud projects add-iam-policy-binding ${PROJECT_ID} --member=\
        "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" \
        --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

   # Create a topic that uses customer-managed encryption, using the
   # --topic-encryption-key argument to specify the Cloud KMS key to use
   # for protecting message data.

   $ KEY_ID=projects/${PROJECT_ID}/locations/global/keyRings/my-key-ring/cryptoKeys/my-crypto-key
   $ alias pubsub="gcloud pubsub"
   $ pubsub topics create $TOPIC_NAME --topic-encryption-key=$KEY_ID

   # Confirm that the topic is configured for customer-managed encryption,
   # indicated by the presence of the kmsKeyName specified on the topic.

   $ pubsub topics describe $TOPIC_NAME
     name: $TOPIC_NAME
     kmsKeyName: $KEY_ID
     

Como desativar e reativar as chaves

Há duas maneiras de impedir que o Pub/Sub descriptografe os dados da sua mensagem:

  • Recomendado: desative a chave do Cloud KMS que você associou ao tópico usando o Pub/Sub. Essa abordagem afeta somente os tópicos e as assinaturas do Pub/Sub associados a essa chave específica.

  • Revogue o papel Criptografador/Descriptografador do Pub/Sub CryptoKey da conta de serviço do Pub/Sub (service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com) usando o Cloud IAM. Essa abordagem afeta todos os tópicos do Pub/Sub do projeto e as assinaturas que contêm mensagens criptografadas usando a CMEK.

Embora nenhuma das operações garanta a revogação do acesso instantâneo, as alterações do Cloud IAM geralmente são propagadas mais rapidamente. Para saber mais, consulte Consistência de recursos do Cloud KMS e as Perguntas frequentes sobre o Cloud IAM.

Quando o Pub/Sub não puder acessar a chave, a publicação de mensagens e a entrega com streamingPull ou pull falharão com erros FAILED_PRECONDITION. A entrega de mensagens para os endpoints de push será interrompida. Para retomar a exibição e a publicação, restaure o acesso à chave.

Quando a chave estiver acessível para o Pub/Sub, a publicação estará disponível em até 12 horas, e a entrega da mensagem será retomada em até 2 horas.

O Pub/sub tenta distinguir entre a indisponibilidade de chave devido a ações intencionais, como a desativação da chave e a indisponibilidade prolongada do serviço do Cloud KMS. Embora seja improvável que uma interrupção do Cloud KMS interrompa a publicação e a entrega, a indisponibilidade tem o mesmo efeito que a revogação da chave.

Registros de auditoria

O Cloud KMS produz registros de auditoria quando as chaves são ativadas, desativadas ou usadas pelo Pub/Sub para criptografar e descriptografar mensagens. Isso é útil na depuração de problemas com a disponibilidade de publicação ou entrega.

As chaves do Cloud KMS são anexadas a registros de auditoria para recursos de tópicos do Pub/Sub. O Pub/Sub não inclui nenhuma outra informação relacionada ao Cloud KMS.

Preços e custo

Para as seguintes solicitações de Pub/Sub, o uso da CMEK gera cobranças pelo acesso ao serviço do Cloud KMS com base nos preços do Pub/Sub:

  • Para cada tópico que usa a CMEK, uma nova DEK é criptografada e armazenada a cada seis horas.

  • A chave é usada para descriptografar as DEKs a cada seis minutos. A descriptografia acontece três vezes, uma vez para cada zona na região em que o serviço do Pub/Sub é executado.

Por exemplo, considere um tópico com:

  • pelo menos uma assinatura;

  • clientes editores e assinantes na mesma região.

O número de operações criptográficas do Cloud KMS pode ser estimado como:

1 key access for ENCRYPT * (30 days / month * 24 hours / day) / 6 hours
 + 3 key accesses for DECRYPT
   * (30 days / month * 24 hours / day * 60 minutes / hour ) / 5 minutes
  = 26,000 Cloud KMS key access events.
Dada uma estrutura de preços em que operações criptográficas custam US$ 0,03 por 10.000 operações, o uso excedente custaria aproximadamente US$ 0,08. Clique aqui para as informações de preços do Cloud KMS mais atuais.

Na prática, as chaves podem ser buscadas com maior ou menor frequência, dependendo dos padrões de acesso. Use esses números apenas como estimativas.

Monitoramento e solução de problemas

Os problemas com o acesso às chaves podem ter os efeitos a seguir:

  • Atrasos na entrega de mensagens

  • Erros de publicação

Monitore erros de solicitação de publicação e envio usando as métricas a seguir, agrupadas por response_class e response_code:

  • topic/send_request_count
  • subscription/pull_request_count
  • subscription/streaming_pull_response_count

A resposta StreamingPull tem uma taxa de erro de 100%. Essa é uma indicação de que o fluxo foi finalizado, não de que as solicitações estão falhando. Para monitorar o StreamingPull, procure o código de resposta FAILED_PRECONDITION.

Para assinaturas de push, não há como detectar diretamente problemas de entrega específicos da CMEK. Em vez disso:

  • monitore o tamanho e a idade do acúmulo de uma assinatura de push usando subscription/num_unacked_messages;

  • monitore subscription/oldest_unacked_message_age para picos incomuns;

  • use erros de publicação e registros de auditoria da CMEK para identificar problemas.