Solucionar errores de CMEK y de configuración predeterminada

En este documento se describe cómo encontrar y mitigar los errores de configuración de CMEK habituales, así como identificar los errores que se producen al definir la ubicación de recursos predeterminada.

Solucionar problemas al definir la ubicación de recurso predeterminada

Intentas actualizar la ubicación de almacenamiento predeterminada de una organización o una carpeta, pero el comando falla y se muestra 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 solucionar este error, define la ubicación de almacenamiento predeterminada de la organización o la carpeta de forma que coincida con la ubicación de la clave de Cloud Key Management Service de la organización o la carpeta.

Solucionar problemas de Controles de Servicio de VPC y del uso compartido restringido al dominio

Has configurado CMEK como ajuste de recurso predeterminado para tu organización o para una carpeta, o bien has creado un contenedor de registro con CMEK habilitado. A continuación, configura Controles de Servicio de VPC. Después de configurar Controles de Servicio de VPC, puedes restringir el acceso a Cloud Key Management Service en Controles de Servicio de VPC o habilitar el uso compartido restringido al dominio.

Se produce al menos una de las siguientes situaciones:

  • Has recibido una notificación de Cloud Logging sobre problemas de acceso a CMEK.

  • Observas que CMEK no está habilitado en los contenedores de registros _Default y _Required cuando creas proyectos Google Cloud nuevos en tu organización o en una carpeta.

  • Recibes errores al leer de los cubos de registro con CMEK habilitada. 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 al crear o actualizar cubos de registro con CMEK habilitada. 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 Controles de Servicio de VPC, haz lo siguiente:

  1. Identifica la configuración de Cloud Logging del recurso que contiene la configuración de CMEK. Un recurso puede ser un proyecto, una carpeta o una organización. Si has creado contenedores de registro con CMEK habilitado, selecciona el recurso PROJECT.

    PROYECTO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de ejecutar el comando, sustituye PROJECT_ID por el ID del proyecto que contiene el bucket de registro.

    FOLDER

    gcloud logging settings describe --folder=FOLDER_ID
    

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

    ORGANIZACIÓN

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

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

    El comando anterior devuelve 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
    

    En el caso de las organizaciones y las carpetas, también se devuelve el siguiente campo:

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

    El valor del campo kmsKeyName incluye el proyecto 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 es necesario que migres tu cuenta de servicio. Para obtener información sobre los errores de configuración de CMEK, consulta la sección Solucionar problemas de CMEK de este documento.

    • Si el valor de kmsServiceAccountId tiene el prefijo cmek-, vaya al paso siguiente.

  3. Confirma que debes migrar las cuentas de servicio inhabilitando la función de compartir restringido al dominio o quitando Cloud Key Management Service de la lista de servicios restringidos de Controles de Servicio de VPC.

    Si los errores se resuelven, para solucionar los fallos, debe migrar los recursos afectados a una nueva cuenta de servicio. Para obtener información sobre estos pasos, consulta la siguiente sección.

Migrar 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 de Cloud Key Management Service configuradas. El cambio en la cuenta de servicio resuelve un problema conocido con Controles de Servicio de VPC y el uso compartido restringido al dominio.

  1. Identifica el loggingServiceAccountId de tu recurso. Un recurso puede ser un proyecto, una carpeta o una organización. Si has creado contenedores de registro con CMEK habilitado, selecciona el recurso PROJECT.

    PROYECTO

    gcloud logging settings describe --project=PROJECT_ID
    

    Antes de ejecutar el comando, sustituye PROJECT_ID por el ID del proyecto que contiene el bucket de registro.

    FOLDER

    gcloud logging settings describe --folder=FOLDER_ID
    

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

    ORGANIZACIÓN

    gcloud logging settings describe --organization=ORGANIZATION_ID
    

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

    El comando anterior devuelve 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
    

    En el caso de las organizaciones y las carpetas, también se devuelve el siguiente campo:

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

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

  2. Si has configurado un ajuste de recurso predeterminado para tu organización o para carpetas, haz lo siguiente:

    1. En KMS_PROJECT_ID, asigna el rol Encargado del encriptado y desencriptado de la clave criptográfica de Cloud Key Management Service a la cuenta de servicio identificada por el campo loggingServiceAccountId.

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

      PROYECTO

      No aplicable

      FOLDER

      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:

      • Sustituye FOLDER_ID por el ID de la carpeta.
      • Sustituye SERVICE_ACCT_NAME por el loggingServiceAccountId que has identificado 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:

      • Sustituye ORGANIZATION_ID por el ID de la organización.
      • Sustituye SERVICE_ACCT_NAME por el loggingServiceAccountId que has identificado 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 Google Cloud proyecto o carpeta que contenga depósitos de registros con CMEK habilitada, haz lo siguiente:

    1. En el proyecto o la carpeta, haga lo siguiente para cada contenedor de registro en el que esté habilitada la CMEK:

      1. Identifica el Google Cloud proyecto 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:

        • Sustituye PROJECT_ID por el ID del proyecto que contiene el segmento de registro.
        • Sustituye LOCATION por la ubicación del contenedor de registro.

        FOLDER

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

        Antes de ejecutar el comando, haz lo siguiente:

        • Sustituye FOLDER_ID por el ID de la carpeta.
        • Sustituye LOCATION por la ubicación del contenedor de registro.

        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 Google Cloud proyecto propietario de la clave de Cloud Key Management ServiceKMS_PROJECT_ID y asigna el rol Encargado del encriptado y desencriptado de la clave criptográfica Cloud Key Management Service a la cuenta de servicio identificada por el campo loggingServiceAccountId.

    2. En 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:

      • Sustituye PROJECT_ID por el ID del proyecto que contiene el segmento de registro.
      • Sustituye SERVICE_ACCT_NAME por el loggingServiceAccountId que has identificado antes.

      FOLDER

      No es necesario que hagas nada, ya que has cambiado 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. En cada segmento de registro con CMEK habilitada, haz lo siguiente:

    1. Rota la clave de Cloud KMS.

    2. Confirma la migración. El recurso superior del segmento de registro determina qué comando de Google Cloud CLI se debe ejecutar. El elemento 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:

      • Sustituye PROJECT_ID por el ID del proyecto que contiene el segmento de registro.
      • Sustituye LOCATION por la ubicación del contenedor de registro.

      FOLDER

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

      Antes de ejecutar el comando, haz lo siguiente:

      • Sustituye FOLDER_ID por el ID de la carpeta.
      • Sustituye LOCATION por la ubicación del contenedor de registro.

      En 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 los permisos de la cuenta de servicio anterior. Si tienes algún problema después de revocar los permisos de la cuenta de servicio anterior, restaura los permisos y ponte en contacto con el equipo de Asistencia de Cloud.

