En este tema, se muestra una forma de usar Cloud Key Management Service para encriptar de forma directa 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 depósito de Cloud Storage. Cloud Storage también es compatible con la encriptación automática del lado del servidor mediante claves de encriptación administradas por el cliente, que automatizan todo este proceso. Para proteger los datos de la aplicación antes de transmitirlos a Google Cloud, te recomendamos que uses la biblioteca 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 este instructivo, encriptarás un archivo con Cloud KMS antes de subirlo a un depósito. Luego, descarga y desencripta los mismos datos para que puedas leerlos en el cliente.
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. 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 en este tema, los usuarios y los servicios que administran claves de encriptación son distintos de los usuarios y los servicios que usan. Un proyecto contiene y administra las claves, y el otro almacena los datos encriptados en un depósito de Cloud Storage y los desencripta según sea necesario.
Crea proyectos
Puedes crear proyectos en Google Cloud Console. 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 depósito 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 forma opcional, crea un segundo proyecto de Google Cloud para administrar las claves de Cloud KMS que se usan a fin de 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
Puedes crear usuarios y otorgarles funciones en Google Cloud Console. 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 deroles/cloudkms.admin
administración de identidades y accesos.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 depósito 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
del 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 la herramienta de línea de comandos de
gcloud
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 con el propósito de 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 la herramienta de línea de comandos de
gcloud
para crear la clave. Una versión de clave inicial se crea automáticamente y se convierte en la versión primaria.gcloud kms keys create my-key \ --location global \ --keyring storage \ --purpose encryption
Puedes obtener más información sobre cómo 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 el proyecto
my-kms-project
. 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 cómo encriptar datos en la guía de inicio rápido para encriptar.
Sube el archivo my-secret.txt.encrypted encriptado al depósito de almacenamiento my-bucket en el proyecto my-storage-project. Puedes usar el comando
gsutil
.gsutil cp my-secret.txt.encrypted gs://my-storage-bucket
Puedes obtener más información sobre cómo subir objetos a un depósito de almacenamiento.
[Opcional] Borra el archivo my-secret.txt de texto sin formato de la máquina local. Esta es una buena práctica para los archivos que contienen datos sensibles no encriptados.
El depósito 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 ambos proyectos.
Descarga el archivo my-secret.txt.encrypted del depósito de almacenamiento my-bucket. Puedes usar el comando
gsutil
.gsutil cp gs://my-storage-bucket/ my-secret.txt.encrypted
Puedes obtener más información sobre cómo descargar objetos desde un depósito 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.
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.
[Opcional] Borra los archivos my-secret.txt.encrypted y my-secret.txt.decrypted de la máquina local.
Limpia
Para limpiar, borra todos los archivos que creaste en la máquina local y 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 miembros de proyecto.
- Obtén información sobre cómo crear una cuenta de servicio.