4 · Seguridad·6 min de lectura
Un secreto que nadie puede leer solo se puede reemplazar
Instalamos una sonda dentro de un servidor. Para mandar su parte hacia afuera necesita una credencial: la misma que ya usan tres procesos automáticos para hablar con el mismo endpoint. Solo había que ponerla en un tercer lugar.
Fuimos a buscarla.
Dónde estaba#
Worker (Cloudflare) DETECTORES_RUNNER_SECRET secret_text ← solo escribir
n8n (orquestador) "Runner de detectores" httpHeaderAuth ← ●●●●●●●●
Ni el dueño de ambos sistemas podía recuperarla. Nosotros tampoco.
Y esto es lo que hay que decir con claridad: está bien hecho. Es exactamente lo que uno quiere de un almacén de secretos. Un valor que se puede leer es un valor que se puede filtrar — en una captura de pantalla, en un chat, en un registro. Los dos sistemas hicieron su trabajo.
Pero tiene una consecuencia que casi nadie considera cuando lo diseña: el día que necesites ese valor en un tercer lugar, no existe «consultar». Solo existe «rotar».
Lo que significa rotar#
No es cambiar un valor. Es cambiarlo en todos los lugares donde vive, en el orden correcto, en la hora correcta. Cualquiera de las tres cosas mal hecha deja algo mudo.
1 generar el valor nuevo openssl rand -hex 32
2 ponerlo en el Worker wrangler secret put ...
3 ponerlo en el servidor del cliente variable de máquina, por SSH
4 ponerlo en el orquestador credencial "Runner de detectores"
5 verificar que cada uno entra una llamada real por cada lado
Y de noche, a propósito. Los tres procesos automáticos corren a las 6 y a las 7 de la mañana. Entre que se rota el Worker y se actualiza el orquestador, cualquier proceso que corra recibe «no autorizado» y se queda callado. Rotar a las once de la noche deja siete horas de margen. Rotar a las once de la mañana deja detectores mudos de dos clientes hasta que alguien lo note — y «lo note» puede ser un mes.
El valor no pasó por ninguna pantalla#
Hay una regla nuestra que salió de un error anterior: una llave que se pega en un chat ya se filtró, aunque el chat sea privado. Los chats se guardan, se resumen, se copian.
Así que el valor nuevo se generó en un archivo temporal con permisos solo para el dueño, se copió al portapapeles para pegarlo en el orquestador, y al confirmar que los tres lugares lo tenían, se borró el archivo y se limpió el portapapeles. Existió unos minutos en tres formas: en disco, en el portapapeles y en los tres sistemas. Al final solo queda en los tres sistemas, donde otra vez nadie puede leerlo.
Y así debe ser. La próxima vez que haga falta en un cuarto lugar, se rota otra vez.
Lo que hicimos#
1. Rotamos en vez de buscar más. Después de confirmar que ninguno de los dos sistemas lo mostraba, no perdimos más tiempo intentando recuperarlo. Un secreto bien guardado no se recupera.
2. Verificamos cada lado con una llamada real, no con «guardado». El Worker con el valor nuevo: 200. El servidor mandando su parte: 200. El orquestador corriendo un detector: corrió en 566 ms. Tres pruebas, tres lugares.
3. Dejamos anotado quién más lo usa. Ése era el hueco real: el inventario de secretos decía dónde vivía la credencial, no quién la consumía. Sin esa lista, rotar es adivinar a quién vas a dejar mudo.
Lo que queda como regla#
Un secreto que nadie puede leer está bien guardado. Un secreto que nadie sabe quién usa está mal inventariado. Son dos cosas distintas, y la segunda es la que duele al rotar.
Rotar es cambiar en todos lados, en orden, a la hora correcta. Cualquiera de las tres mal hecha es un proceso callado que nadie va a extrañar hasta que haga falta.
Y el valor no pasa por pantallas. Archivo temporal, portapapeles, y a borrar. Lo que se puede leer se puede filtrar.
Caso real de nuestra propia plataforma. Los nombres de los sistemas son reales porque son herramientas, no clientes; los clientes cuyos procesos dependen de esa credencial no se identifican.