Solucionar problemas de CMEK

Cuando configures la CMEK, se notificará al Google Cloud proyecto que contiene la clave de Cloud KMS si hay algún problema relacionado. Por ejemplo, las actualizaciones fallan cuando el KMS_KEY_NAME no es válido, cuando la cuenta de servicio asociada no tiene el rol Encriptador o Desencriptador de CryptoKey de Cloud Key Management Service necesario o cuando el acceso a la clave está inhabilitado.

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

  • Has recibido una notificación de Cloud Logging sobre problemas de acceso a CMEK.

  • Observas que CMEK no está habilitado en los contenedores de registros _Default y _Required cuando creas proyectos Google Cloud nuevos en tu organización o en una carpeta.

  • Recibes errores al leer de los cubos de registro con CMEK habilitada o si intentas crear o actualizar cubos de registro.

La notificación proporciona información sobre el error y contiene las medidas que puedes tomar para mitigar el problema:

Error Recomendación
Se ha denegado el permiso de clave criptográfica

La cuenta de servicio de Logging asociada a tu proyecto Google Cloud no tiene suficientes permisos de gestión de identidades y accesos para operar en la clave de Cloud KMS especificada. Sigue las instrucciones que se indican en el error o consulta los siguientes documentos:

La clave criptográfica se ha inhabilitado La clave de Cloud KMS especificada se ha inhabilitado. Sigue las instrucciones que se indican en el error para volver a habilitar la llave.
La clave criptográfica se ha eliminado

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

Identificar el proyecto que contiene la clave de Cloud KMS

Para identificar el ID del Google Cloud proyecto que contiene la clave de cifrado que usa un bucket de registro, una carpeta o una organización, sigue estos pasos:

PROYECTO

gcloud logging settings describe --project=PROJECT_ID

Antes de ejecutar el comando, sustituye PROJECT_ID por el ID del proyecto que contiene el bucket de registro.

FOLDER

gcloud logging settings describe --folder=FOLDER_ID

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

ORGANIZACIÓN

gcloud logging settings describe --organization=ORGANIZATION_ID

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

El comando anterior devuelve 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

En el caso de las organizaciones y las carpetas, también se devuelve el siguiente campo:

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

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

Verificar la usabilidad de la clave

Para verificar que la clave se puede usar, ejecuta el siguiente comando para enumerar todas las claves:

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

Este comando devuelve información sobre cada clave en formato tabular. La primera línea de la salida 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 su finalidad sea el cifrado simétrico: la columna PURPOSE debe contener ENCRYPT_DECRYPT y la columna PRIMARY_STATE debe contener ENABLED.

Si es necesario, crea una clave.

Verificar la configuración de permisos

Las cuentas de servicio asociadas a la configuración de CMEK de la organización deben tener el rol Encargado del encriptado y desencriptado de la clave criptográfica Cloud KMS de la clave configurada.

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

gcloud kms keys get-iam-policy KMS_KEY_NAME

Si es necesario, añade a la clave la cuenta de servicio que contenga el rol Encargado del encriptado y desencriptado de la clave criptográfica Cloud KMS.