Comment connecter votre « Internet of Things » (IoT)  avec Node-RED sous Linux Debian

Introduction

Node-RED est un panneau de commandes pour l’ « Internet of Things »,
un outil visuel qui vous aide à connecter vos applications, sites web, et matériels ensembles pour faire des choses nouvelles et utiles.

Le plus souvent comparé à  IFTTT ou au récent Yahoo Pipes, Node-RED possède une interface beaucoup plus puissante et flexible, et une large communauté Open Source qui créée des nodes pour interagir avec une grande variété  d’apps et de services.

Dans ce tutoriel, nous installerons Node.js et Node-RED, optiendrons un certificat SSL de Let’s Encrypt, et utiliserons Nginx pour gérer des connexions sécurisées pour Node-RED.

Prérequis

Pour suivre ce tutoriel, vous aurez besoin de:

Un serveur Linux Debian avec un utilisateur non-root et une configuration firewall de base suivant   ce Ubuntu 16.04 sever setup tutorial. Pour cette installation, nous utiliserons un utilisateur nommé « nodered », mais bien sûr vous pouvez choisir le nom qui vous fait plaisir à la place.

  • Le serveur Web Nginx installé, avec le firewall paramétré pour autoriser le trafic sur les ports 80 et 443 (Nginx Full), comme expliqué dans How To Install Nginx on Ubuntu 16.04
  • Un nom de domaine pointant sur votre serveur. . Ce tutoriel utilisera node-red.activpart.com.
  • Let’s Encrypt instéllé, et un certificat généré pour le domaine configuré ci-dessus. Le tutoriel  How To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 vous guidera dans les étapes nécessaires. Vous pouvez ignorer les étapes concernant la configuration Nginx  (steps 3–5), car elles sont couvertes ici. Assurez-vous simplement que vous avez un certificat valide, et paramétrez un job cron pour gérer les renouvellements automatiques.

 Etape 1 – Installation de Node.js et npm

Lancez la commande:

sudo apt-get install nodejs-legacy

Cette commande installe Node.js v4.2.x LTS (long term support), ce qui signifie que la Node.js Foundation va continuer à supporter cette version pour 30 mois à partir de sa dat de sortie du 12 octobre 2015.

Note: Il est important d’installer la version -legacy du package car le script de démarrage de Node-RED attend que votre binaire Node.js binary soit noté node, mais le package standard utilise nodejs à la place. Ceci est du à un conflit de nom avec un package pré-existant.

Vérifiez que l’installation est réussie en vérifiant la version. Node.js vous affichera sa version. Exemple:

nodered@srv1:~$ node -v
v0.10.29
nodered@srv1:~$

Node Package Manager (npm) vous aide à installer les packages logiciels Node.js, et nous allons l’utiliser pour installer Node-RED. Installez npm avec apt-get:

sudo apt-get install npm

Pour vérifier que l’installation est réussie, demandez à npm d’afficher sa version:

nodered@srv1:~$ npm -v
1.4.21
nodered@srv1:~$

Si la version s’affiche sans erreur, nous pouvons continuer vers l’étape suivante, où nous utiliserons npm pour installer Node-RED proprement dit.

Etape 2 – Installer Node-RED

Utilisez npm pour installer node-red et un utilitaire d’assistance nommé node-red-admin.

sudo npm install -g --unsafe-perm node-red node-red-admin

npm installe normalement ses packages dans votre répertoire courant. Ici nous allons utiliser la flag -g pour installer les packages ‘globalement’ de manière à ce qu’ils soient placés dans des dossiers tels que /usr/local/bin. Le flag --unsafe-perm nous aide à éviter certaines erreurs qui peuvent surgir quand npm essaye de compiler les modules natifs (modules écrits dans un langage compilé tel que C ou C++, par opposition à JavaScript).

Après un peu de téléchargement et d’arrangements de fichiers, vous allez revenir au prompt de ligne de commande. Testons notre installation:

D’abord nous devons ouvrir un port sur notre firewall.  Node-RED par défaut utilise le port 1880, alors autorisons cela.

sudo ufw allow 1880

Et maintenant lançons Node-RED lui-même. Pas besoin de sudo, étant donné que le port 1880 est suffisamment haut pour ne pas requérir de privilèges root.

