Configurar y Securizar Node-RED

Configurar Node-RED

Para configurar Node-RED seguir: https://nodered.org/docs/user-guide/runtime/configuration

Desde las últimas versiones es posible configurar y securizar Node-RED con un asistente ejecutando: node-red admin init que genera un fichero de configuración settings.js. Esto hace mucho más fácil empezar con Node-RED instalado bien configurado y seguro.

El fichero de configuración se encuentra normalmente en $HOME/.node-red/settings.js

El fichero de configuración por defecto es settings.js y está situado en /usr/lib/node-modules/node-red/ y puede encontrarse en https://github.com/node-red/node-red/blob/master/packages/node_modules/node-red/settings.js

Settings file: https://nodered.org/docs/user-guide/runtime/settings-file

Si no está seguro de qué archivo de configuración está usando Node-RED, debe verificar la salida del registro cuando se inicie Node-RED. Registrará la ruta completa al archivo:

  • 22 Jun 12:34:56 – [info] Settings file  : /Users/nol/.node-red/settings.js

El fichero por defecto viene con muchas opciones comentadas, para habilitarla, simplemente quitar el comentario “//”.

Al añadir una nueva opción asegurarse de añadir una coma al principio y final para separar del resto de opciones.

El fichero de flujos se encuentra por defecto en $HOME/.node-red/flows_<hostname>.json

Por defecto el directorio donde se guardan los nodos es $HOME/.node-red/nodes_modules

Existe una API de Node-RED que permite administrar remotamente en runtime: https://nodered.org/docs/api/admin/

Logging Node-RED

Ver https://nodered.org/docs/user-guide/runtime/logging

Node-RED utiliza un logger que escribe su salida en la consola. También admite el uso de módulos de logging personalizados para permitir que la salida se envíe a otra parte.

Esto se puede configurar mediante el fichero de configuración: https://nodered.org/docs/user-guide/runtime/settings-file

Securizar Node-RED (Autorización y Autenticación)

Por defecto, el editor Node-RED no está protegido: cualquier persona que pueda acceder a su dirección IP puede acceder al editor e implementar cambios.

Con node-red admin init configuro todo menos la parte de https y la contraseña de dashboard:

  • settings file
  • user security
  • proyectos
  • tema
  • editor mónaco
  • módulos externos

Para securizar Node-RED a nivel de atenticación y autorización seguir: https://nodered.org/docs/user-guide/runtime/securing-node-red para añadir usuario y password, así como otras configuraciones de seguridad

El editor y la API de administración admiten dos tipos de autenticación:

  • autenticación basada en credenciales de nombre de usuario / contraseña
  • autenticación contra cualquier proveedor de OAuth / OpenID como Twitter o GitHub

Para habilitar la autenticación basada en usuario y password, descomentar la propiedad adminAuth del fichero de configuración:

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "george",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

La propiedad de los usuarios es una matriz de objetos de usuario. Esto le permite definir múltiples usuarios, cada uno de los cuales puede tener diferentes permisos.

El nivel de permisos se puede configurar a nivel de los métodos de la API de administración: https://nodered.org/docs/api/admin/methods/

Las contraseñas se codifican de forma segura utilizando el algoritmo bcrypt

Para calcular la contraseña se usa: node-red-admin hash-pw

La herramienta le pedirá la contraseña que desea usar y luego imprimirá el hash que se puede copiar en el archivo de configuración.

Hay servicios web que permiten calcular el hash: https://passwordhashing.com/BCrypt

Command line administration: https://nodered.org/docs/node-red-admin 

Más información:

Autenticación HTTP Node-Red

Para proteger las rutas HTTP expuestas por los nodos y el dashboard se puede usar una autenticación básica.

La propiedad httpNodeAuth en su archivo settings.js se puede usar para definir un nombre de usuario y contraseña únicos que podrán acceder a las rutas.

  • httpNodeAuth: {user:»user»,pass:»$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.»},

La propiedad pass, usa el mismo formato que adminAuth utilizando el algoritmo bcrypt

