En esta página, se describe cómo implementar la encriptación del cliente en Cloud SQL.
Descripción general
La encriptación del cliente es el acto de encriptar datos antes de escribirlos en Cloud SQL. Puedes encriptar datos de Cloud SQL de una manera que solo tu aplicación pueda desencriptarlos.
Para habilitar la encriptación del cliente, tienes las siguientes opciones:
- Mediante una clave de encriptación almacenada en Cloud Key Management Service (Cloud KMS).
- Mediante una clave de encriptación almacenada de forma local en tu aplicación.
En este tema, se describe cómo usar la primera opción, que proporciona la opción de administración de claves sin interrupciones. Crearemos una clave de encriptación en Cloud KMS e implementaremos la encriptación de sobre mediante Tink, la biblioteca criptográfica de código abierto de Google.
¿Por qué necesitas la encriptación del cliente?
Necesitas la encriptación del cliente si deseas proteger los datos de Cloud SQL a nivel de las columnas 1. Imagina que tienes una tabla con nombres y números de tarjetas de crédito. Deseas otorgar a un usuario acceso a esta tabla, pero no quieres que vea los números de la tarjeta de crédito. Puedes encriptar los números con la encriptación del cliente. Siempre que el usuario no tenga acceso a la clave de encriptación en Cloud KMS, no podrá leer la información de la tarjeta de crédito.
Crea claves mediante Cloud KMS
Cloud KMS te permite crear y administrar claves en Google Cloud Platform.
Cloud KMS admite muchos tipos de claves diferentes. Para la encriptación del cliente, debes crear una clave simétrica.
Para otorgarle a tu aplicación acceso a la clave en Cloud KMS, debes otorgar a la cuenta de servicio que tu aplicación usa la función cloudkms.cryptoKeyEncrypterDecrypter
. En gcloud, usa el siguiente comando para hacer lo siguiente:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:service-account-name@example.domain.com \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Si bien puedes usar la clave de KMS para encriptar datos directamente, aquí usamos una solución más flexible llamada encriptación de sobre. Esto nos permite encriptar mensajes de más de 64 KB, que es el tamaño máximo de mensaje que admite la API de Cloud Key Management Service.
Encriptación de sobre de Cloud KMS
En la encriptación de sobre, la clave de KMS actúa como una clave de encriptación de claves (KEK). Es decir, se usa para encriptar las claves de encriptación de datos (DEK) que, a su vez, se usan a fin de encriptar datos reales.
Después de crear una KEK en Cloud KMS, para encriptar cada mensaje, debes hacer lo siguiente:
- Genera una clave de encriptación de datos (DEK) de manera local.
- Usa esta DEK de forma local para encriptar el mensaje.
- Llama a Cloud KMS para encriptar (unir) la DEK con la KEK.
- Almacena los datos encriptados y la DEK unida.
En este tema usamos Tink en lugar de implementar la encriptación de sobre desde cero.
Tink
Tink es una biblioteca multiplataforma y multilingüe que proporciona API criptográficas de alto nivel. Para encriptar datos con la encriptación de sobre de Tink, debes proporcionar Tink con un URI de clave que apunte a tu KEK en Cloud KMS y credenciales que permitan a Tink usar la KEK. Tink genera la DEK, encripta los datos, une la DEK y muestra un solo texto cifrado con los datos encriptados y la DEK unida.
Tink admite la encriptación de sobre en C++, Java, Go y Python mediante la API de AEAD:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
Además del argumento normal de mensajes/texto cifrado, los métodos de encriptación y desencriptación admiten datos asociados opcionales. Este argumento se puede usar para vincular el texto cifrado con un dato. Por ejemplo, supongamos que tienes una base de datos con un campo user-id
y un campo encrypted-medical-history
. En este caso, es probable que el campo user-id
se use como datos asociados al momento de encriptar los antecedentes médicos. Esto garantiza que un atacante no pueda mover los antecedentes médicos de un usuario a otro. También se usa para verificar que tienes la fila correcta de datos cuando ejecutas una consulta.
Muestras
En esta sección, revisaremos el código de muestra para una base de datos de información de votantes que usa la encriptación del cliente. En el código de muestra, se indica cómo realizar las siguientes acciones:
- Crear una tabla de base de datos y un grupo de conexiones
- Configurar Tink para la encriptación de sobre
- Encripta y desencripta datos con la encriptación de sobre de Tink con una KEK en Cloud KMS
Antes de comenzar
Crea una instancia de Cloud SQL con estas instrucciones. Ten en cuenta la string de conexión, el usuario de la base de datos y la contraseña de la base de datos que creas.
Sigue estas instrucciones a fin de crear una base de datos para tu aplicación. Toma nota del nombre de la base de datos.
Sigue estas instrucciones a fin de crear una clave de KMS para tu aplicación. Copia el nombre del recurso de la clave creada.
Crea una cuenta de servicio con los permisos de “Cliente de Cloud SQL” según estas instrucciones.
Agrega el permiso de “Encriptador/Desencriptador de CryptoKey de Cloud KMS” de la clave a tu cuenta de servicio mediante estas instrucciones.
Crea un grupo de conexiones y crea una tabla nueva en la base de datos.
Java
Python
Inicializa una primitiva de sobre AEAD con Tink.
Java
Python
Encripta datos e insértalos en la base de datos
Java
Python
Consulta la base de datos y desencripta los datos almacenados.
Java
Python
-
También puedes restringir el acceso a nivel de la instancia o de la base de datos. ↩