
Cifrado simple con SOPS y KMS
Hoy quiero hablarles de cómo practicar un cifrado simple con SOPS y KMS. Es que este es un tema que me gusta y es parte de mi día a día.
Seamos sinceros, ¿quién no ha tenido alguna vez un archivo de configuración con contraseñas y claves secretas guardado en texto plano? Quizá esto no sería un problema si dicho archivo lo tengo en Git y debo mantenerlo ahí. Es buena práctica el no almacenar datos sensibles en repositorios de código, al menos no sin protegerlos con algún mecanismo de cifrado.
¿Y qué es SOPS, se preguntarán? Pues, en pocas palabras, es un editor de archivos cifrados que nos permite guardar nuestros secretos de forma segura, ¡y lo mejor de todo es que podemos usarlo con AWS KMS!
¿Por qué SOPS?
Antes de entrar en materia, déjenme contarles por qué me gusta tanto SOPS:
- Facilidad de uso: SOPS es muy sencillo de usar, tanto para cifrar como para descifrar archivos.
- Compatibilidad: Soporta múltiples formatos de archivo, como YAML, JSON, INI, etc.
- Integración con AWS KMS: Podemos usar AWS KMS para gestionar las claves de cifrado, lo que nos da un nivel extra de seguridad.
- Control de acceso: Podemos definir quién tiene acceso a los secretos, lo que nos permite controlar quién puede cifrar y descifrar los archivos.
- Edición directa: Permite editar los archivos cifrados directamente, sin necesidad de descifrarlos previamente.
¿Cómo funciona SOPS con AWS KMS?
SOPS utiliza AWS KMS para generar y almacenar las claves de cifrado. Cuando ciframos un archivo, SOPS utiliza la clave de KMS para cifrar los datos. Cuando queremos descifrar el archivo, SOPS utiliza la misma clave de KMS para descifrar los datos.
Por defecto, SOPS soporta el cifrado de tipos de archivos conocidos, tales como JSON, YAML, ENV (variables de entorno) e INI. Otros tipos de archivos (Ejm: un .txt) también son soportados, pero el resultado cifrado lo formatea como JSON. Ya veremos más detalle de esto más adelante.
1. Instalación de SOPS
Lo primero que tenemos que hacer es instalar SOPS. Esto se hace a través de la descarga del binario para nuestra plataforma y luego lo colcamos en una ruta adecuada.
Esta es la dirección de descargas de SOPS: https://github.com/getsops/sops/releases
En mi caso, voy a descargar la más reciente (v3.9.4 al día de hoy):
curl https://github.com/getsops/sops/releases/download/v3.9.4/sops-v3.9.4.linux.amd64
Luego lo instalo en /usr/local/bin:
# Instalo el binario con el nombre "sops" sin incluir la version sudo install sops-v3.9.4.linux.amd64 /usr/local/bin/sops
2. Configuración de AWS KMS
Antes de poder usar SOPS con AWS KMS, necesitamos crear una clave de KMS. Podemos hacerlo desde la consola de AWS o usando la CLI de AWS.
Desde la consola de AWS:
- Vamos a la consola de AWS KMS.
- Hacemos clic en «Crear clave».
- Elegimos «Simétrica» como tipo de clave.
- El uso de claves debe ser «Cifrado y descifrado»
- Le damos un nombre a la clave (campo Alias).
- Definimos los usuarios y roles que tendrán acceso a la clave (Puede ser nuestro usuario IAM actualmente en uso).
Desde la CLI de AWS, son algunos pasos:
# Crear la llave. Tomar nota del "KeyId" y "Arn" aws kms create-key \ --description "Clave simetrica para cifrado y descifrado de datos" \ --key-usage ENCRYPT_DECRYPT \ --customer-master-key-spec SYMMETRIC_DEFAULT # Opcional: Crear una llave para la llave, usando el KeyId del paso anterior aws kms create-alias \ --alias-name alias/mi-llave-sops \ --target-key-id <KeyId>
La política de la llave KMS es importante para que se pueda controlar el uso de la misma. Aquí un ejemplo de política en un archivo kms-policy.json
que brinda acceso a los usuarios IAM user1
y user2
:
{ "Version": "2012-10-17", "Id": "key-policy-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "AllowMultipleUsers", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/user1", "arn:aws:iam::123456789012:user/user2" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt" ], "Resource": "*" } ] }
Ahora, aplicamos la política a la llave KMS:
aws kms put-key-policy \ --key-id <KeyId> \ --policy-name default \ --policy file://kms-policy.json
3. Configuración de variable de entorno
Una vez que tenemos la clave de KMS, necesitamos configurar SOPS para que la use. Podemos hacerlo creando un archivo .sops.yaml
con reglas de configuración según diferentes rutas y tipos de archivos. Pero también podemos omitir dicho archivo y solo configurar una variable de entorno. Ahora veremos esta segunda opción.
Para nuestro caso que estamos trabajando con AWS KMS, tenemos que crear al variable de entorno SOPS_KMS_ARN
con el ARN de la llave creada en el paso 2.
export SOPS_KMS_ARN=arn:aws:kms:us-east-1:123456789012:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
4. Cifrado de un archivo
Ahora que ya tenemos todo configurado, podemos cifrar nuestro primer archivo YAML.
Ejemplo de archivo secrets.yaml
:
database: username: myuser password: mysecretpassword
Para cifrar este archivo, ejecutamos el siguiente comando:
sops --encrypt secrets.yaml
Este comando muestra en la pantalla (STDOUT
) el contenido cifrado, pero respetando el formato YAML, dado que el archivo de entrada usa ese formato también.

Si queremos que el resultado se guarde en un archivo, debemos especificar un nombre cuya extensión también sea .yaml usando la opción --output, así:
sops --encrypt --output secrets.enc.yaml secrets.yaml
5. Descifrado de un archivo
Para descifrar el archivo secrets.enc.yaml
, ejecutamos el siguiente comando:
sops --decrypt secrets.enc.yaml
Este comando mostrará el contenido descifrado del archivo en la consola.

6. Edición de un archivo cifrado
Una de las ventajas de SOPS es que podemos editar en línea los archivos cifrados directamente. Para ello, ejecutamos el siguiente comando:
sops secrets.enc.yaml
Este comando abrirá el archivo en nuestro editor de texto predeterminado (Ejm: vim
o nano
). Después de realizar los cambios, guardamos el archivo y SOPS se encargará de cifrarlo automáticamente.
7. Cifrado de otros tipos de archivos
¿Verdad que el cifrado simple con SOPS y KMS no es nada del otro mundo?
7.1. Archivos JSON
Para cifrar un archivo JSON secrets.json
como este:
{ "database": { "username": "myuser", "password": "mysecretpassword" } }
Procedemos así:
sops -e --output secrets.enc.json secrets.json
Y lo desciframos así:
sops -d --output secrets-new.json secrets.enc.json
7.2. Archivos ENV (variables)
Para cifrar un archivo de variables ENV, el archivo debe tener la extensión .env
, por ejemplo vars.env
:
MYSQL_USER="root" MYSQL_PASS="p4ssw0rd" MYSQL_PORT="3306" MYSQL_HOST="localhost"
Y lo ciframos de modo similar a los anteriores:
sops -e --output vars.enc.env vars.env
Y el descifrado es lo mismo:
sops -d --output vars-new.env vars.enc.env
7.3. Otros tipos de archivos
En el caso de los archivos INI, también hay que seguir la convención de respetar la extensión del archivo el cual debe ser .ini
En caso que querramos cifrar un archivo YAML, JSON, INI o ENV pero que usen una extensión distinta (Ejm: un archivo YAML llamado demo.txt), tendremos que jugar con las opciones –input-type y –output-type, así:
sops -e --input-type yaml --output-type yaml demo.tx
7.4. Cifrado archivos genéricos
Por último, si queremos cifrar un archivo genérico cualquiera, lo podemos hacer sin ningún parámetro especial. Pero eso sí: SOPS generará la salida en formato JSON y al descifrarlo también espera que sea JSON.
Por ejemplo, así cifro un archivo de imagen:
sops -e wallpaper.jpg > wallpaper.enc.jpg
Y de este modo lo decifraría:
sops -d wallpaper.enc.jpg > wallpaper-new.jpg
Consejos adicionales
- Integra SOPS con tu flujo de trabajo de CI/CD. Puedes usar SOPS para cifrar los archivos de configuración en tu repositorio de código y descifrarlos automáticamente durante el despliegue.
- Una vez que ciframos datos con SOPS, debemos mantener las llaves AWS KMS y no eliminarlas, sino nos será imposible poder descifrar los archivos.
- SOPS también se integra no solo con AWS KMS, sino también con otras opciones como GnuPG, Azure Key Vault, Hashicorp Vault y GCP KMS.
Conclusión
SOPS es una herramienta muy útil para proteger nuestros secretos. Como se ha visto, el cifrado simple con SOPS y KMS es posible y así podemos tener la tranquilidad de que nuestros datos están seguros. ¡Anímense a probarlo y cuéntenme qué les parece!
Espero que esta entrada les haya sido útil. ¡Hasta la próxima!
Deja un comentario