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:
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.Determina si necesitas migrar cuentas de servicio:
Si el valor del campo
kmsServiceAccountId
tiene el prefijoservice-
, 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 prefijocmek-
, vaya al paso siguiente.
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.
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.Si has configurado un ajuste de recurso predeterminado para tu organización o para carpetas, haz lo siguiente:
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
.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" }
Para cada Google Cloud proyecto o carpeta que contenga depósitos de registros con CMEK habilitada, haz lo siguiente:
En el proyecto o la carpeta, haga lo siguiente para cada contenedor de registro en el que esté habilitada la CMEK:
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'
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
.
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" }
En cada segmento de registro con CMEK habilitada, haz lo siguiente:
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 elloggingServiceAccountId
identificado anteriormente.
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.