En este tema, se muestra una forma de usar Cloud Key Management Service para encriptar directamente los datos de la aplicación en un cliente antes de transmitirlos a través de una red.
En este ejemplo, los datos encriptados se transmiten a Google Cloud y se almacenan en un bucket de Cloud Storage. Cloud Storage también admite la encriptación automática del servidor con claves de encriptación administradas por el cliente, que automatiza todo el proceso. Para proteger los datos de la aplicación antes de transmitirlos a Google Cloud, te recomendamos que uses la biblioteca de Tink.
La biblioteca Tink es una multiplataforma de varios lenguajes que proporciona API simples y a prueba de uso inadecuado para tareas criptográficas comunes. Puede usarse para encriptar datos antes de ingresar a los almacenes de datos de Google Cloud y es compatible con Java, Python, C++, Go, Objective-C y otros lenguajes, y con servicios de almacenamiento de objetos y base de datos relacional.
En esta explicación, encriptarás un archivo con Cloud KMS antes de subirlo a un bucket. A continuación, descarga y desencripta los mismos datos para poder leerlos en el cliente.
Cuando sigas estas instrucciones, tus claves y todas las operaciones criptográficas permanecerán en Google Cloud y deberás usar Cloud KMS para la desencriptación. La encriptación simétrica sin procesar te permite encriptar o desencriptar datos de forma local o trasladar datos encriptados entre diferentes bibliotecas y proveedores de servicios sin tener que desencriptarlos primero.
Antes de comenzar
Dentro de tu organización de Google Cloud, necesitas permiso para crear proyectos nuevos y habilitar la facturación, crear usuarios y administrar permisos dentro de estos proyectos. La función roles/resourcemanager.organizationAdmin
otorga este permiso.
Configuración
Recomendamos usar dos proyectos y dos usuarios para garantizar la separación de obligaciones. Si sigues los pasos de este tema, los usuarios y servicios que administran las claves de encriptación son distintos de los usuarios y servicios que los usan. Un proyecto contiene y administra las claves, y el otro almacena los datos encriptados en un bucket de Cloud Storage y los desencripta según sea necesario.
Crea proyectos
Los proyectos se crean en la consola de Google Cloud. Para obtener instrucciones paso a paso, consulta la Guía de inicio rápido de administración de identidades y accesos.
Dentro de la organización:
Crea un proyecto de Google Cloud para contener el bucket de Cloud Storage que se usa a fin de almacenar los secretos. Estos se almacenarán como objetos en el bucket. En los siguientes pasos, este proyecto se denomina my-storage-project.
De manera opcional, crea un segundo proyecto de Google Cloud a fin de administrar las claves de Cloud KMS que se usan para encriptar y desencriptar el secreto. En los siguientes pasos, este proyecto se llama my-kms-project.
Puedes elegir usar el mismo proyecto de Google Cloud para my-storage-project y my-kms-project.
Para cada proyecto, habilita la API de Cloud KMS y habilita la facturación; para ello, sigue los pasos de la sección Antes de comenzar de la guía de inicio rápido de Cloud KMS.
Crear usuarios
Crea usuarios y otórgales roles en la consola de Google Cloud. Para obtener instrucciones paso a paso, consulta la Guía de inicio rápido de administración de identidades y accesos.
Este procedimiento crea dos usuarios. key-admin administra las claves de encriptación y key-user puede encriptar y desencriptar datos con las claves.
Realiza este procedimiento en el proyecto my-kms-project.
Crea el usuario
key-admin
: Para crear usuarios, necesitas la funciónroles/resourcemanager.organizationAdmin
para el proyecto my-kms-project.Otorga a
key-admin
la función de administración de identidades y accesosroles/cloudkms.admin
.key-admin
puede crear y administrar claves.Crea el usuario
key-user
:Otorga a
key-user
la función de IAMroles/cloudkms.cryptoKeyEncrypterDecrypter
.key-user
puede usar claves para encriptar y desencriptar datos.
Cree un bucket de almacenamiento.
Realiza este procedimiento en el proyecto my-storage-project
.
- Crea un bucket de almacenamiento llamado
my-bucket
. - Otorga a key-user la función
roles/storage.objectAdmin
para el depósito de almacenamiento my-bucket.
Crea una clave de encriptación
Realiza este procedimiento como el usuario key-admin
en el proyecto my-kms-project.
Crea un llavero de claves llamado storage. El nombre de un llavero de claves es único para el proyecto. El llavero de claves no se puede renombrar ni borrar. Usa el Google Cloud CLI para crear un llavero de claves.
gcloud kms keyrings create storage \ --location global
Crea una clave llamada my-key en el llavero de claves storage para la encriptación. El nombre de una clave es único para el llavero de claves. Una clave no se puede renombrar ni borrar, pero sus versiones de clave se pueden destruir. Usa Google Cloud CLI para crear la clave. Una versión de clave inicial se crea automáticamente y se convierte en la versión principal.
gcloud kms keys create my-key \ --location global \ --keyring storage \ --purpose encryption
Obtén más información para crear claves y llaveros de claves.
Encripta el archivo que contiene el secreto
Realiza este procedimiento como el usuario key-user mediante el uso de ambos proyectos.
En tu máquina local, crea un archivo llamado my-secret.txt que contenga el texto "Este es mi secreto".
echo "This is my secret" > my-secret.txt
Encripta my-secret.txt con la clave my-key en
my-kms-project
proyecto. Escribe el archivo encriptado en mysecret.txt.encrypted.gcloud kms encrypt \ --location global \ --keyring storage \ --key my-key \ --plaintext-file my-secret.txt \ --ciphertext-file my-secret.txt.encrypted
Puedes obtener más información sobre la encriptación de datos siguiendo el guía de inicio rápido para encriptar datos.
En su lugar, usa
raw-encrypt
para la encriptación simétrica sin procesar.Sube el archivo my-secret.txt.encrypted encriptado al bucket de almacenamiento my-bucket en el proyecto my-storage-project. Puedes usar el siguiente comando de la CLI de gcloud:
gcloud storage cp my-secret.txt.encrypted gs://my-storage-bucket
Puedes obtener más información para subir objetos a un bucket de almacenamiento.
[Opcional] Borra el archivo my-secret.txt de texto simple de la máquina local. Esta es una buena práctica para los archivos que contienen datos sensibles sin encriptar.
El bucket de almacenamiento my-storage-bucket ahora contiene el archivo my-secret.txt.encrypted, que se encripta con la clave my-key.
Desencripta el archivo que contiene el secreto
Realiza estos pasos como el usuario key-user mediante el uso de ambos proyectos.
Descarga el archivo my-secret.txt.encrypted del bucket de almacenamiento my-bucket. Puedes usar el siguiente comando de la CLI de gcloud:
gcloud storage cp gs://my-storage-bucket/my-secret.txt.encrypted .
Puedes obtener más información sobre la descarga de objetos de un bucket de almacenamiento.
Intenta leer el archivo con un comando como
less
o un editor de texto. Ten en cuenta que no es un archivo de texto sin formato.Desencripta my-secret.txt.encrypted y guarda los datos desencriptados en un nuevo archivo de texto simple llamado my-secret.txt.decrypted, con la misma clave que usaste para encriptar my-secret.txt.
gcloud kms decrypt --location global \ --keyring storage \ --key my-key \ --ciphertext-file my-secret.txt.encrypted \ --plaintext-file my-secret.txt.decrypted
Para obtener más información sobre cómo desencriptar datos, sigue guía de inicio rápido para encriptar datos.
En su lugar, usa
raw-decrypt
para la encriptación simétrica sin procesar.Lee el archivo my-secret.txt.decrypted con el comando
cat
. Su contenido es idéntico al contenido original de my-secret.txt.cat my-secret.txt.decrypted
This is my secret.
Borra los archivos my-secret.txt.encrypted y my-secret.txt.decrypted de la máquina local (opcional).
Limpia
Para realizar una limpieza, borra todos los archivos que creaste en la máquina local. Luego, borra los proyectos [MY_KMS_PROJECT]
y [MY_STORAGE_PROJECT]
.
¿Qué sigue?
- Lee más sobre la administración secreta.
- Obtén información sobre la separación de obligaciones.
- Obtén información sobre cómo otorgar, cambiar y revocar el acceso a los recursos.
- Obtén información sobre cómo crear una cuenta de servicio.