Manual: https://nodered.org/docs/user-guide/runtime/securing-node-red#http-node-security

Securizar node red dashboard: https://github.com/node-red/node-red-dashboard/blob/master/README.md#securing-the-dashboard

Más información:

SSL en Node-Red

Para usar https con Node-RED seguir estos tutoriales:

Lo configuro el https en  $HOME/.node-red/settings.js

Líneas a descomentar/configurar:

var fs=require("fs")

https: {

key: fs.readFileSync('/user/myuser/privatekey.pem'),

cert: fs.readFileSync('/user/myuser/certificate.pem')

},

requireHttps: true,

Aplicar cambios de la nueva configuración con: node-red -s settings.js

Y restart node:

  • node-red-stop
  • node-red-start

Pero si tienes systemctl: systemctl start nodered.service

Como exponer un Node-Red de forma segura en Internet: https://github.com/node-red/cookbook.nodered.org/wiki/How-to-safely-expose-Node-RED-to-the-Internet

Certificados Autofirmados

Es muy fácil crear sus propios certificados SSL y claves de cifrado utilizando herramientas de software libre. Estas claves y certificados son tan seguros como los comerciales.

Utilizaremos openssl para crear nuestra propia autoridad de certificación (CA), claves de servidor y certificados.

Estos pasos nos permitirán una conexión encriptada entre el servidor y el cliente al igual que la que existe entre un cliente del navegador web y un servidor web. En este caso sólo necesitamos un certificado de servidor de confianza en el Cliente.

El servidor necesita: 

  • Certificado CA de la CA (autoridad de certificación) que ha firmado el certificado del servidor en el Broker Mosquitto (ca.crt)
  • Certificado del servidor certificado por la CA. (srv.crt)
  • Clave privada del servidor para el descifrado. (server.key)

Pasos:

  • sudo apt-get install openssl – instalar openssl
  • Crear un directorio llamado certificados en /home/pi con: mkdir certificados y entrar en el directorio para guardar los certificados y claves
  • openssl genrsa -des3 -out ca.key 2048 – Genera una RSA key privada para la CA. Pide contraseña (opción -des3)
  • openssl req -new -x509 -days 1826 -key ca.key -out ca.crt – Crear un certificado para la CA utilizando la clave de la CA que creamos en el paso anterior. Poner en CN el nombre o IP del servidor (p.e. raspberrypi.local o 192.168.1.10)
  • openssl genrsa -out server.key 2048 – Genera una RSA key privada para el servidor que será utilizada por el broker
  • openssl req -new -out server.csr -key server.key – crear una solicitud de certificado .csr. Al rellenar el formulario, el nombre común (CN) es importante y suele ser el nombre de dominio del servidor, el resto se pueden dejar vacíos. Debe utilizar el mismo nombre cuando configure la conexión del cliente. Como somos la CA, no es necesario mandar la solicitud a la CA.
  • openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360 – Utilizar la clave de la CA para verificar y firmar el certificado del servidor. Esto crea el archivo server.crt. Pide la contraseña usada para la ca.key

Con estos pasos hemos obtenido los siguientes ficheros:

  • ca.crt – Certificado de la CA
  • ca.key – Par de claves para la CA. Solo usar para crear un nuevo certificado
  • server.crt – Certificado del servidor firmado por la CA
  • server.csr – Solicitud de certificado. No es necesario.
  • server.key – Par de claves del servidor
  • ca.srl – Cada certificado emitido debe contener un número de serie único asignado por la CA. Debe ser único para cada certificado emitido por una determinada CA. OpenSSL guarda los números de serie utilizados en un archivo, por defecto tiene el mismo nombre que el archivo del certificado de la CA con la extensión sustituida por srl. Así que se crea un archivo llamado ca.srlc

Para ver el contenido de un certificado en texto, porque están codificados en base64, usar: openssl x509 -in server.crt -text -noout

Más información:

Información completa en: https://aprendiendoarduino.wordpress.com/2021/02/28/practica-4-instalar-configurar-y-securizar-mosquitto-y-node-red-en-raspberry-pi/