Secretos en un sistema que es un repositorio: agenix explicado para humanos
Tienes todo tu ordenador escrito en ficheros de texto. El sistema entero —paquetes, servicios, arranque, hasta el fondo de pantalla— vive en un repositorio versionado. Es la gracia de NixOS: reproducible, auditable, tuyo.
Y entonces llega la pregunta incómoda: ¿dónde meto la contraseña?
Porque el token del bot, la clave de la base de datos, la contraseña de la VPN… esas cosas también las necesita el sistema. Pero un repositorio se comparte, se sincroniza entre máquinas, a veces se sube a un sitio. Escribir un secreto en claro ahí dentro es como apuntar el PIN en el reverso de la tarjeta.
Este post va de la solución que uso: agenix. Y de
por qué no es lo mismo que GPG y pass, que
es la confusión más común. Lo cuento desde cero, sin dar por supuesto
que sabes criptografía. Si ya la sabes, salta a "Los dos papeles".
El truco de fondo: candados públicos, llaves privadas
Antes de nada, la idea que lo sostiene todo. Se llama criptografía asimétrica y, quitada la palabreja, es simple.
Imagina que tienes dos piezas que van en pareja:
- Un candado que puedes fotocopiar y repartir a todo el mundo. Es público.
- Una llave que guardas tú y solo tú. Es privada.
Cualquiera puede coger uno de tus candados, meter un mensaje en una caja y cerrarlo. Una vez cerrado, ni el que lo cerró puede reabrirlo. Solo tu llave privada abre ese candado. Cerrar es público; abrir es privado.
Eso es todo el pastel. "Cifrar para alguien" = cerrar la caja con SU candado. "Descifrar" = abrirla con TU llave. El que cifra no necesita ningún secreto; el que descifra sí.
Con esto ya se entiende agenix entero.
Qué es age, y qué es agenix
age (se lee "eich", como "edad" en inglés) es una herramienta de cifrado moderna y minúscula. Coge un fichero, una lista de candados públicos, y produce un fichero cifrado que solo abren las llaves privadas correspondientes. Sin ceremonias, sin anillos de confianza, sin veinte flags. Un candado, una caja.
agenix es el pegamento entre age y NixOS. Hace tres cosas:
- Te deja guardar cada secreto como un fichero
.age(cifrado) dentro del repositorio. Cifrado, así que puede vivir en el repo sin drama. - Al arrancar la máquina, los descifra automáticamente a un sitio seguro.
- Te da un comando para editarlos sin tener que descifrar a mano.
La idea central, y la que hay que llevarse a casa: *el secreto viaja cifrado en el repo; solo se abre, en RAM, en la máquina que tiene la llave, y solo cuando hace falta.*
Los dos papeles: la máquina y tú
Aquí está la parte elegante, y la que a mí me costó ver. En agenix hay dos tipos de llave, con dos trabajos distintos.
La llave de la máquina (descifra sola, sin ti delante)
Cada ordenador con SSH tiene, desde que se instala, un par de llaves
propio: su host key. Está en /etc/ssh/. No la pusiste tú; nace con el
sistema.
agenix aprovecha esa: cifra cada secreto también para el candado de la máquina. Resultado: cuando el ordenador arranca, usa su propia llave privada de host para abrir los secretos él solo, sin que haya un humano delante escribiendo nada.
Esto es EL punto. Un servidor que se reinicia a las 4 de la mañana necesita el token de su bot para levantar el servicio. No hay nadie para teclear una contraseña. La máquina se la abre a sí misma. Disponibilidad sin presencia humana.
Tu llave (para editar los secretos)
Pero alguien tiene que crear y cambiar esos secretos. Ese eres tú. Para eso, agenix cifra cada secreto además para tu candado personal —tu clave SSH de usuario, la de =~/.ssh/=—. Así, cuando quieres editar un secreto, tu llave lo abre, lo editas, y se vuelve a cerrar para todos los candados de la lista.
O sea: un mismo fichero .age está
cerrado con varios candados a la vez —el de cada
máquina que lo necesita, y el tuyo—. Cualquiera de esas llaves lo abre.
Ni una más.
secreto.age (cifrado para 3 candados)
│
├─ candado de la máquina A ──► la abre sola al arrancar
├─ candado de la máquina B ──► la abre sola al arrancar
└─ tu candado personal ──► la abres tú para editar
Añadir una máquina nueva al ajo = meter su candado público en la lista y volver a cerrar. Quitar una = sacarlo. Nada de copiar contraseñas por ahí.
Dónde aterrizan los secretos (y por qué importa)
Cuando la máquina descifra un secreto al arrancar,
no lo deja en el disco. Lo pone en /run/agenix/, que vive en RAM (tmpfs) y es de
solo-root. Consecuencias:
- No toca el disco: no queda rastro en claro en el almacenamiento.
- Se evapora al apagar: cada arranque lo vuelve a generar.
- Permisos finos: cada secreto puede tener su dueño y sus 400 (solo su proceso lo lee).
Un script que lo necesite hace, literalmente, cat /run/agenix/nombre-del- secreto y ya. El
secreto está ahí, en claro, pero solo para quien debe y solo en
memoria.
El día a día
El ciclo completo, sin misterio:
agenix -e mi-secreto.age # tu llave lo abre en un editor; escribes; se re-cierra
git commit # el .age cifrado va al repo, tranquilo
nixos-rebuild switch # la máquina lo empieza a descifrar al arrancar
Editar un secreto es un comando. Pero —y esto es honesto— cambiar cualquier cosa implica editar-cifrar-rebuild. Es declarativo hasta las cejas. Genial para secretos que pones una vez y olvidas; un latazo para cosas que tocas cada día.
Lo cual nos lleva al malentendido clásico.
Esto NO es GPG
ni pass (y está bien que no lo sea)
Si has usado Linux un rato, habrás oído de GPG y de pass, el gestor de contraseñas. Y es fácil
pensar "¿no es lo mismo?". No. Son dos mundos, con dos criptografías
distintas y dos propósitos distintos.
pass es tu llavero
personal. Guarda las contraseñas que consultas
tú, a mano: el banco, el correo, la de una web. Va
cifrado con tu clave GPG, que a su vez está protegida
por una passphrase. Cuando pides una contraseña, GPG
llama a un programita —*pinentry*— que dibuja la ventanita de "escribe
tu passphrase". Es decir: pass exige que
tú estés delante y demuestres que eres tú. Ese candado
humano es una feature.
agenix es lo contrario a propósito: secretos que la máquina necesita sin que tú estés. Por eso se cifra para la llave del ordenador, que abre sola. No hay passphrase, no hay ventanita, no hay humano. También a propósito.
La regla mental que uso:
| Pregunta | Herramienta |
|---|---|
| ¿Lo necesita un servicio al arrancar, solo? | agenix |
| ¿Lo consulto yo, a mano, cuando lo necesito? | pass |
Token de un bot, clave de una base de datos de un servicio, credenciales de una VPN que levanta sola: agenix. La contraseña de tu banco: pass. Y no pasa nada por tener las dos cajas —resuelven problemas distintos—.
Un matiz de seguridad que conviene entender, no por miedo sino por saber lo que tienes: como agenix cifra para la llave de la máquina, esa máquina abre sus secretos sola. Es justo lo que quieres para un servicio… y justo lo que no quieres para la contraseña de tu banco, porque ahí el candado de la passphrase (que solo está en tu cabeza) es la diferencia entre "me robaron el portátil" y "me robaron el portátil Y todas mis cuentas". Cada caja en su sitio.
¿Y dónde está "mi clave", entonces?
La pregunta del millón, la que todo el mundo se hace y nadie sabe contestar de carrerilla. La respuesta, ahora que tienes el mapa, es que tienes dos, una por cada mundo:
- Para agenix: tu identidad es tu clave SSH
de usuario (la de
~/.ssh/). Con ella editas cualquier secreto del sistema. Su mitad pública es uno de los candados de la lista; su mitad privada la guardas tú. - Para pass: tu clave GPG (la que
vive en
~/.gnupg). Con ella se abre tu llavero personal. Está protegida por tu passphrase.
Dos llaves, dos cajas, dos trabajos. Si entiendes eso, entiendes por qué cuando una de las dos se rompe (pongamos, la ventanita de la passphrase deja de funcionar) el sistema sigue tirando pero tu llavero personal no. No es magia ni mala suerte: es que son sistemas separados, y solo uno depende de que tú estés delante.
Cierre
agenix no es más que esto: candados públicos que reparto, secretos cifrados que viajan tranquilos en el repo, y una llave —la de la máquina— que los abre sola cuando arranca, en RAM, para quien debe y nada más. La tuya, la personal, solo entra para editar.
Si te quedas con una sola frase: el repo puede ver el secreto cerrado; solo la máquina correcta, en memoria, lo ve abierto. Todo lo demás son detalles.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario