Resolver erros de CMEK e de configuração padrão

Neste documento, descrevemos como encontrar e mitigar erros comuns de configuração de CMEKs e como identificar erros que ocorrem ao definir o local padrão do recurso.

Resolver problemas ao definir o local padrão do recurso

Você tenta atualizar o local de armazenamento padrão de uma organização ou pasta, mas o comando falha com um erro semelhante ao seguinte:

ERROR: (gcloud.logging.settings.update) INVALID_ARGUMENT: The KMS key location must match the storage location. Received KMS key location: us-central1, storage location: us-west1
- '@type': type.googleapis.com/google.rpc.DebugInfo
  detail: '[ORIGINAL ERROR] generic::invalid_argument: The KMS key location must match
    the storage location. Received KMS key location: us-central1, storage location:
    us-west1 [google.rpc.error_details_ext] { message: "The KMS key location must
    match the storage location. Received KMS key location: us-central1, storage location:
    us-west1" }'

Para resolver esse erro, defina o local de armazenamento padrão da organização ou pasta que corresponda ao local da chave do Cloud Key Management Service referente à organização ou pasta.

Resolver problemas do VPC Service Controls e do compartilhamento restrito de domínio

Você definiu a CMEK como uma configuração de recurso padrão para sua organização ou para uma pasta ou criou um bucket de registros com a CMEK ativada. Em seguida, configure o VPC Service Controls. Depois de configurar o VPC Service Controls, restrinja o acesso ao Cloud Key Management Service no VPC Service Controls ou ative o compartilhamento restrito de domínio.

Pelo menos uma das seguintes situações ocorre:

  • Você recebeu uma notificação do Cloud Logging sobre problemas de acesso à CMEK.

  • Você percebe que a CMEK não está ativada para os buckets de registros _Default e _Required quando você cria novos projetos do Google Cloud na sua organização ou em uma pasta.

  • Você recebe erros ao ler buckets de registros com a CMEK ativada. Os erros exibidos são semelhantes ao seguinte:

    ERROR: (gcloud.logging.read) FAILED_PRECONDITION: service account `cmek-PROJECT_IDgcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY`
    
  • Você recebe erros ao criar ou atualizar buckets de registros com a CMEK ativada. Os erros que você vê são semelhantes ao seguinte:

    ERROR: (gcloud.logging.buckets.create) service account `cmek-PROJECT_ID@gcp-sa-logging.iam.gserviceaccount.com` must have both encrypt and decrypt access to the CMEK KMS key `projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY`
    - '@type': type.googleapis.com/google.rpc.DebugInfo
      detail: '[ORIGINAL ERROR] generic::permission_denied: Request is prohibited by
      organization's policy. vpcServiceControlsUniqueIdentifier: <var>ERRORID</var>;'
    

Para determinar se esses problemas são causados pela configuração do VPC Service Controls, faça o seguinte:

  1. Identifique as configurações do Cloud Logging para o recurso que contém a configuração da CMEK. Um recurso pode ser um projeto, uma pasta ou uma organização. Se você criou buckets de registro com a CMEK ativada, selecione o recurso PROJETO.

    PROJETO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de executar o comando, substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.

    PASTA

    gcloud logging settings describe --folder=FOLDER_ID
    

    Antes de executar o comando, substitua FOLDER_ID pelo ID da pasta.

    ORGANIZAÇÃO

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    Antes de executar o comando, substitua ORGANIZATION_ID pelo ID da organização.

    O comando anterior vai retornar informações semelhantes às seguintes:

    kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    

    Para organizações e pastas, o seguinte campo também é retornado:

    kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
    

    O valor do campo kmsKeyName inclui o projeto do Google Cloud que armazena a chave.

  2. Determine se você precisa migrar contas de serviço:

    • Se o valor do campo kmsServiceAccountId tiver o prefixo service-, não será necessário migrar sua conta de serviço. Para informações sobre erros de configuração de CMEK, consulte a seção Resolver problemas de CMEK deste documento.

    • Se o valor de kmsServiceAccountId tiver o prefixo cmek-, siga para a próxima etapa.

  3. Confirme se você precisa migrar as contas de serviço desativando o compartilhamento restrito de domínio ou removendo o Cloud Key Management Service da lista de serviços restritos do VPC Service Controls.

    Se os erros forem resolvidos, migre os recursos afetados para uma nova conta de serviço para resolver as falhas. Para saber mais sobre essas etapas, consulte a próxima seção.

Migrar contas de serviço CMEK

O processo a seguir descreve como alterar a conta de serviço que o Cloud Logging usa para acessar as chaves configuradas do Cloud Key Management Service. A alteração na conta de serviço resolve um problema conhecido com o VPC Service Controls e o compartilhamento restrito de domínio.

  1. Identifique o loggingServiceAccountId do recurso. Um recurso pode ser um projeto, uma pasta ou uma organização. Se você criou buckets de registro com a CMEK ativada, selecione o recurso PROJETO.

    PROJETO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de executar o comando, substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.

    PASTA

    gcloud logging settings describe --folder=FOLDER_ID
    

    Antes de executar o comando, substitua FOLDER_ID pelo ID da pasta.

    ORGANIZAÇÃO

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    Antes de executar o comando, substitua ORGANIZATION_ID pelo ID da organização.

    O comando anterior vai retornar informações semelhantes às seguintes:

    kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    

    Para organizações e pastas, o seguinte campo também é retornado:

    kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
    

    O valor do campo kmsKeyName inclui o projeto do Google Cloud que armazena a chave.

  2. Se você tiver definido uma configuração de recurso padrão para sua organização ou para pastas, faça o seguinte:

    1. Em KMS_PROJECT_ID, conceda o papel Criptografador/Descriptografador de CryptoKey do Cloud Key Management Service à conta de serviço identificada pelo campo loggingServiceAccountId.

    2. Execute o seguinte comando curl, que altera a conta de serviço do Cloud Key Management Service usada pelo recurso.

      PROJETO

      Não relevante.

      PASTA

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/folders/FOLDER_ID/settings?updateMask=kmsServiceAccountId
      

      Antes de executar o comando, faça o seguinte:

      • Substitua FOLDER_ID pelo ID da pasta.
      • Substitua SERVICE_ACCT_NAME pelo loggingServiceAccountId identificado anteriormente.

      ORGANIZAÇÃO

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/settings?updateMask=kmsServiceAccountId
      

      Antes de executar o comando, faça o seguinte:

      • Substitua ORGANIZATION_ID pelo ID da organização.
      • Substitua SERVICE_ACCT_NAME pelo loggingServiceAccountId identificado anteriormente.

      O resultado do comando anterior será semelhante ao seguinte:

      {
        "name": ".../settings",
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY",
        "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com",
        "storageLocation": "...",
        "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"
      }
      
  3. Para cada projeto ou pasta do Google Cloud que contém buckets de registros ativados com CMEK, faça o seguinte:

    1. No projeto ou na pasta, para cada bucket de registros ativado com a CMEK, faça o seguinte:

      1. Identifique o projeto do Google Cloud que armazena a chave do Cloud Key Management Service:

        PROJETO

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
        

        Antes de executar o comando, faça o seguinte:

        • Substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.
        • Substitua LOCATION pela localização do bucket de registros.

        PASTA

        gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
        

        Antes de executar o comando, faça o seguinte:

        • Substitua FOLDER_ID pelo ID da pasta.
        • Substitua LOCATION pela localização do bucket de registros.

        O resultado do comando anterior será semelhante a este:

        cmekSettings:
          kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
          kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1
          serviceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
        createTime: '2022-10-31T12:00:00.0000000Z'
        lifecycleState: ACTIVE
        name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID
        retentionDays: 30
        createTime: '2022-10-31T13:00:00.0000000Z'
        
      2. Acesse o projeto do Google Cloud que tem a chave do Cloud Key Management Service, KMS_PROJECT_ID, e conceda o papel de criptografador/descriptografador de CryptoKey do Cloud Key Management Service à conta de serviço identificada pelo campo loggingServiceAccountId.

    2. Para o projeto, execute o seguinte comando curl, que altera a conta de serviço do Cloud Key Management Service:

      PROJETO

      curl -X PATCH -H "Authorization: Bearer \"$(gcloud auth print-access-token)\"" -H "Content-Type: application/json; charset=utf-8" -d '{"kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"}' https://logging.googleapis.com/v2/projects/PROJECT_ID/settings?updateMask=kmsServiceAccountId
      

      Antes de executar o comando, faça o seguinte:

      • Substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.
      • Substitua SERVICE_ACCT_NAME pelo loggingServiceAccountId identificado anteriormente.

      PASTA

      Nenhuma ação é necessária, já que você alterou a conta de serviço do Cloud Key Management Service usada pela pasta em uma etapa anterior.

      O resultado do comando anterior será semelhante ao seguinte:

      {
        "name": ".../settings",
        "kmsServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com",
        "loggingServiceAccountId": "SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com"
      }
      
  4. Para cada bucket de registros com a CMEK ativada, faça o seguinte:

    1. Alterne a chave do Cloud KMS.

    2. Confirme a migração. O recurso pai do bucket de registros determina qual comando da Google Cloud CLI será executado. O pai pode ser um projeto, uma pasta ou uma organização.

      PROJETO

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=PROJECT_ID
      

      Antes de executar o comando, faça o seguinte:

      • Substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.
      • Substitua LOCATION pela localização do bucket de registros.

      PASTA

      gcloud logging buckets describe BUCKET_ID --location=LOCATION --folder=FOLDER_ID
      

      Antes de executar o comando, faça o seguinte:

      • Substitua FOLDER_ID pelo ID da pasta.
      • Substitua LOCATION pela localização do bucket de registros.

      Em um projeto, o resultado do comando anterior será semelhante ao seguinte:

      cmekSettings:
        kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
        kmsKeyVersionName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/1
        serviceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
      createTime: '2022-10-31T12:00:00.0000000Z'
      lifecycleState: ACTIVE
      name: projects/PROJECT_ID/locations/LOCATION/buckets/BUCKET_ID
      retentionDays: 30
      createTime: '2022-10-31T13:00:00.0000000Z'
      

      Verifique se serviceAccountId corresponde ao loggingServiceAccountId identificado anteriormente.

  5. Aguarde pelo menos 30 minutos antes de revogar permissões na conta de serviço anterior. Se você tiver algum problema após revogar as permissões da conta de serviço anterior, restaure as permissões e entre em contato com o suporte do Cloud.

Resolver problemas da CMEK

À medida que você configura a CMEK, o projeto do Google Cloud que contém a chave do Cloud KMS é notificado sobre problemas relacionados. Por exemplo, as atualizações falham quando o KMS_KEY_NAME é inválido, quando a conta de serviço associada não tem o papel necessário de Criptografador/Descriptografador de CryptoKey do Cloud Key Management Service ou quando o acesso à chave está desativado.

Depois de configurar a CMEK, pelo menos uma das seguintes situações vai ocorrer:

  • Você recebeu uma notificação do Cloud Logging sobre problemas de acesso à CMEK.

  • Você percebe que a CMEK não está ativada para os buckets de registros _Default e _Required quando você cria novos projetos do Google Cloud na sua organização ou em uma pasta.

  • Você recebe erros ao ler buckets de registros com a CMEK ativada ou ao tentar criar ou atualizar buckets de registros.

A notificação fornece informações sobre a falha e contém o que você pode tomar para atenuar o problema:

Erro Recomendação
Permissão de chave criptográfica negada

A conta de serviço do Logging associada ao seu projeto do Google Cloud não tem permissões do IAM suficientes para operar na chave do Cloud KMS especificada. Siga as instruções do erro ou consulte os seguintes documentos:

A chave criptográfica está desativada A chave do Cloud KMS especificada foi desativada. Siga as instruções no erro para reativar a chave.
A chave criptográfica foi destruída

A chave do Cloud KMS especificada foi destruída. Siga as instruções ou consulte os seguintes documentos:

Identifique o projeto que contém a chave do Cloud KMS

Para identificar o ID do projeto do Google Cloud que contém a chave de criptografia usada por um bucket de registros, uma pasta ou uma organização, faça o seguinte:

PROJETO

gcloud logging settings describe --project=PROJECT_ID

Antes de executar o comando, substitua PROJECT_ID pelo ID do projeto que contém o bucket de registros.

PASTA

gcloud logging settings describe --folder=FOLDER_ID

Antes de executar o comando, substitua FOLDER_ID pelo ID da pasta.

ORGANIZAÇÃO

gcloud logging settings describe --organization=ORGANIZATION_ID

Antes de executar o comando, substitua ORGANIZATION_ID pelo ID da organização.

O comando anterior vai retornar informações semelhantes às seguintes:

kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com

Para organizações e pastas, o seguinte campo também é retornado:

kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY

O valor do campo kmsKeyName inclui o projeto do Google Cloud que armazena a chave.

Verificar a usabilidade de chaves

Para verificar a usabilidade da chave, execute o seguinte comando para listar todas as chaves:

gcloud kms keys list \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING

Esse comando retorna informações sobre cada chave em formato tabular. A primeira linha de saída é uma lista de nomes de coluna:

NAME PURPOSE ...

Verifique se a chave do Cloud KMS está listada na saída do comando como ENABLED, e se a finalidade da chave é a criptografia simétrica: a coluna PURPOSE precisa conter ENCRYPT_DECRYPT e a coluna PRIMARY_STATE precisa conter ENABLED.

Se necessário, crie uma nova chave.

Verificar a configuração das permissões

As contas de serviço associadas às configurações da CMEK da organização precisam ter o papel Criptografador/Descriptografador de CryptoKey do Cloud KMS para a chave configurada.

Para listar a política do IAM da chave, execute o seguinte comando :

gcloud kms keys get-iam-policy KMS_KEY_NAME

Se necessário, adicione à conta de serviço que contém o papel Criptografador/Descriptografador de CryptoKey do Cloud KMS para a chave.