Encriptar datos de aplicaciones

En esta página se muestra una forma de usar Cloud Key Management Service para cifrar directamente los datos de una aplicación en un cliente antes de transmitirlos a través de una red.

En este ejemplo, los datos cifrados se transmiten a Google Cloud y se almacenan en un segmento de Cloud Storage. Cloud Storage también admite el encriptado automático del lado del servidor con claves de encriptado gestionadas por el cliente, lo que automatiza todo el proceso. Para proteger los datos de las aplicaciones antes de transmitirlos aGoogle Cloud, te recomendamos que uses la biblioteca Tink.

La biblioteca Tink es una biblioteca multiplataforma y multilingüe que proporciona APIs para tareas criptográficas comunes. Se puede usar para cifrar datos antes de que se introduzcan en los Google Cloud almacenes de datos. Además, es compatible con Java, Python, C++, Go, Objective-C y otros lenguajes, así como con servicios de almacenamiento de objetos y de bases de datos relacionales.

En este tutorial, encriptarás un archivo con Cloud KMS antes de subirlo a un segmento. A continuación, descarga y descifra 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 tendrás que usar Cloud KMS para descifrar. El cifrado simétrico sin formato te permite cifrar o descifrar datos de forma local o mover datos cifrados entre diferentes bibliotecas y proveedores de servicios sin tener que descifrarlos primero.

Antes de empezar

En tu Google Cloud organización, necesitas permiso para crear proyectos, habilitar la facturación, crear usuarios y gestionar permisos en esos proyectos. El rol roles/resourcemanager.organizationAdmin concede este permiso.

Configuración

Recomendamos usar dos proyectos y dos usuarios para asegurar la separación de funciones. Si sigues los pasos de esta guía, los usuarios y servicios que gestionan las claves de cifrado serán distintos de los usuarios y servicios que las utilizan. Un proyecto contiene y gestiona las claves, mientras que el otro almacena los datos cifrados en un segmento de Cloud Storage y los descifra según sea necesario.

Crear proyectos

Los proyectos se crean en la Google Cloud consola. Para ver instrucciones detalladas, consulta la guía de inicio rápido de gestión de identidades y accesos.

Crea los siguientes proyectos en tu organización:

  1. Crea un Google Cloud proyecto que contenga el segmento de Cloud Storage que se usará para almacenar los secretos. Los secretos se almacenarán como objetos en el segmento. Este proyecto se llama STORAGE_PROJECT_ID.

  2. Crea un segundo Google Cloud proyecto para gestionar las claves de Cloud KMS que se usan para cifrar y descifrar el secreto. Este proyecto se llama KEY_PROJECT_ID.

  3. En cada proyecto, habilita la API de Cloud KMS y la facturación siguiendo los pasos de la sección Antes de empezar de la guía de inicio rápido de Cloud KMS.

Crear usuarios

Crea usuarios y les asigna roles en la Google Cloud consola. Para ver instrucciones detalladas, consulta la guía de inicio rápido de gestión de identidades y accesos.

Con este procedimiento se crean dos usuarios. El administrador de claves gestiona las claves de cifrado, y el usuario de claves puede cifrar y descifrar datos con las claves.

Sigue este procedimiento en el proyecto KEY_PROJECT_ID.

  1. Crea la cuenta de administrador de claves.

  2. Asigna el rol de Gestión de Identidades y Accesos roles/cloudkms.admin al administrador de claves. Este rol permite al administrador de claves crear y gestionar claves.

  3. Crea la cuenta de usuario principal.

  4. Concede el rol de gestión de identidades y accesos roles/cloudkms.cryptoKeyEncrypterDecrypter al usuario clave. Este rol permite al usuario de la clave cifrar y descifrar datos.

Crear un segmento de almacenamiento

Sigue este procedimiento en el proyecto STORAGE_PROJECT_ID.

  1. Crea un segmento de almacenamiento llamado STORAGE_BUCKET.
  2. Asigna el rol roles/storage.objectAdmin en el segmento de almacenamiento STORAGE_BUCKET a la cuenta de usuario de la clave.

Crear una clave de cifrado