node-red

Quelques message du type « Welcome to Node-RED » vont s’afficher sur le terminal. Sur votre ordinateur, faites pointer un navigateur WEB sur le port 1880 du serveur. Dand notre exemple, c’est http://node-red.example.com:1880.

L’interface d’administration principale de Node-RED va se charger: Node-RED's main editing interface

Si cela a fonctionné vous pouvez taper CRTL+C dans votre terminal pour fermer Node-RED et retourner à l’invite de commande. Vous avez installé avec succès Node-RED et vous l’avez testé, alors maintenant nous allons le configurer pour se lancer en même temps que le système.

 

 

Etape 3 – Faire démarrer Node-RED au démarrage du système

Afin de démarrer Node-RED automatiquement au boot, vous devez installer un fichier de service node-red.service au lieu du traditionnel script traditionnel. C’est parce que Ubuntu 16.04 est le première release LTS qui utilise  systemd pour son sysème init. Vous pouvez trouver un article à ce sujet d’autres changements de Ubuntu 16.04 dans What’s New in Ubuntu 16.04. Ouvrez un nouveau fichier vide qui s’appelera node-red.service.

sudo nano /etc/systemd/system/node-red.service

 

Copiez et collez le contenu suivant, et sauvegardez le fichier à cet endroit: /etc/systemd/system/node-red.service

 

[Unit]
Description=Node-RED
After=syslog.target network.target

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog

# non-root user to run as
WorkingDirectory=/home/sammy/
User=sammy
Group=sammy

[Install]
WantedBy=multi-user.target

Une explication complète des fichiers de service systemd est hors du sujet de ce tutoriel, mais vous pouvez en apprendre plus en lisant : Systemd Essentials: Working with Services, Units, and the Journal.

Ceci dit, éclaircissons certaines des sections de notre fichier de service /etc/systemd/system/node-red.service

[Unit]
Description=Node-RED
After=syslog.target network.target

Ceci décrit notre service et indique qu’il devrait être démarré après que le réseau et syslog soient en fonctionnement.

 

