Soluciona problemas de CMEK y errores de configuración predeterminada

En este documento, se describe cómo encontrar y mitigar errores comunes de configuración de CMEK y cómo identificar errores que ocurren cuando se establece la ubicación predeterminada de los recursos.

Soluciona problemas relacionados con la configuración de la ubicación predeterminada de los recursos

Intentas actualizar la ubicación de almacenamiento predeterminada para una organización o carpeta, pero el comando falla con un error similar al siguiente:

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 este error, configura la ubicación de almacenamiento predeterminada de la organización o carpeta para que coincida con la ubicación de la clave de Cloud Key Management Service de la organización o carpeta.

Soluciona problemas de los Controles del servicio de VPC y el uso compartido restringido al dominio

Configuraste CMEK como un parámetro de configuración de recursos predeterminado para tu organización o una carpeta o creaste un bucket de registros con CMEK habilitadas. Luego, configurarás los Controles del servicio de VPC. Después de configurar los Controles del servicio de VPC, puedes restringir el acceso a Cloud Key Management Service en los Controles del servicio de VPC o habilitar el uso compartido restringido al dominio.

Ocurre al menos una de las siguientes situaciones:

  • Recibiste una notificación de Cloud Logging sobre los problemas de acceso a CMEK.

  • Notas que las CMEK no están habilitadas para los buckets de registro _Default y _Required cuando creas proyectos de Google Cloud nuevos en tu organización o en una carpeta.

  • Recibes errores cuando lees de buckets de registros con CMEK habilitadas. Los errores que ves son similares al siguiente:

    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`
    
  • Recibes errores cuando creas o actualizas buckets de registros con CMEK habilitadas. Los errores que ves son similares al siguiente:

    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 si estos problemas se deben a la configuración de los Controles del servicio de VPC, haz lo siguiente:

  1. Identifica la configuración de Cloud Logging para el recurso que contiene la configuración de CMEK. Un recurso puede ser un proyecto, una carpeta o una organización. Si creaste buckets de registros con CMEK habilitadas, selecciona el recurso PROJECT.

    PROYECTO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de ejecutar el comando, reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.

    CARPETA

    gcloud logging settings describe --folder=FOLDER_ID
    

    Antes de ejecutar el comando, reemplaza FOLDER_ID por el ID de la carpeta.

    ORGANIZACIÓN

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    Antes de ejecutar el comando, reemplaza ORGANIZATION_ID por el ID de la organización.

    El comando anterior muestra información similar a la siguiente:

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

    Para las organizaciones y carpetas, también se muestra el siguiente campo:

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

    El valor del campo kmsKeyName incluye el proyecto de Google Cloud que almacena la clave.

  2. Determina si necesitas migrar cuentas de servicio:

    • Si el valor del campo kmsServiceAccountId tiene el prefijo service-, no necesitas migrar tu cuenta de servicio. Para obtener información sobre los errores de configuración de CMEK, consulta la sección Soluciona problemas de CMEK de este documento.

    • Si el valor de kmsServiceAccountId tiene el prefijo cmek-, continúa con el siguiente paso.

  3. Para confirmar que debes migrar las cuentas de servicio, inhabilita el uso compartido restringido del dominio o quita Cloud Key Management Service de la lista de servicios restringidos de los Controles del servicio de VPC.

    Si se resuelven los errores, para resolverlos, debes migrar los recursos afectados a una cuenta de servicio nueva. Para obtener más información sobre estos pasos, consulta la siguiente sección.

Migra cuentas de servicio de CMEK

En el siguiente proceso, se describe cómo cambiar la cuenta de servicio que usa Cloud Logging para acceder a las claves configuradas de Cloud Key Management Service. El cambio en la cuenta de servicio resuelve un problema conocido con los Controles del servicio de VPC y el uso compartido restringido al dominio.

  1. Identifica el loggingServiceAccountId para tu recurso. Un recurso puede ser un proyecto, una carpeta o una organización. Si creaste buckets de registros con CMEK habilitadas, selecciona el recurso PROJECT.

    PROYECTO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de ejecutar el comando, reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.

    CARPETA

    gcloud logging settings describe --folder=FOLDER_ID
    

    Antes de ejecutar el comando, reemplaza FOLDER_ID por el ID de la carpeta.

    ORGANIZACIÓN

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

    Antes de ejecutar el comando, reemplaza ORGANIZATION_ID por el ID de la organización.

    El comando anterior muestra información similar a la siguiente:

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

    Para las organizaciones y carpetas, también se muestra el siguiente campo:

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

    El valor del campo kmsKeyName incluye el proyecto de Google Cloud que almacena la clave.

  2. Si configuraste una configuración de recursos predeterminada para tu organización o para las carpetas, haz lo siguiente:

    1. En KMS_PROJECT_ID, otorga la función Encriptador/Desencriptador de CryptoKey de Cloud Key Management Service a la cuenta de servicio que identifica el campo loggingServiceAccountId.

    2. Ejecuta el siguiente comando curl, que cambia la cuenta de servicio de Cloud Key Management Service que usa el recurso.

      PROYECTO

      No aplicable

      CARPETA

      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 ejecutar el comando, haz lo siguiente:

      • Reemplaza FOLDER_ID por el ID de la carpeta.
      • Reemplaza SERVICE_ACCT_NAME por el loggingServiceAccountId que identificaste antes.

      ORGANIZACIÓN

      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 ejecutar el comando, haz lo siguiente:

      • Reemplaza ORGANIZATION_ID por el ID de la organización.
      • Reemplaza SERVICE_ACCT_NAME por el loggingServiceAccountId que identificaste antes.

      El resultado del comando anterior es similar al siguiente:

      {
        "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 proyecto o carpeta de Google Cloud que contenga buckets de registros existentes habilitados con CMEK, haz lo siguiente:

    1. En el proyecto o la carpeta, haz lo siguiente para cada bucket de registros habilitado con CMEK:

      1. Identifica el proyecto de Google Cloud que almacena la clave de Cloud Key Management Service:

        PROYECTO

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

        Antes de ejecutar el comando, haz lo siguiente:

        • Reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.
        • Reemplaza LOCATION por la ubicación del bucket de registros.

        CARPETA

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

        Antes de ejecutar el comando, haz lo siguiente:

        • Reemplaza FOLDER_ID por el ID de la carpeta.
        • Reemplaza LOCATION por la ubicación del bucket de registros.

        El resultado del comando anterior es similar al siguiente:

        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. Ve al proyecto de Google Cloud que posee la clave de Cloud Key Management Service, KMS_PROJECT_ID, y otorga el rol Encriptador/Desencriptador de CryptoKey de Cloud Key Management Service a la cuenta de servicio identificada en el campo loggingServiceAccountId.

    2. Para el proyecto, ejecuta el siguiente comando curl, que cambia la cuenta de servicio de Cloud Key Management Service:

      PROYECTO

      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 ejecutar el comando, haz lo siguiente:

      • Reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.
      • Reemplaza SERVICE_ACCT_NAME por el loggingServiceAccountId que identificaste antes.

      CARPETA

      No es necesario realizar ninguna acción, ya que cambiaste la cuenta de servicio de Cloud Key Management Service que usa la carpeta en un paso anterior.

      El resultado del comando anterior es similar al siguiente:

      {
        "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 con CMEK habilitadas, haz lo siguiente:

    1. Rota la clave de Cloud KMS.

    2. Confirma la migración. El recurso superior del bucket de registros determina qué comando de Google Cloud CLI se debe ejecutar. El superior puede ser un proyecto, una carpeta o una organización.

      PROYECTO

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

      Antes de ejecutar el comando, haz lo siguiente:

      • Reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.
      • Reemplaza LOCATION por la ubicación del bucket de registros.

      CARPETA

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

      Antes de ejecutar el comando, haz lo siguiente:

      • Reemplaza FOLDER_ID por el ID de la carpeta.
      • Reemplaza LOCATION por la ubicación del bucket de registros.

      Para un proyecto, el resultado del comando anterior es similar al siguiente:

      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'
      

      Asegúrate de que serviceAccountId coincida con el loggingServiceAccountId identificado anteriormente.

  5. Espera al menos 30 minutos antes de revocar permisos en la cuenta de servicio anterior. Si experimentas algún problema después de revocar permisos en la cuenta de servicio anterior, restablece los permisos y comunícate con la asistencia de Cloud.

Soluciona problemas de CMEK

Cuando configuras CMEK, el proyecto de Google Cloud que contiene la clave de Cloud KMS recibe notificaciones de los problemas relacionados. Por ejemplo, las actualizaciones fallan cuando KMS_KEY_NAME no es válido, cuando la cuenta de servicio asociada no tiene la función requerida de encriptador/desencriptador de CryptoKey de Cloud Key Management Service o cuando el acceso a la clave está inhabilitado.

Después de configurar las CMEK, ocurre al menos una de las siguientes situaciones:

  • Recibiste una notificación de Cloud Logging sobre los problemas de acceso a CMEK.

  • Notas que las CMEK no están habilitadas para los buckets de registro _Default y _Required cuando creas proyectos de Google Cloud nuevos en tu organización o en una carpeta.

  • Recibes errores cuando lees de buckets de registros con CMEK habilitadas o si intentas crear o actualizar buckets de registros.

La notificación proporciona información sobre la falla y que puedes tomar para mitigar el problema:

Error Recomendación
Se denegó el permiso para usar claves criptográficas

La cuenta de servicio de Logging asociada con tu proyecto de Google Cloud no tiene suficientes permisos de IAM para operar en la clave de Cloud KMS especificada. Sigue las instrucciones del error o consulta los siguientes documentos:

La clave criptográfica está inhabilitada Se inhabilitó la clave de Cloud KMS especificada. Sigue las instrucciones del error para volver a habilitar la clave.
Se destruyó la clave criptográfica

Se destruyó la clave de Cloud KMS especificada. Sigue las instrucciones o consulta los siguientes documentos:

Identifica el proyecto que contiene la clave de Cloud KMS

Para identificar el ID del proyecto de Google Cloud que contiene la clave de encriptación que usa un bucket de registros, una carpeta o una organización, haz lo siguiente:

PROYECTO

gcloud logging settings describe --project=PROJECT_ID

Antes de ejecutar el comando, reemplaza PROJECT_ID por el ID del proyecto que contiene el bucket de registros.

CARPETA

gcloud logging settings describe --folder=FOLDER_ID

Antes de ejecutar el comando, reemplaza FOLDER_ID por el ID de la carpeta.

ORGANIZACIÓN

gcloud logging settings describe --organization=ORGANIZATION_ID

Antes de ejecutar el comando, reemplaza ORGANIZATION_ID por el ID de la organización.

El comando anterior muestra información similar a la siguiente:

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

Para las organizaciones y carpetas, también se muestra el siguiente campo:

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

El valor del campo kmsKeyName incluye el proyecto de Google Cloud que almacena la clave.

Verifica la usabilidad de la clave

Si deseas verificar la usabilidad de la clave, ejecuta el siguiente comando para enumerar todas las claves:

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

Este comando muestra información sobre cada clave en formato tabular. La primera línea del resultado es una lista de nombres de columnas:

NAME PURPOSE ...

Verifica que la clave de Cloud KMS aparezca en el resultado del comando como ENABLED y que el propósito de la clave sea la encriptación simétrica: la columna PURPOSE debe contener ENCRYPT_DECRYPT y la columna PRIMARY_STATE debe contener ENABLED.

Si es necesario, crea una clave nueva.

Verifica la configuración de los permisos

Las cuentas de servicio que están asociadas a la configuración de CMEK de la organización deben tener la función Encriptador/Desencriptador de CryptoKey de Cloud KMS para la clave configurada.

Para enumerar la política de IAM de la clave, ejecuta el siguiente comando:

gcloud kms keys get-iam-policy KMS_KEY_NAME

Si es necesario, agrega la cuenta de servicio que contiene la función Encriptador/Desencriptador de CryptoKey de Cloud KMS a la clave.