En esta página, 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 con claves de encriptación administradas por el cliente, que automatiza todo el proceso. Para proteger los datos de la aplicación antes de transmitirlos aGoogle Cloud, te recomendamos que uses la biblioteca de Tink.
La biblioteca Tink es una multiplataforma de varios lenguajes que proporciona APIs para tareas criptográficas comunes. Se puede usar 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, descarga y desencripta los mismos datos para poder leerlos en el cliente.
Cuando sigues estas instrucciones, tus claves y todas las operaciones criptográficas siguen en Google Cloud y debes usar Cloud KMS para la desencriptación. La encriptación simétrica sin procesar te permite encriptar o desencriptar datos localmente 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. El rol 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 esta guía, 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.
Crea los siguientes proyectos en tu organización:
Crea un proyecto de Google Cloud para contener el bucket de Cloud Storage que se usa para almacenar los secretos. Estos se almacenarán como objetos en el bucket. Este proyecto se llama STORAGE_PROJECT_ID.
Crea un segundo proyecto de Google Cloud para administrar las claves de Cloud KMS que se usan para encriptar y desencriptar el secreto. Este proyecto se llama KEY_PROJECT_ID.
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
Crea usuarios y otórgales 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. El administrador de claves administra las claves de encriptación, y el usuario de claves puede encriptar y desencriptar datos con las claves.
Realiza este procedimiento en el proyecto KEY_PROJECT_ID.
Crea la cuenta de administrador de claves.
Otorga el rol de Identity and Access Management
roles/cloudkms.admin
al administrador de claves. Este rol permite que el administrador de claves cree y administre claves.Crea la cuenta de usuario clave.
Otorga el rol de IAM
roles/cloudkms.cryptoKeyEncrypterDecrypter
al usuario clave. Este rol le permite al usuario de la clave encriptar y desencriptar datos.
Crea un bucket de almacenamiento
Realiza este procedimiento en el proyecto STORAGE_PROJECT_ID
.
- Crea un bucket de almacenamiento llamado
STORAGE_BUCKET
. - Otorga el rol
roles/storage.objectAdmin
en el bucket de almacenamiento STORAGE_BUCKET a la cuenta de usuario clave.
Crea una clave de encriptación
Realiza este procedimiento como el usuario administrador de claves en el proyecto KEY_PROJECT_ID.
Crea un llavero de claves. El nombre de un llavero de claves debe ser único dentro del proyecto. No es posible cambiar el nombre de un llavero de claves ni borrarlo. Usa Google Cloud CLI para crear un llavero.
gcloud kms keyrings create KEY_RING \ --location LOCATION
Reemplaza lo siguiente:
KEY_RING
: Es el nombre que se usará para el llavero de almacenamiento, por ejemplo,storage
.LOCATION
: es la ubicación en la que deseas crear el llavero de claves. Debe estar geográficamente cerca de la ubicación en la que deseas crear el bucket de Cloud Storage.
Crea una clave de encriptación en el llavero de claves. El nombre de la clave debe ser único dentro del llavero de claves. No se puede cambiar el nombre de las claves ni borrarlas, pero se pueden destruir sus versiones. 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 KEY_NAME \ --location LOCATION \ --keyring KEY_RING \ --purpose encryption
Reemplaza lo siguiente:
LOCATION
: Es la ubicación en la que creaste el llavero de claves.KEY_NAME
: Es el nombre que se usará para la clave de almacenamiento, por ejemplo,storage
.KEY_RING
: Es el nombre que usaste para el llavero de almacenamiento, por ejemplo,storage
.
Nota: Para usar claves de encriptación simétrica sin procesar, establece el campo de propósito en
raw-encryption
.
Obtén más información para crear claves y llaveros de claves.
Encripta el archivo que contiene el secreto
Realiza este procedimiento como la cuenta de usuario clave, trabajando en ambos proyectos.
En tu máquina local, guarda el secreto.
echo "SECRET_TEXT" > PATH_TO_SECRET
Reemplaza lo siguiente:
SECRET_TEXT
: El secreto que deseas proteger, en texto sin formato, por ejemplo,this is a secret
.PATH_TO_SECRET
: Es la ruta de acceso en la que deseas crear el secreto, por ejemplo,secret.txt
.
Encripta el secreto con Cloud KMS y la clave de encriptación.
gcloud kms encrypt \ --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --plaintext-file PATH_TO_SECRET \ --ciphertext-file PATH_TO_ENCRYPTED_SECRET
Reemplaza lo siguiente:
LOCATION
: Es la ubicación en la que creaste el llavero de claves.KEY_RING
: es el nombre del llavero de claves.KEY_NAME
: Es el nombre de la clave de encriptación.PATH_TO_SECRET
: Es la ruta de acceso en la que creaste el secreto.PATH_TO_ENCRYPTED_SECRET
: Es la ruta de acceso en la que deseas guardar el secreto encriptado, por ejemplo,secret.txt.encrypted
.
Para obtener más información sobre cómo encriptar datos, sigue la guía de inicio rápido para encriptar datos.
En su lugar, usa
raw-encrypt
para la encriptación simétrica sin procesar.Sube el archivo secreto encriptado al bucket de almacenamiento. Puedes usar el siguiente comando de gcloud CLI:
gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
Obtén más información para subir objetos a un bucket de almacenamiento.
Opcional: Borra el archivo secreto de texto simple (
PATH_TO_SECRET
) de la máquina local. Esta es una buena práctica para los archivos que contienen datos sensibles sin encriptar.
El bucket de almacenamiento STORAGE_BUCKET
ahora contiene el archivo secreto encriptado, que se encripta con la clave de encriptación KEY_NAME
.
Desencripta el archivo que contiene el secreto
Realiza estos pasos como la cuenta de usuario clave y trabaja en ambos proyectos.
Descarga el archivo secreto encriptado del bucket de almacenamiento. Puedes usar el siguiente comando de gcloud CLI:
gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
Obtén más información para descargar objetos de un bucket de almacenamiento.
Desencripta el archivo con la misma clave que usaste para encriptarlo.
gcloud kms decrypt --location LOCATION \ --keyring KEY_RING \ --key KEY_NAME \ --ciphertext-file PATH_TO_ENCRYPTED_SECRET \ --plaintext-file PATH_TO_DECRYPTED_SECRET
Reemplaza lo siguiente:
LOCATION
: Es la ubicación en la que creaste el llavero de claves.KEY_RING
: es el nombre del llavero de claves.KEY_NAME
: Es el nombre de la clave de encriptación.PATH_TO_ENCRYPTED_SECRET
: Es la ruta de acceso al secreto encriptado descargado, por ejemplo,secret.txt.encrypted
.PATH_TO_DECRYPTED_SECRET
: Es la ruta de acceso en la que deseas guardar el secreto desencriptado, por ejemplo,secret_decrypted.txt
.
Para obtener más información sobre cómo desencriptar datos, sigue la guía de inicio rápido para encriptar datos.
En su lugar, usa
raw-decrypt
para la encriptación simétrica sin procesar.Ahora puedes leer el texto simple desencriptado del secreto con
cat
o un editor de texto. El contenido es idéntico al contenido original dePATH_TO_SECRET
.Opcional: Borra los archivos
PATH_TO_ENCRYPTED_SECRET
yPATH_TO_DECRYPTED_SECRET
de la máquina local.
Realice una limpieza
Para realizar una limpieza, borra todos los archivos que creaste en la máquina local. Luego, borra los proyectos KEY_PROJECT_ID
y STORAGE_PROJECT_ID
.
¿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 recursos.
- Obtén información sobre cómo crear una cuenta de servicio.