Rotar un Macaroon de LND Comprometido en BTCPay Server

Un ejercicio de respuesta a incidentes de 5 minutos que podés correr en tu propio nodo.

El aviso de BTCPay Server del 7 de agosto es claro: actualiza a la 2.4.2 y listo. El update regenera tus macaroons automáticamente.

Es cierto, pero solo para las puertas que BTCPay controla.

Si expones tu nodo LND por tu cuenta (un reverse proxy propio, un puerto reenviado, tu propio túnel Tor), ese macaroon robado sigue vivo después del update. BTCPay no puede rotar una credencial en una puerta que no sabe que existe. Y ese es exactamente el tipo de configuración que suelen tener los operadores avanzados.

Este tutorial es para dos casos:

- (a) Expones LND por tu cuenta, además de por BTCPay.

- (b) Todavía no pudiste actualizar y quieres rotar como medida temporal.

¿Ya actualizaste a 2.4.2 en una instalación estándar y no expones LND por tu cuenta? Los macaroons ya se rotaron solos, no necesitas correr este tutorial. Sigue igual con el resto del checklist de abajo (revisar actividad sospechosa, mover fondos del hot wallet, etc.).

Primero, tranquilidad: los macaroons son credenciales de acceso, no las llaves de tus fondos. Rotarlos no mueve monedas, no cierra canales, y no cambia la identidad de tu nodo. Tu seed queda intacta.

Qué vas a hacer

  1. Identificar el macaroon actual y comprobar que funciona.
  2. Borrar los macaroons y la base de datos de la root key.
  3. Reiniciar LND desde el host.
  4. Verificar que la nueva credencial funciona y la vieja es rechazada, mismo nodo, mismos fondos.

Requisitos previos

  • Un BTCPay Server corriendo con el contenedor de LND (bitcoin): btcpayserver_lnd_bitcoin.
  • Acceso por shell al host.

El modelo mental (lee esto primero)

Un macaroon es un token firmado. LND no guarda el token como fuente de verdad, guarda una root key en macaroons.db y hornea macaroons a partir de ella cuando se necesitan.

Ese único hecho define todo el procedimiento:

Borrar los archivos .macaroon no hace nada. LND vuelve a hornear copias idénticas byte a byte a partir de la root key en el siguiente arranque. Para rotar de verdad, hay que destruir la root key macaroons.db para forzar a LND a generar una nueva.

Borra los tokens y la clave. No solo los tokens.

Paso 1 — Capturar el estado "antes"

Entra al nodo y comprueba que la credencial actual es válida.

docker exec -it btcpayserver_lnd_bitcoin bash

# ---- ahora dentro del contenedor ----

cd /root/.lnd

alias li='lncli --macaroonpath /root/.lnd/admin.macaroon'

# Identifica el macaroon actual

sha256sum admin.macaroon

# Guarda una copia para probar que después muere.

cp admin.macaroon OLD.bak

# Comprueba que funciona: el nodo responde.

li getinfo | grep identity_pubkey

Anota el identity_pubkey. Tiene que ser idéntico al final. Si cambia, rotaste el nodo, no la credencial — ese es un resultado distinto (e incorrecto).

Paso 2 — Rotar: borrar los macaroons y la root key

Sigues dentro del contenedor.

