Esta página describe cómo implementar el cifrado del lado del cliente en Cloud SQL.
Descripción general
El cifrado del lado del cliente consiste en cifrar los datos antes de escribirlos en Cloud SQL. Puede cifrar los datos de Cloud SQL de forma que solo su aplicación pueda descifrarlos.
Para habilitar el cifrado del lado del cliente, tiene las siguientes opciones:
- Usando una clave de cifrado almacenada en el Servicio de administración de claves en la nube (Cloud KMS).
- Usando una clave de cifrado almacenada localmente en su aplicación.
En este tema, describimos cómo usar la primera opción, que ofrece la gestión de claves más sencilla. Creamos una clave de cifrado en Cloud KMS e implementamos el cifrado de sobre con Tink , la biblioteca criptográfica de código abierto de Google.
¿Por qué necesita el cifrado del lado del cliente?
Necesita cifrado del lado del cliente si desea proteger los datos de Cloud SQL en el nivel de columna 1. Imagine que tiene una tabla con nombres y números de tarjetas de crédito. Quiere conceder acceso a un usuario a esta tabla, pero no quiere que vea los números de las tarjetas. Puede cifrar los números mediante cifrado del lado del cliente. Mientras el usuario no tenga acceso a la clave de cifrado en Cloud KMS, no podrá leer la información de la tarjeta de crédito.
Crear claves usando Cloud KMS
Cloud KMS le permite crear y administrar claves en Google Cloud Platform.
Cloud KMS admite distintos tipos de claves. Para el cifrado del lado del cliente, es necesario crear una clave simétrica .
Para que su aplicación acceda a la clave en Cloud KMS, debe otorgar a la cuenta de servicio que utiliza su aplicación el rol cloudkms.cryptoKeyEncrypterDecrypter
. En gcloud, use el siguiente comando para ello:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:[email protected] \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Si bien se puede usar la clave KMS para cifrar datos directamente, aquí utilizamos una solución más flexible llamada cifrado de sobre . Esto nos permite cifrar mensajes de más de 64 KB, el tamaño máximo que admite la API del Servicio de Administración de Claves en la Nube.
Cifrado de sobres de Cloud KMS
En el cifrado de sobre, la clave KMS actúa como una clave de cifrado de claves (KEK). Es decir, se utiliza para cifrar claves de cifrado de datos (DEK), que a su vez se utilizan para cifrar los datos reales.
Después de crear una KEK en Cloud KMS, para cifrar cada mensaje debes:
- Genere una clave de cifrado de datos (DEK) localmente.
- Utilice esta DEK localmente para cifrar el mensaje.
- Llame a Cloud KMS para cifrar (envolver) la DEK con la KEK.
- Almacene los datos cifrados y el DEK envuelto.
En lugar de implementar el cifrado de sobre desde cero, en este tema usamos Tink.
Tink
Tink es una biblioteca multiplataforma y multilenguaje que proporciona API criptográficas de alto nivel. Para cifrar datos con el cifrado de sobre de Tink, se proporciona a Tink una URI de clave que apunta a la KEK en Cloud KMS y las credenciales que permiten a Tink usar la KEK. Tink genera la DEK, cifra los datos, la encapsula y devuelve un texto cifrado único con los datos cifrados y la DEK encapsulada.
Tink admite el cifrado de sobres en C++, Java, Go y Python mediante la API 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 mensaje/texto cifrado, los métodos de cifrado y descifrado admiten datos asociados opcionales. Este argumento puede usarse para vincular el texto cifrado a un dato. Por ejemplo, supongamos que tiene una base de datos con los campos user-id
y " encrypted-medical-history
. En este caso, probablemente debería usarse el campo user-id
como dato asociado al cifrar el historial médico. Esto garantiza que un atacante no pueda transferir el historial médico de un usuario a otro. También se utiliza para verificar que la fila de datos sea correcta al ejecutar una consulta.
Muestras
En esta sección, analizaremos un código de ejemplo para una base de datos de información de votantes que utiliza cifrado del lado del cliente. El código de ejemplo muestra cómo:
- Crear una tabla de base de datos y un grupo de conexiones
- Configurar Tink para el cifrado de sobres
- Cifre y descifre datos utilizando el cifrado de sobre de Tink con una KEK en Cloud KMS
Antes de empezar
Cree una instancia de Cloud SQL siguiendo estas instrucciones . Anote la cadena de conexión, el usuario y la contraseña de la base de datos que creó.
Cree una base de datos para su aplicación siguiendo estas instrucciones . Anote el nombre de la base de datos.
Cree una clave KMS para su aplicación siguiendo estas instrucciones . Copie el nombre del recurso de la clave creada.
Cree una cuenta de servicio con los permisos de 'Cliente Cloud SQL' siguiendo estas instrucciones .
Agregue el permiso 'Cloud KMS CryptoKey Encrypter/Decrypter' para la clave de su cuenta de servicio siguiendo estas instrucciones .
Cree un grupo de conexiones y cree una nueva tabla en la base de datos.
Java
Pitón
Inicialice un primitivo AEAD de envolvente con Tink.
Java
Pitón
Cifrar datos e insertarlos en la base de datos.
Java
Pitón
Consultar la base de datos y descifrar los datos almacenados.
Java
Pitón
También puede restringir el acceso a nivel de instancia o base de datos . ↩