NixOS y los secretos
(isabelroses.com)- Si en NixOS dejas secretos en la configuración de Nix, en un repositorio Git privado o en
git-crypten texto plano, el Nix store puede ser leído por cualquiera, así que cualquier persona con acceso a la máquina puede leer esos secretos - sops-nix cifra archivos de secretos con reglas de
.sops.yamly el flujo de edición desops, y al activar descifra con la clave SSH del host para dejar el texto plano en el tmpfs de/run/secrets/<name> - agenix especifica en
secrets.nixlas claves públicas receptoras para cada secreto, descifra archivos.ageen el tmpfs de/run/agenix/<name>, y requiere volver a cifrar al agregar hosts nuevos o rotar claves - El método de poner secretos directamente en el sistema de archivos puede servir en un solo servidor o laptop, pero si se leen en tiempo de evaluación como
builtins.readFile "/var/lib/myservice/token", el valor entra al Nix store, así que hay que evitarlo - Si estás empezando y solo tienes unos cuantos tokens independientes, agenix requiere menos pasos; si tienes un host con muchos secretos relacionados, como un servidor de correo, sops-nix encaja mejor porque agrupa varios valores en un solo archivo
Riesgo básico al manejar secretos en NixOS
- La gestión de secretos en NixOS suele dividirse entre
sops-nix,agenix/ragenix, usar el sistema de archivos, repositorios Git privados,git-crypty escribirlos directamente en la configuración de Nix - No deberías usar repositorios Git privados,
git-cryptni escribirlos directamente en la configuración de Nix si compartes la máquina o planeas hacer pública la configuración- El Nix store puede ser leído por cualquiera, así que alguien con acceso a la máquina puede leer los secretos
- Este riesgo es especialmente importante en momentos en que existen vulnerabilidades como CVE-2026-31431(copyfail) y CVE-2026-43284 y CVE-2026-43500(dirtyfrag)
- Los secretos se han filtrado al menos dos veces en configuraciones públicas, y los ejemplos siguen disponibles en 1, 2
sops-nix
- sops-nix puede sentirse difícil de configurar al principio, pero la documentación ha mejorado mucho y una gran mejora es que
sopsahora soporta de forma nativa cifrar y descifrar secretos con claves SSH - Aun así,
sops-nixtodavía va rezagado en ese soporte de claves SSH, y hay trabajo en curso en sops-nix#779, sops-nix#922 - El flujo de uso consiste en crear reglas de cifrado y descifrado en
.sops.yamly editar los archivos de secretos con el comandosops- Un ejemplo es definir claves públicas SSH como receptores
agepara la rutasecrets/*.yaml - Si ejecutas
sops secrets/shush.yaml, se abre el editor que hayas elegido y puedes escribir valores YAML comohello: sops - Al cerrar el editor, los valores se cifran en una forma como
ENC[AES256_GCM,...], y puedes volver a editarlos con el mismo comando
- Un ejemplo es definir claves públicas SSH como receptores
- En la configuración de NixOS, el módulo de
sops-nixse encarga de casi todo el trabajodefaultSopsFile = ./secrets/shush.yaml;define el archivo de secretos predeterminadoage.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];define la clave SSH del host- En
secrets."hello"puedes definirowner,groupymodepara establecer los permisos del archivo
- En el momento de la activación,
sops-nixdescifra el archivo con la clave SSH del host y deja el texto plano en/run/secrets/<name>- Esa ruta está en tmpfs, así que los secretos no tocan el disco
- Los servicios que necesitan el valor solo tienen que leer esa ruta
- La función de plantillas es útil en configuraciones compartidas o referenciadas por otros usuarios
- Si un archivo de configuración de un servicio requiere texto plano junto con algunos secretos, no hace falta cifrar el archivo completo
- Por ejemplo, puedes dejar
SMTP_USER=isabelen texto plano e insertar un marcador de secreto comoSMTP_PASSWORD=${config.sops.placeholder."mailserver/smtp_password"}
agenix
- agenix, a diferencia de
sops-nix, define los secretos y las claves con acceso ensecrets.nix, así que se siente más cercano a Nix - En
secrets.nixvinculas las claves públicas SSH de usuarios y hosts, y especificas qué claves públicas pueden acceder a cada archivo.age- Por ejemplo,
"secret1.age".publicKeys = [ isabel host1 ];,"secret2.age".publicKeys = [ isabel host2 ];permite tener una lista distinta de receptores para cada secreto
- Por ejemplo,
- Los archivos de secretos deben crearse con la CLI de
agenix- Con
agenix -e secret1.agepuedes crearsecret1.ageo volver a editarlo después
- Con
- La forma de conectarlo con la configuración del host es parecida a
sops-nix, pero como cada secreto es un archivo separado, la superficie es menorage.secrets.secret1.file = ./secrets/secret1.age;define el archivoowner,groupymodedefinen propiedad y permisos
- Durante el arranque, cada archivo
.agese descifra con la clave SSH del host y se deja en/run/agenix/<name>- Esa ruta también vive sobre tmpfs
- La parte donde más suele trabarse la gente es el rekeying
- Si agregas un host nuevo o rotas una clave, hay que volver a cifrar todos los secretos cuyo listado
publicKeyscambió ensecrets.nix agenix --rekeyse encarga de eso, pero necesita la clave privada de uno de los receptores actuales para poder leer el cifrado existente- En la práctica, el rekeying se hace desde la máquina en la que más confías, no desde el host nuevo que vas a incorporar
- Si agregas un host nuevo o rotas una clave, hay que volver a cifrar todos los secretos cuyo listado
Método usando solo el sistema de archivos
- Poner secretos directamente en el sistema de archivos tiene el costo de que la configuración ya no describe por completo la máquina
- En una reinstalación, tienes que volver a colocar todos los archivos en el lugar correcto y con la propiedad correcta
- En tareas de recuperación, como restaurar un servidor a las 2 de la mañana, eso puede ser un desastre enorme
- El patrón que hay que evitar es algo como
builtins.readFile "/var/lib/myservice/token"- Ese método lee el archivo en tiempo de evaluación e incluye el contenido en el Nix store
- Como el Nix store puede ser leído por cualquiera, terminas exactamente en el mismo modo de fallo del que se advirtió al principio
- En cambio, al servicio debes pasarle la ruta, no el valor en sí
- Por ejemplo, puedes usar opciones como services.*.environmentFiles
- Puede estar bien para un solo servidor o una laptop, pero si tienes una flota o quieres poder reconstruir todo desde cero solo con la configuración,
sops-nixoagenixson más adecuados - También puede servir cuando cada máquina tiene uno o dos valores que de verdad no deben ir al repositorio, pero entonces le dejas a tu yo del futuro la responsabilidad de volver a colocarlos después
Comparación entre sops-nix y agenix
- La razón principal para elegir
sops-nixes que te permite agrupar la mayor cantidad posible de datos en un solo archivo- Si tienes muchos secretos relacionados, como en un servidor de correo, puedes poner más valores en un solo archivo en vez de dividirlos en unos cinco archivos como con
agenix - Es una herramienta potente para seguir usando a largo plazo y vale la pena considerarla primero en hosts con muchísimos secretos, como un servidor de correo
- Si tienes muchos secretos relacionados, como en un servidor de correo, puedes poner más valores en un solo archivo en vez de dividirlos en unos cinco archivos como con
agenixdestaca por su simplicidad- No hay que aprender un esquema YAML
- No hay un
.sops.yamlque mantener sincronizado - Como
secrets.nixes simplemente Nix, puedes reutilizar para las claves los mismos bindingslet ... inque ya usas para hosts y usuarios - El modelo mental es “un secreto, un archivo, una lista de receptores”, y encaja bien con la forma de controlar acceso
- Como tiene la menor cantidad de piezas en movimiento y aun así ofrece control de acceso por host, es una opción muy recomendable para quien pregunta por primera vez cómo manejar secretos en una máquina NixOS
- Ambas herramientas resuelven el problema, y hoy la diferencia es mayormente de usabilidad
- Si vas empezando y varios servicios requieren grupos de secretos relacionados,
sops-nixescala mejor - Si vas empezando y en su mayoría solo tienes unos cuantos tokens independientes,
agenixte lleva al objetivo con menos pasos - Si vas a elegir tu primera herramienta para secretos, conviene familiarizarte con el flujo usando
agenixy pasarte asops-nixcuando de verdad sientas la incomodidad del enfoque “un archivo por secreto” por cada valor
- Si vas empezando y varios servicios requieren grupos de secretos relacionados,
- Se corrigió la parte relacionada con resistencia cuántica
1 comentarios
Opiniones en Lobste.rs
¿No están tanto el secreto cifrado como su clave en el disco? ¿O uno de los dos se guarda en algún lugar como un TPM?
Recién empecé a usar Nix y, en un despliegue pequeño de self-hosting, estoy usando el método simple de meterlo al sistema de archivos con
scpBuscando un poco, parece que se puede proteger una clave privada SSH con TPM, y me preguntaba si también sería posible en una VM, pero al ver que puede haber soporte para vTPM prácticamente me respondí solo
Del lado del servidor también tienes el enfoque de NixOps. Puedes ver cómo lo hace Colmena: https://colmena.cli.rs/0.4/features/keys.html
La idea central es que una máquina confiable que tiene los secretos los empuja al servidor remoto. Es parecido a lo que haces ahora con
scp, pero ejecutado de una forma más alineada con NixComo en los últimos días volví a configurar todo el ecosistema de agenix en el flake de mi sistema, solo puedo hablar de agenix. Para quien le interese, elegí agenix-rekey porque no hace falta tener archivos
.ymlcon secretos y, como ya venía haciendo, se pueden definir todos los secretos directamente en NixLos secretos cifrados están en el Nix store y, como todo lo demás en el Nix store, se pueden leer globalmente. La clave privada SSH que los descifra normalmente es la clave privada del servidor SSH real, aunque opcionalmente puede no ser así. Los secretos se descifran en el momento de activación, más o menos al arrancar, y se colocan en
/run/agenix/<user>Una herramienta llamada secrix va más allá y vincula secretos a servicios de systemd, y luego esos servicios a los servicios que necesitan los secretos. Así que los secretos solo se descifran mientras ese servicio está en ejecución. Aunque en la práctica, como los usuarios de NixOS rara vez andan prendiendo y apagando servicios seguido, muchas veces eso termina significando que quedan siempre en ejecución. Puede servir para secretos de activación del sistema, como la creación de usuarios
agenix-rekey hace que el rekeying sea menos molesto y reemplaza
secrets.nixpor salidas del flake. Usa una split identity de YubiKey como una mitad de la clave. El rekeying consiste en autenticarse con esa clave y con la otra mitad para descifrar el secreto, y luego volver a cifrarlo con la clave pública SSH del servidor. La clave pública se genera al instalar el sistema, y yo uso--copy-host-keysde nixos-anywhere para traerme las claves generadas en el closure de instalación. Los secretos cifrados se guardan en el repositorio, pero dentro de un submódulo separado al que solo pueden acceder builders confiablesComo referencia, vTPM por lo general no está basado en hardware, y muchos proveedores, incluso si ofrecen TPM, normalmente solo ofrecen TPM v1.2 y no TPM v2. Ese es también el caso de mi proveedor, BinaryLane. Sí, agrega una capa más de seguridad, pero no es un HSM mágico como un TPM real, y no te protege contra compromisos del proveedor o del nodo host. Permitir un vTPM realmente basado en HSM probablemente sería muy costoso para el proveedor, y AWS parece ofrecerlo a precios de AWS
agenix+agenix-rekey+age-plugin-1pMi clave maestra está en 1Password, así que puedo editar, ver y rekeyear la contraseña de cualquier servidor sin dejar ninguna credencial en el disco de mi laptop
Puedes dar acceso a servidores que necesiten acceso a claves en tiempo de ejecución. Le dices a agenix-rekey qué claves puede ver ese servidor y ejecutas
agenix rekey; entonces se registra en el Nix store una versión cifrada de la clave que ese servidor puede descifrar. La clave privada SSH de ese servidor solo existe en ese servidor y nunca sale de ahí. agenix-rekey solo necesita la clave pública para hacer rekeyingAsí que los casos en los que se filtrarían los secretos serían si hackean mi cuenta de 1Password, o si comprometen el servidor que usa esos secretos
/etc/ssh/ssh_host_ed25519_keyy luego se colocan en un ramfs montado en/run/agenix.dAsí que sí. El contenido cifrado, la clave de cifrado y el contenido descifrado están todos accesibles desde el sistema de archivos
https://github.com/oddlama/agenix-rekey
Además, cada vez quedan menos credenciales de larga duración. Nos estamos alejando de copiar credenciales de largo plazo para pasar a credenciales basadas en hardware, ya sea usándolas directamente o intercambiándolas por credenciales de corta duración