Para asegurar Node-RED tienes que blindar tres cosas: quién puede abrir el editor, cómo se cifra el tráfico hacia él y cómo se comunican tus flujos con sistemas externos, como un broker MQTT. Esta lista recorre cada ajuste de settings.js, con comandos que puedes copiar, para que acabes con una instancia que se pueda dejar funcionando en una red con seguridad.
Por qué Node-RED necesita bastionado
Recién instalado, Node-RED no tiene login en el editor y sirve HTTP sin cifrar en el puerto 1880. Ese comportamiento predeterminado es cómodo en un portátil y peligroso en cualquier otro sitio. Cualquiera que pueda llegar al editor puede desplegar un nodo function o un nodo exec, lo que significa que puede ejecutar comandos arbitrarios en el host con los permisos de Node-RED. Los escáneres de internet encuentran con regularidad editores de Node-RED expuestos y sin autenticación, así que trata el editor como una consola de administración, no como una página web.
Node-RED también guarda secretos: contraseñas de broker, tokens de API, credenciales de bases de datos. Y como a menudo hace de puente entre las redes de tecnología operacional (OT) y las de TI, por ejemplo en plantas de manufactura, instalaciones mineras o edificios inteligentes, una instancia comprometida puede ser un trampolín hacia lugares a los que los atacantes nunca deberían llegar.
Esta es la lista completa; las secciones siguientes explican cada punto.
| # | Control | Dónde |
|---|---|---|
| 1 | Exigir login en el editor (adminAuth) |
settings.js |
| 2 | Servir el editor por HTTPS | settings.js o proxy inverso |
| 3 | Definir un credentialSecret explícito |
settings.js |
| 4 | Proteger endpoints HTTP y paneles | settings.js / configuración del panel |
| 5 | Limitar la exposición de red | Dirección de escucha, firewall, VPN |
| 6 | Ejecutar con el mínimo privilegio | Usuario del sistema, contenedor |
| 7 | Controlar los nodos y módulos instalados | settings.js, paleta |
| 8 | Usar TLS y credenciales únicas para MQTT | Nodo de configuración del broker |
| 9 | Mantener Node-RED y sus nodos actualizados | Rutina de actualización |
| 10 | Mantener los secretos fuera de los flujos y de git | Credenciales, entorno, proyectos |
1. Exige un login para el editor
Genera un hash bcrypt de una contraseña robusta con la herramienta de administración de Node-RED:
npx node-red admin hash-pw
# Password: ********
# $2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y
Después añade adminAuth a settings.js (~/.node-red/settings.js, o /data/settings.js en Docker):
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2b$08$REPLACE_WITH_YOUR_HASH",
permissions: "*"
},
{
username: "viewer",
password: "$2b$08$REPLACE_WITH_ANOTHER_HASH",
permissions: "read"
}
]
},
Reinicia Node-RED y el editor mostrará una pantalla de login. El permiso read permite ver los flujos sin desplegar, lo que encaja con operadores y auditores. Da a cada persona su propia cuenta en lugar de compartir una contraseña de administrador, para poder retirar el acceso cuando alguien se marche. Para equipos más grandes, adminAuth también admite estrategias OAuth y OpenID Connect mediante Passport, así que puedes usar tu proveedor de identidad actual.
2. Sirve el editor por HTTPS
Un login sobre HTTP sin cifrar envía el token de sesión por la red en texto claro. Activa HTTPS directamente en Node-RED o termina TLS en un proxy inverso.
Directamente en settings.js:
// cerca del principio de settings.js
const fs = require("fs");
module.exports = {
https: {
key: fs.readFileSync("/home/nodered/certs/privkey.pem"),
cert: fs.readFileSync("/home/nodered/certs/fullchain.pem")
},
requireHttps: true,
// ...
};
Detrás de un proxy inverso como Nginx, Caddy o Traefik, mantén Node-RED en HTTP escuchando en localhost y deja que el proxy gestione los certificados y su renovación. Asegúrate de que el proxy reenvía las actualizaciones a WebSocket, porque el editor usa un WebSocket en /comms para el estado en vivo y los mensajes de depuración.
3. Define un secreto de credenciales explícito
Node-RED cifra las credenciales de los nodos, como la contraseña de tu broker MQTT, en flows_cred.json. Si no defines una clave, genera una y la guarda en un archivo de ejecución dentro del directorio de usuario. Define la tuya, idealmente desde una variable de entorno:
credentialSecret: process.env.NODE_RED_CREDENTIAL_SECRET,
Guarda ese secreto en tu gestor de contraseñas o de secretos. Sin él, un archivo de credenciales cifrado no sirve de nada, y esa es la idea: quien copie tus archivos de flujo no podrá leer la contraseña del broker. Si cambias el secreto más adelante, Node-RED vuelve a cifrar las credenciales en el siguiente despliegue.
4. Protege los endpoints HTTP y los paneles
adminAuth solo protege el editor y la API de administración. Los flujos construidos con nodos http in y los archivos estáticos son una superficie aparte. Añade autenticación básica para ellos:
httpNodeAuth: { user: "api", pass: "$2b$08$REPLACE_WITH_HASH" },
httpStaticAuth: { user: "static", pass: "$2b$08$REPLACE_WITH_HASH" },
Para algo más elaborado que una contraseña compartida, pon delante un proxy con una autenticación adecuada o comprueba un token dentro del propio flujo. Si usas Dashboard 2.0, revisa sus propias opciones de acceso y plantéate servirlo a través del mismo proxy autenticado. Un panel de solo lectura puede seguir revelando datos de planta que preferirías mantener en privado.
5. Limita la exposición de red
La mejor superficie de ataque es ninguna. Haz que Node-RED escuche en localhost y accede a él mediante una VPN, un túnel SSH o un proxy autenticado:
uiHost: "127.0.0.1",
uiPort: process.env.PORT || 1880,
En Docker, publica el puerto solo en la dirección de loopback, por ejemplo 127.0.0.1:1880:1880, como se muestra en nuestra guía de Node-RED en Docker. Nunca redirijas el puerto 1880 de un router hacia internet. Si una instancia se ejecuta en un gateway de borde, protégela con un firewall para que solo la red de gestión pueda llegar al editor.
En sistemas de producción que nunca deberían cambiar en tiempo de ejecución, puedes ir más allá y definir disableEditor: true. Los flujos siguen ejecutándose, pero el editor y la API de administración desaparecen; despliega los cambios actualizando archivos y reiniciando.
6. Ejecuta con el mínimo privilegio
No ejecutes Node-RED como root. Usa un usuario del sistema dedicado que solo sea propietario del directorio de Node-RED. La imagen oficial de Docker ya se ejecuta como usuario sin privilegios de root. Elimina o restringe los nodos que ejecutan comandos del sistema, como exec, si tus flujos no los necesitan, mediante el ajuste nodesExcludes.
7. Controla los nodos y módulos instalados
Cada nodo de la comunidad es código que se ejecuta con los permisos de Node-RED. Instala solo nodos mantenidos que realmente necesites y revísalos antes de llevarlos a producción. Puedes restringir lo que se puede instalar desde la paleta:
externalModules: {
palette: {
allowInstall: true,
allowList: ["@flowfuse/node-red-dashboard", "node-red-contrib-modbus"]
},
modules: {
allowInstall: false
}
},
Definir modules.allowInstall como false impide que los nodos function incorporen paquetes npm arbitrarios en tiempo de ejecución.
8. Usa TLS y credenciales únicas para MQTT
Una instancia de Node-RED segura no debería comunicarse después con su broker en texto claro. En el nodo de configuración del broker MQTT:
- Usa el puerto 8883 y marca Use TLS, dejando activada la verificación del certificado.
- Usa un usuario, una contraseña y un client ID dedicados para Node-RED, distintos de los de los dispositivos. En ConnectMQ, los client IDs están vinculados a las credenciales con las que se emitieron, así que una credencial de dispositivo filtrada no puede suplantar a tu instancia de Node-RED.
- Nunca publiques datos reales en un servidor público. El servidor MQTT público gratuito de ConnectMQ es ideal para aprender, probar y hacer prototipos, pero cualquiera puede leer todos los topics de su área pública, así que no es apto para datos de producción.
La configuración completa, incluidos los archivos de CA personalizados, está en nuestra guía de Node-RED MQTT TLS, y nuestras buenas prácticas de seguridad MQTT cubren el lado del broker.
9. Mantén Node-RED y sus nodos actualizados
Las correcciones de seguridad llegan en las versiones de Node-RED, en las de Node.js y en las actualizaciones de los nodos de la comunidad. Revisa Manage palette en busca de actualizaciones de nodos, sigue las notas de versión de Node-RED y actualiza Node.js a una rama LTS con soporte. Haz antes una copia de seguridad de tu directorio de usuario y prueba las actualizaciones en una copia antes de aplicarlas en producción.
10. Mantén los secretos fuera de los flujos y de git
Las credenciales van en los campos de credenciales de los nodos de configuración, que están cifrados, no en el código de las funciones ni en los nodos inject. Lee las claves de API en los nodos function con env.get() desde variables de entorno. Si versionas los flujos con git, la función de proyectos de Node-RED cifra el archivo de credenciales con una clave de proyecto que nunca entra en el repositorio.
La documentación oficial de seguridad de Node-RED enumera todas las opciones mencionadas aquí. Para una introducción más amplia a la creación de flujos, consulta el tutorial de Node-RED MQTT.
Conecta tu Node-RED asegurado a ConnectMQ
Un Node-RED bastionado merece un broker con los mismos estándares. ConnectMQ es un broker MQTT gestionado con TLS en el 8883 mediante un certificado de Let's Encrypt, client IDs vinculados a las credenciales emitidas, aislamiento multi-tenant, protección contra inundaciones y bloqueo automático de IP tras varios intentos de login fallidos. Crea un broker con el plan Serverless gratuito en app.connectmq.com, sin tarjeta de crédito, y da a Node-RED sus propias credenciales generadas. Si estás comparando modelos de alojamiento, lee nuestra guía sobre el broker MQTT en la nube.
Preguntas frecuentes
¿Es Node-RED seguro por defecto?
No. Una instalación predeterminada no tiene login en el editor y sirve HTTP sin cifrar. Debes activar adminAuth, añadir HTTPS y restringir el acceso de red antes de exponerlo fuera de tu propia máquina.
¿Cómo pongo una contraseña al editor de Node-RED?
Genera un hash bcrypt con node-red admin hash-pw, añádelo a la sección adminAuth de settings.js y reinicia Node-RED.
¿Protege adminAuth mis paneles y endpoints HTTP?
No. Cubre el editor y la API de administración. Para los endpoints de los flujos, usa httpNodeAuth, httpStaticAuth, las opciones propias del panel o un proxy inverso con autenticación.
¿Qué ocurre si pierdo el secreto de credenciales?
Node-RED no puede descifrar flows_cred.json, así que las credenciales guardadas se pierden. Tus flujos siguen cargándose, pero debes volver a introducir contraseñas como las credenciales de tu broker MQTT.



