Encripta datos de aplicaciones

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 mediante 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, debes descargar y desencriptar los mismos datos para poder leerlos en el cliente.

Si sigues 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 a nivel local o mover 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:

  1. 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.

  2. 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.

  3. 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 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.

  1. Crea el usuario key-admin: Para crear usuarios, necesitas la función roles/resourcemanager.organizationAdmin para el proyecto my-kms-project.

  2. Otorga a key-admin la función de administración de identidades y accesos roles/cloudkms.admin. key-admin puede crear y administrar claves.

  3. Crea el usuario key-user:

  4. Otorga a key-user la función de IAM roles/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.

  1. Crea un bucket de almacenamiento llamado my-bucket.
  2. Otorga a key-user la función roles/storage.objectAdmin para el bucket de almacenamiento my-bucket.

Crea una clave de encriptación

Realiza este procedimiento como el usuario key-admin en el proyecto my-kms-project.

  1. 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 Google Cloud CLI para crear un llavero de claves.

    gcloud kms keyrings create storage \
      --location global
    
  2. 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 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.

  1. 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
    
  2. 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
    

    A fin de obtener más información sobre cómo encriptar datos, sigue la guía de inicio rápido para encriptar.

    En su lugar, usa raw-encrypt para la encriptación simétrica sin procesar.

  3. Sube el archivo my-secret.txt.encrypted encriptado al bucket 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
    

    Obtén más información para subir objetos a un bucket de almacenamiento.

  4. [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 ambos proyectos.

  1. Descarga el archivo my-secret.txt.encrypted del bucket de almacenamiento my-bucket. Puedes usar el comando gsutil.

    gsutil cp gs://my-storage-bucket/my-secret.txt.encrypted .
    

    Obtén más información para descargar objetos de un bucket de almacenamiento.

  2. 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.

  3. 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.

  4. 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.
  5. Borra los archivos my-secret.txt.encrypted y my-secret.txt.decrypted de la máquina local (opcional).

Realice una limpieza

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?