[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT

ExecStart est la commande nécessaire pour démarrer notre service. Nous appelons node-red-pi au lieu du node-red complet ainsi nous pouvons passer des options d'économie de mémoire à Node.js.  Ceci est censé lui permettre de tourner correctement sur n’importe quel serveur de taille raisonnable, en fonction bien sûr du nombre de flows que vous créez dans Node-RED et de leur complexité. Restart=on-failure signifie que systemd va essayer de redémarrer Node-RED s’il se plante, et KillSignal indique à systemd la meilleure façon de quitter Node-RED pour arrêter ou redémarrer le processus.

# log output to syslog as 'node-red' SyslogIdentifier=node-red StandardOutput=syslog

Ceci définit le label utilisé dans le log, et envoie toutes les sorties vers le service syslog.

# non-root user to run as WorkingDirectory=/home/sammy/ User=sammy Group=sammy

Nous souhaitons lancer Node-RED sous un utilisateur non-root. Les lignes ci-dessus demandent à systemd de lancer Node-RED en utilisant notre utilisateur et notre groupe, et depuis notre répertoire home.

[Install] WantedBy=multi-user.target

WantedBy indique les cibles sous lesquelles notre service doit tourner. Dans ce cas, quand Ubuntu boote en mode multi-user, il saura qu’il doit aussi lancer notre service Node-RED service. Le mode Muti-user est la cible de démarrage par  défaut.

Maintenant que notre service est installé et compris, nous avons besoin de l’activer.Ceci lui permettra de s’éxecuter au démarrage.

  • sudo systemctl enable node-red

Démarrons maintenant le service manuellent pour vérifier s’il fonctionne toujours:

  • sudo systemctl start node-red

Faites de nouveau pointer un navigateur sur le port 1880 du serveur et vérifiez que Node-RED est de retour. Si c’est le cas, arrêtez-le de nouveau en attendant que nous ayons sécurisé l’installation à la prochaine étape.

  • sudo systemctl stop node-red

Etape 4 – Paramétrer Nginx

Nous allons utiliser Nginx comme proxy pour le service Node-RED. Cela signifie que Nginx va prendre  en charge toutes les connexions SSL sur le port 443 (en  utilisant les certificats Let’s Encrypt que vous avez précédement paramétrés, puis passer le trafic à Node-RED.

Ouvrez une nouvelle configuration Nginx pour le site:

  • sudo nano /etc/nginx/sites-enabled/node-red.example.com

Copiez et collez les lignes suivantes, en adaptant le nom du serveur et les chemins des certificats:

/etc/nginx/sites-enabled/node-red.example.com

server {
    listen 80;
    listen 443 ssl http2;
    server_name node-red.example.com;
    ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers On;
    ssl_session_cache shared:SSL:128m;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    location / {
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
        proxy_pass http://localhost:1880;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location '/.well-known/acme-challenge' {
        root /var/www/html;
    }
}

Enregistrez et fermez le fichier. Voyons en détail ce que fait ce fichier:

Les 3 premières lignes indiquent à Nginx quels ports écouter, et à quel nom de domaine répondre. Les lignes ssl_certificate et ssl_certificate_key pointent sur le certificat que nous avons récupéré de Let’s Encrypt. Les lignes restantes ssl_ choisissent des protocoles, ciphers, et options plus sécurisées que celles par défaut.

location / débute le bloc où nous définissons actuellement notre proxy Node-RED.

/etc/nginx/sites-enabled/node-red.example.com
if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}

Ce bloc correspond à toutes les connexions HTTP non sécurisées en clair, et les redirige vers la version HTTPS du site.

/etc/nginx/sites-enabled/node-red.example.com

proxy_pass http://localhost:1880;

We point to our Node-RED service here. It is available on localhost, at port 1880, so we pass connections to it there. The remainder of this block of configuration sets some headers that are important for proper proxy functioning. The Upgrade and Connection headers are especially important for handling Node-RED’s websocket connections.

Finally, we have a block to make sure the Let’s Encrypt challenge responses continue to be fetched from Nginx’s default web root:

/etc/nginx/sites-enabled/node-red.example.com
location '/.well-known/acme-challenge' {
    root /var/www/html;
}

Reload Nginx to pick up the new configuration.

  • sudo systemctl reload nginx

Finally, start Node-RED again.

  • sudo systemctl start node-red

Once again, navigate to your server: http://node-red.example.com. You should be redirected to https://node-red.example.com (note the https) and see the Node-RED admin interface. This means we’re now proxying Node-RED through Nginx. We just have a few more tweaks to lock down Node-RED, and then we’ll be finished.

Etape 5 – Sécuriser Node-RED et l’habiller

Now that our connection is secure, let’s add a password to the Node-RED admin. Instead of putting a bare password right into our settings file, we first make a one-way cryptographic hash of it, and use that instead. We’ll use node-red-admin to create the hash:

  • node-red-admin hash-pw

You will be prompted for a password. Type it in, press ENTER, and a hash will be printed on screen. Copy that to your clipboard and open the Node-RED settings file.

  • nano ~/.node-red/settings.js

Scroll down and uncomment the adminAuth block (by removing the « //  » in front of each line). Change username to whatever you like, and paste the hash into the password field.

settings.js
adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
        permissions: "*"
    }]
},

While we’ve got the file open, uncomment the uihost line as well by removing the // at the front of the line.

settings.js
uiHost: "127.0.0.1",

This means Node-RED will only listen on the local interface, and wont be reachable directly by the outside world (it will only be accessed through the Nginx proxy). You can now save and close the file.

Update the firewall one last time, just to make sure Node-RED is never directly accessible.

  • sudo ufw deny 1880

Finally, restart Node-RED.

  • sudo systemctl restart node-red

Navigate to https://node-red.example.com and you’ll see a login screen instead of the main editing interface.

Node-RED's login screen

If your site is showing a login screen and an https connection, you’ve set everything up correctly.

Conclusion

We now have a reasonably secure installation of Node-RED, being proxied by Nginx using Let’s Encrypt for its SSL certificates. Log in and get wiring! There is much more information and project inspiration available at Node-RED’s website.

Sources:

  • https://www.digitalocean.com/community/tutorials/how-to-connect-your-internet-of-things-with-node-red-on-ubuntu-16-04

 

 

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Blue Captcha Image
Refresh

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.