jueves, 21 de diciembre de 2017

Google cloud KMS en acción

En google cloud en español Publicado en 2017 dic 21 por Victor Yang

Descubramos Google Cloud KMS en acción para almacenar y compartir un secreto


Para el consejo de hoy, vamos a echar un vistazo a Google Cloud KMS: el Servicio de administración de claves proporcionado por GCP. Presentaremos un caso de uso concreto y veremos cómo usamos KMS para almacenar y compartir nuestro secreto.

Como lo usamos

Secretos como la cuenta de servicio de Google JSON, clave y secreto de AWS, ID de base de datos y contraseña, etc., se pueden cifrar y descifrar fácilmente con Google Cloud KMS. Cloud KMS no almacena secretos directamente. Puede encriptar los secretos que almacene en otro lugar, es decir, la clave misma se almacena dentro de KMS.

Vamos a ilustrar con un ejemplo del mundo real paso a paso. Podemos cifrar y descifrar un archivo JSON de la cuenta de servicio para las instancias de Google Compute Engine. Estas instancias son parte de un clúster de ElasticSearch. El administrador de Google Cloud crea la cuenta de servicio. Terraform utiliza la cuenta de servicio para aprovisionar las instancias de cómputo como se muestra aquí.

Los desarrolladores quieren una copia del archivo JSON de la cuenta de servicio para que puedan desarrollar y probar con el clúster ElasticSearch. El administrador de Google Cloud crea el archivo JSON del servicio de texto sin formato, ¿dónde y cómo almacenarlo de forma segura? Almacenar en la computadora portátil del administrador no es 100% seguro. Estos son los pasos que aprovechan Cloud KMS en su lugar.

Nota: para simplificar, no vamos a hablar aquí sobre la rotación de llaves.


Crear un llavero

gcloud kms keyrings create dev_keyring --location global

Crea una clave


gcloud kms keys create sa --location global \
       --keyring dev_keyring --purpose encryption
El comando anterior crea una clave SA para encriptar el archivo json de la cuenta de servicio de google.

Cifrado

gcloud kms encrypt --location=global --keyring=dev_keyring --key=sa \
       --plaintext-file=elasticsearch_svc_account.json \
       --ciphertext-file=elasticsearch_svc_account.json.enc
En este punto, podemos eliminar el archivo de texto sin formato elasticsearch_svc_account.json de la computadora portátil.


Almacenamiento


export GOOGLE_PROJECT=$(gcloud config get-value project)
export ENV=dev
gsutil cp elasticsearch_svc_account.json.enc gs://${GOOGLE_PROJECT}-secrets-${ENV}/
Dónde almacenar los sercretod cifrados? Se pueden almacenar en un depósito GCS o en cualquier almacenamiento de datos del sistema de configuración gestionada, como una Bag-data-Chef, un Salt-pillar, una Ansible-vault o una HashiCorp Vault. En nuestro ejemplo de Terraform, se almacena en un GCS bucket.

Descifrado

export GOOGLE_PROJECT=$(gcloud config get-value project)
export ENV=dev

gcloud kms decrypt --location=global --keyring=dev_keyring \
       --key=sa --plaintext-file=/dev/stdout \
       --ciphertext-file=<(gsutil cat gs://${GOOGLE_PROJECT}-secrets-${ENV}/elasticsearch_svc_account.json.enc)

En nuestro ejemplo de Terraform, podemos usar el proveedor de datos externos de Terraform como en este ejemplo para descargar y descifrar elásticosearch_svc_account.json.enc en la consola. El administrador de la nube puede proporcionar el servicio JSON al desarrollador que lo necesite a través de un canal seguro.