Sigue este procedimiento como usuario administrador principal del proyecto KEY_PROJECT_ID.

  1. Crea un conjunto de claves. El nombre de un conjunto de claves debe ser único en el proyecto. No puedes cambiar el nombre de un conjunto de claves ni eliminarlo. Usa Google Cloud CLI para crear un conjunto de claves.

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    Haz los cambios siguientes:

    • KEY_RING: el nombre que se va a usar para el llavero de almacenamiento. Por ejemplo, storage.
    • LOCATION: la ubicación en la que quieres crear el conjunto de claves. Debe estar cerca geográficamente de la ubicación en la que quieras crear el segmento de Cloud Storage.
  2. Crea una clave de cifrado en el conjunto de claves. El nombre de la clave debe ser único en el conjunto de claves. No es posible cambiar el nombre de las claves ni eliminarlas, pero sí se pueden eliminar sus versiones. Usa Google Cloud CLI para crear la clave. Se crea automáticamente una versión inicial de la clave, que se convierte en la versión principal.

    gcloud kms keys create KEY_NAME \
      --location LOCATION \
      --keyring KEY_RING \
      --purpose encryption
    

    Haz los cambios siguientes:

    • LOCATION: la ubicación en la que has creado el conjunto de claves.
    • KEY_NAME: el nombre que se va a usar para la clave de almacenamiento. Por ejemplo, storage.
    • KEY_RING: el nombre que has usado para el conjunto de claves de almacenamiento. Por ejemplo, storage.

    Nota: Para usar claves de encriptado simétrico sin formato, asigna el valor raw-encryption al campo "purpose" (finalidad).

Más información sobre cómo crear conjuntos de claves y claves

Cifra el archivo que contiene el secreto

Sigue este procedimiento con la cuenta de usuario clave, trabajando en ambos proyectos.

  1. En tu máquina local, guarda el secreto.

    echo "SECRET_TEXT" > PATH_TO_SECRET
    

    Haz los cambios siguientes:

    • SECRET_TEXT: el secreto que quieres proteger, en texto sin formato. Por ejemplo, this is a secret.
    • PATH_TO_SECRET: la ruta en la que quieres crear el secreto. Por ejemplo, secret.txt.
  2. Encripta el secreto con Cloud KMS y la clave de encriptado.

    gcloud kms encrypt \
      --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --plaintext-file PATH_TO_SECRET \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET
    

    Haz los cambios siguientes:

    • LOCATION: la ubicación en la que has creado el conjunto de claves.
    • KEY_RING: el nombre del conjunto de claves.
    • KEY_NAME: el nombre de la clave de cifrado.
    • PATH_TO_SECRET: la ruta en la que has creado el secreto.
    • PATH_TO_ENCRYPTED_SECRET: la ruta en la que quieres guardar el secreto cifrado (por ejemplo, secret.txt.encrypted).

    Para obtener más información sobre el cifrado de datos, consulta la guía de inicio rápido sobre el cifrado de datos.

    Usa raw-encrypt en su lugar para el cifrado simétrico sin formato.

  3. Sube el archivo de secretos cifrado al segmento de almacenamiento. Puedes usar el siguiente comando de gcloud CLI:

    gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
    

    Puedes consultar más información sobre cómo subir objetos a un contenedor de almacenamiento.

  4. Opcional: Elimina el archivo secreto de texto sin formato (PATH_TO_SECRET) del equipo local. Es una buena práctica para los archivos que contienen datos sensibles sin cifrar.

El segmento de almacenamiento STORAGE_BUCKET ahora contiene el archivo secreto cifrado, que se ha cifrado con la clave de cifrado KEY_NAME.

Descifrar el archivo que contiene el secreto

Sigue estos pasos con la cuenta de usuario principal, trabajando en ambos proyectos.

  1. Descarga el archivo secreto cifrado del bucket de almacenamiento. Puedes usar el siguiente comando de gcloud CLI:

    gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
    

    Puedes consultar más información sobre cómo descargar objetos de un contenedor de almacenamiento.

  2. Descifra el archivo con la misma clave que usaste para cifrarlo.

    gcloud kms decrypt --location LOCATION \
      --keyring KEY_RING \
      --key KEY_NAME \
      --ciphertext-file PATH_TO_ENCRYPTED_SECRET \
      --plaintext-file PATH_TO_DECRYPTED_SECRET
    

    Haz los cambios siguientes:

    • LOCATION: la ubicación en la que has creado el conjunto de claves.
    • KEY_RING: el nombre del conjunto de claves.
    • KEY_NAME: el nombre de la clave de cifrado.
    • PATH_TO_ENCRYPTED_SECRET: la ruta al secreto cifrado descargado, por ejemplo, secret.txt.encrypted.
    • PATH_TO_DECRYPTED_SECRET: la ruta en la que quieres guardar el secreto descifrado. Por ejemplo, secret_decrypted.txt.

    Para obtener más información sobre cómo descifrar datos, consulta la guía de inicio rápido sobre cifrado de datos.

    Usa raw-decrypt en su lugar para el cifrado simétrico sin formato.

    Ahora puedes leer el texto sin cifrar descifrado del secreto con cat o un editor de texto. El contenido es idéntico al contenido original de PATH_TO_SECRET.

  3. Opcional: Elimina los archivos PATH_TO_ENCRYPTED_SECRET y PATH_TO_DECRYPTED_SECRET del equipo local.

Eliminar los recursos utilizados

Para limpiar, elimina todos los archivos que hayas creado en el equipo local y, a continuación, elimina los proyectos KEY_PROJECT_ID y STORAGE_PROJECT_ID.

Siguientes pasos