rm -f *.macaroon \

      data/chain/bitcoin/regtest/*.macaroon \

      data/chain/bitcoin/regtest/macaroons.db

ls OLD.bak     # nuestra copia guardada sobrevive

exit

Explicación: "Borrar solo los archivos .macaroon no hace nada, LND vuelve a hornear copias idénticas a partir de la root key. La root key vive en macaroons.db, así que también tiene que irse."

Nota sobre las rutas: las rutas de los macaroons codifican tu red. Este ejemplo es regtest. En un nodo real, cambia a mainnet (data/chain/bitcoin/mainnet/...). Verifica tu ruta real con ls data/chain/bitcoin/.

Paso 3 — Reiniciar LND desde el host

En el host:

docker restart btcpayserver_lnd_bitcoin

Explicación: "LND mantiene macaroons.db abierta, y es el PID 1 de su propio contenedor, no se puede reiniciar de forma limpia desde adentro. El reinicio viene desde afuera. Al arrancar sin root key, LND genera una nueva y regenera sus macaroons."

Dale unos segundos para que se desbloquee y vuelva a estar activo.

Paso 4 — Verificar: la nueva funciona, la vieja está muerta, el nodo no cambió

Entra de nuevo y compara lado a lado.

docker exec -it btcpayserver_lnd_bitcoin bash

cd /root/.lnd

alias li='lncli --macaroonpath /root/.lnd/admin.macaroon'

# Huella NUEVA — debe ser DISTINTA a la del Paso 1

sha256sum admin.macaroon

# La vieja, para comparar lado a lado

sha256sum OLD.bak

# La credencial NUEVA funciona — y es el MISMO nodo

li getinfo | grep identity_pubkey

# La credencial VIEJA es rechazada: "signature mismatch" = MUERTA

lncli --macaroonpath /root/.lnd/OLD.bak getinfo

# Limpieza

rm -f OLD.bak

exit

Explicación: "Nueva huella, la root key rotó de verdad. El nuevo macaroon funciona. La copia robada ahora es rechazada con un signature mismatch. Mismo pubkey, así que los canales y los fondos nunca se movieron. BTCPay y RTL ya se reconectaron solos."

Criterios de éxito:

Chequeo

Resultado esperado

sha256sum admin.macaroon

Distinto al del Paso 1

Nuevo macaroon con getinfo

Funciona

identity_pubkey

Igual al del Paso 1

OLD.bak getinfo

Error signature mismatch

Si se cumplen las cuatro: la cerradura cambió, la llave robada es chatarra, y el nodo nunca se movió.

Reconectar tus clientes

La conexión interna de LND de BTCPay y RTL (incluido) normalmente se reconectan solos. Todo lo que use un macaroon exportado tiene que volver a emparejarse con el nuevo:

  • Zeus / wallets móviles — vuelve a escanear el nuevo QR de conexión.
  • RTL (independiente), scripts, APIs — sube el nuevo admin.macaroon (o un macaroon de bakery con permisos acotados).
  • Cualquier integración personalizada que tenga el macaroon viejo en hex/base64 — actualízala.

La credencial vieja ahora es inválida en todos lados, así que todo lo que no actualices va a fallar en la autenticación hasta que lo vuelvas a emparejar. Ese es justamente el objetivo.

Dónde entra esto en la respuesta completa

Rotar el macaroon es un paso. Para el incidente del 7 de agosto, la lista completa es:

  1. Actualizar a 2.4.2 — Panel de Admin → Server → Maintenance → Update. Confirma la versión en el pie de página y que LND quedó en la 0.21.1. En una instalación estándar, esto ya regenera los macaroons automáticamente. (¿No puedes actualizar ahora? Apaga el servidor, un servidor apagado no se puede explotar.)
  2. Rotar macaroons + macaroons.db manualmente — este tutorial. Necesario solo si expones LND por tu cuenta (proxy, Tor o puerto propio) o mientras no puedes actualizar todavía.
  3. Rotar la autenticación en cada backend de Lightning y actualizar las integraciones.
  4. Sacar los fondos de cualquier hot wallet on-chain creada por BTCPay, y después recrearla.
  5. Actualizar NBXplorer a 2.6.10 si lo usas.

En la mayoría de los casos, el update ya cambia la cerradura por ti. Los pasos manuales de rotación son para las puertas que BTCPay no puede ver ni cerrar por sí solo.

Alerta de estafa

Después de los avisos públicos, aparecen estafas de "te ayudo a migrar tus fondos". La regla nunca cambia:

Ninguna parte legítima, ni BTCPay, ni nadie te va a pedir jamás tu seed, clave privada, contraseña o macaroons.

Verifica cada instrucción contra los canales oficiales antes de actuar.

Preguntas que este tutorial responde de antemano:

  • "¿Pierdo mis canales de Lightning si regenero los macaroons?" — No. Los macaroons son credenciales de acceso, no llaves de fondos. Los canales y los balances quedan intactos.
  • "¿Afecta esto a mi hardware wallet?" — No. Este es un problema del operador del servidor, separado de cualquier incidente de hardware wallet.

¿List@ para empezar?

Elige tu primer curso y empieza hoy mismo.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

SIGUENOS