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 en 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 admite la encriptación automática del servidor mediante claves de encriptación administradas por el cliente, que automatiza este proceso completo. Para proteger los datos de la aplicación antes de transmitirlos a Google Cloud, te recomendamos usar 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, encriptas un archivo con Cloud KMS antes de subirlo a un depósito. 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 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 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

Los proyectos se crean en Google Cloud Console. Para obtener instrucciones paso a paso, consulta la guía de inicio rápido de Cloud Identity and Access Management.

Dentro de la organización:

  1. Crea un proyecto de Google Cloud para contener el depósito de Cloud Storage que se usa para almacenar los secretos. Estos se almacenarán como objetos en el depósito. En los siguientes pasos, este proyecto se denomina my-storage-project.

  2. De manera opcional, crea un segundo proyecto de Google Cloud para administrar las claves de Cloud KMS que se usan para encriptar y desencriptar el secreto. En los pasos que se indican a continuación, 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

Usted crea usuarios y les otorga funciones en Google Cloud Console. Para obtener instrucciones paso a paso, consulta la guía de inicio rápido de Cloud Identity and Access Management.

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 roles/cloudkms.admin de Cloud Identity and Access Management. key-admin puede crear y administrar claves.

  3. Crea el usuario key-user:

  4. Otorga a key-user la función roles/cloudkms.cryptoKeyEncrypterDecrypter de Cloud IAM. key-user puede usar claves para encriptar y desencriptar datos.

Cree un depósito 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 con el nombre 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, con el propósito de encriptar. 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 principal.

    gcloud kms keys create my-key \
     --location global \
     --keyring storage \
     --purpose encryption
    

Puedes obtener más información sobre Cómo crear llaveros de claves y claves.

Encripta el archivo que contiene el secreto

Realiza este procedimiento como el usuario key-user mediante ambos proyectos.

  1. En tu máquina local, crea un archivo llamado my-secret.txt, que contenga el texto “This is my secret”.

    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
    

    Para obtener más información sobre la encriptación de datos, sigue la guía de inicio rápido de encriptación de 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
    

    Puedes obtener más información sobre cómo subir objetos a un depósito de almacenamiento.

  4. [Opcional] Borra el archivo my-secret.txt de texto simple de la máquina local. Esta es una práctica recomendada para los archivos que contienen datos sensibles sin encriptar.

El depósito de almacenamiento my-storage-bucket ahora contiene el archivo my-secret.txt.encrypted, que se encripta mediante 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 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 de un depósito 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. [Opcional] Borra los archivos my-secret.txt.encrypted y my-secret.txt.decrypted de la máquina local.

Limpia

Para limpiar los datos, 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