Encripta datos de aplicaciones

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 bucket de Cloud Storage. Cloud Storage también admite encriptación automática del lado del servidor con claves de encriptación administradas por el cliente, que automatiza 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 esta explicación, debes encriptar 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.

Antes de comenzar

Dentro de tu organización de Google Cloud, necesitas permiso para crear proyectos nuevos y, con el fin de 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 claves de encriptación son distintos de los usuarios y servicios que las 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

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:

  1. Crea un proyecto de Google Cloud para que contenga el bucket de Cloud Storage que se usa para 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 optar por 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 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.

  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 roles/cloudkms.admin Administración de identidades y accesos. 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 depósito de almacenamiento llamado my-bucket.
  2. 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.

  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 la herramienta de línea de comandos de gcloud 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 fines 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 de forma automática y se convierte en la versión principal.

    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.

  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 mediante 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 la encriptación de datos con la guía de inicio rápido para encriptar datos.

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

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

  4. [Opcional] Borra el archivo de texto simple my-secret.txt de la máquina local. Esta es una práctica recomendada 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 con 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
    

    Puedes obtener más información sobre cómo 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.

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

Limpia

Para realizar una limpieza, borra todos los archivos que creaste en la máquina local y, luego, borra los proyectos [MY_KMS_PROJECT] y [MY_STORAGE_PROJECT].

¿Qué sigue?