Protegiendo Secretos con Mozilla Sops y Age
PROMO DigitalOcean
Antes de comenzar, quería contarles que hay una promoción en DigitalOcean donde te dan un crédito de USD 100.00 durante 60 días para que puedas probar los servicios que este Proveedor Cloud ofrece. Lo único que tienes que hacer es suscribirte a DigitalOcean con el siguiente botón:
O a través del siguiente enlace: https://bit.ly/digitalocean-itsm
Introducción
Si bien muchos piensan que es una buena idea de guardar información como usuarios de base de datos, contraseñas, claves API u cualquier otro tipo de información sensible en texto plano y enviarlos a repositorios Git públicos como GitHub, GitLab o BitBucket o inclusive privados, te tengo una mala noticia: NO, lo es. Si aun asi quieres hacerlo, debes encriptarlo primero usando Mozilla SOPS (Secret Operations) y AGE.
Instalando SOPS
SOPS es un editor de secretos que soporta formatos de archivo como: YAML, JSON, ENV, INI y BINARY y podemos encriptarlos con AWS KMS, GCP KMS, Azure Key Vault, age, y PGP (este ultimo descontinuado).
SOPS tiene varias opciones para instalarse, con paquetes construidos para distribuciones basadas en Debian/RedHat.
Desde el repositorio oficial de GitHub de SOPS, vamos a la parte de Releases
Si lo queremos instalar en Debian:
|
|
o Redhat/AlmaLinux/Rocky/Fedora:
|
|
Otra opción podría ser descargarnos el binario de SOPS, instalarlo en /usr/local/bin y darle permisos de ejecución:
|
|
Comprobemos la version instalada: queremos
|
|
Y deberíamos ver la siguiente salida:
|
|
Instalando age
age es una herramienta escrita en Go, moderna, simple y segura de encriptación. Podemos encriptar y desencriptar nuestros archivos haciendo posible su almacenamiento en repositorios Git.
También cuenta con multiples opciones para instalarlo:
Debian:
|
|
RedHat:
|
|
O manual desde la sección Releases del proyecto age:
|
|
Luego descomprimimos y movemos los ejecutables a /usr/local/bin:
|
|
Y les damos permisos de ejecución:
|
|
Comprobamos las versiones:
De age:
|
|
Y de age-keygen:
|
|
En ambos caso deberíamos ver la versión:
|
|
Configurando Llaves de Encriptación
Ya que tenemos age instalado en nuestro equipo, vamos a generar nuestras llaves publica y privada:
|
|
Y nos mostraria la siguiente salida:
|
|
Y si vemos el contenido del archivo key.txt:
|
|
Para facilitar un poco las cosas, vamos a crear una carpeta en nuestro directorio HOME donde guardaremos nuestra llave privada:
|
|
Y exportaremos una variable de entorno hacia nuestro .zshrc o .bashrc
Zsh:
|
|
Bash:
|
|
Vamos a Encriptar
Una vez configurado nuestro sistema, procederemos a encriptar nuestros secretos. Hay muchas formas de abordar esto dependiendo del tipo de archivo.
YAML
Pueden ser secretos de Kubernetes, valores de Helm o solo yaml plano.
Creamos un archivo con el siguiente contenido:
secretos.yml
|
|
Para encriptar el archivo:
|
|
Si prestamos atención a la parte del comando que dice --encrypted-regex '^(data|stringData)$'
le estamos indicando a sops que busque dentro de ese archivo la clave stringData
y que encripte su contenido.
Ahora, para desencriptarlo:
|
|
Kubernetes
Es bastante util que apliquemos los cambios a Kubernetes sin tener que desencriptar el archivo sino que lo hacemos al vuelo:
Primero lo encriptamos:
|
|
Y luego lo desencriptamos y aplicamos los cambios al cluster al vuelo, haciéndole pipe a kubectl:
|
|
Comprobemos los cambios:
|
|
|
|
|
|
.ENV
Creamos un archivo con el siguiente contenido:
secretos.env
|
|
Encriptamos:
|
|
Desencriptamos:
|
|
No olvidemos agregar el archivo .decrypted~secretos.env al .gitignore para que no lo suba a Git.
JSON
Creamos un archivo con el siguiente contenido:
secretos.json
|
|
Encriptamos:
|
|
Desencriptamos:
|
|
No olvidemos agregar el archivo .decrypted~secretos.json al .gitignore para que no lo suba a Git.
.INI
secretos.ini
|
|
Encriptamos:
|
|
Desencriptamos:
|
|
No olvidemos agregar el archivo .decrypted~secretos.ini al .gitignore para que no lo suba a Git.
Archivos
secretos.sql
|
|
Encriptamos:
|
|
Desencriptamos:
|
|
Flux
Si tienes un flujo GitOps con Flux, para desencriptar secretos en el cluster te recomiendo leer la documentación de Flux: https://fluxcd.io/flux/guides/mozilla-sops/#configure-in-cluster-secrets-decryption
Conclusión
Encriptar y desencriptar secretos nunca había sido tal fácil. Con SOPS y age puedes realizar tal tarea sin necesidad de complicarnos mucho y ahorrarnos grandes dolores de cabeza con malas practicas. El siguiente objetivo seria el de juntar todas las piezas y automatizar el flujo de CI/CD para que reconozcan esos valores, cosa que muy seguramente sera en un proximo articulo.
Espero les haya gustado y nos vemos en la próxima!