Comment connecter votre Internet des objets avec Node-RED sur Ubuntu 16.04

introduction

Node-RED est un standard pour l’Internet des objets, un outil visuel qui vous permet de connecter vos applications, sites Web et matériels préférés pour effectuer des tâches nouvelles et utiles. Le plus souvent, comparé à IFTTT ou à Yahoo Pipes, Node-RED possède une interface beaucoup plus puissante et flexible et une grande communauté open source créant nodes pour interagir avec une grande variété d’applications et prestations de service.

Dans ce didacticiel, nous allons installer Node.js et Node-RED, obtenir un certificat SSL auprès de Let’s Encrypt et utiliser Nginx pour gérer des connexions sécurisées pour Node-RED.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Un serveur Ubuntu 16.04 avec un utilisateur sudo non-root et un pare-feu de base configuré en suivant bis Ubuntu 16.04 sever tutoriel d’installation. Pour ce tutoriel, nous allons utiliser un utilisateur appelé * sammy *, mais vous pouvez bien sûr choisir ce que vous voulez et le remplacer au besoin.

  • Le serveur Web Nginx installé, avec le pare-feu mis à jour pour autoriser le trafic sur les ports 80 et 443 (* Nginx Full *), comme expliqué à l’adresse https://www.digitalocean.com/community/tutorials/how-to-install-nginx- on-ubuntu-16-04 [Comment installer Nginx sur Ubuntu 16.04]

  • Un nom de domaine pointé sur votre serveur, comme décrit dans Comment définir un nom d’hôte avec DigitalOcean. Ce tutoriel utilisera + node-red.example.com + tout au long.

  • Laissez Encrypt installé et un certificat généré pour le domaine que vous avez configuré ci-dessus. Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 16.04 vous guider à travers les étapes nécessaires. Vous pouvez ignorer les étapes relatives à la configuration de Nginx (étapes 3 à 5), car nous allons en parler ici. Assurez-vous simplement que le certificat a bien été émis et configurez le travail + cron + pour gérer les renouvellements automatiques.

Étape 1 - Installation de Node.js et de npm

Ubuntu 16.04 facilite l’installation de la dernière version de Node.js par support à long terme (LTS) car elle est incluse dans le référentiel par défaut.

sudo apt-get install nodejs-legacy

La commande installe Node.js v4.2.x LTS (support à long terme), ce qui signifie que la fondation Node.js continuera à prendre en charge cette version pendant 30 mois à compter de sa date de publication du 12 octobre 2015.

Vérifiez que l’installation a réussi en vérifiant la version.

node -v

Node.js affichera son numéro de version:

Outputv4.2.6

Node Package Manager (+ npm +) vous aide à installer et à gérer les packages logiciels Node.js. Nous l’utiliserons pour installer Node-RED. Installez + npm en utilisant` + apt-get`.

sudo apt-get install npm

Pour vérifier que l’installation a réussi, demandez à + ​​npm + d’imprimer ses informations de version:

npm -v
Output3.5.2

S’il imprime un numéro de version sans erreur, nous pouvons passer à l’étape suivante, où nous utiliserons + npm + pour installer Node-RED lui-même.

Étape 2 - Installation de Node-RED

Utilisez + npm pour installer` + node-red + et un utilitaire d’aide appelé + node-red-admin`.

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

+ npm + installe normalement ses paquets dans votre répertoire actuel. Ici, nous utilisons l’indicateur + -g + pour installer les packages globalement, de sorte qu’ils soient placés dans des emplacements système standard tels que + / usr / local / bin +. L’indicateur + - unsafe-perm + nous aide à éviter certaines erreurs qui peuvent se produire lorsque + npm + essaie de compiler des modules natifs (modules écrits dans un langage compilé tel que C ou C ++ par rapport à JavaScript).

Après un peu de téléchargement et de brassage, vous revenez à la ligne de commande normale. Testons notre installation.

Premièrement, nous devrons ouvrir un port sur notre pare-feu. Node-RED utilise par défaut le port + 1880 +, alors permettons-le.

sudo ufw allow 1880

Et maintenant, lancez Node-RED lui-même. Aucun + sudo + n’est nécessaire, car le port + 1880 + est suffisamment élevé pour ne pas nécessiter de privilèges root.

node-red

Certains messages «Welcome to Node-RED» s’imprimeront sur le terminal. Sur votre ordinateur, pointez un navigateur Web sur le port + 1880 + du serveur. Dans notre exemple, c’est + http: //: 1880 +. L’interface d’administration principale de Node-RED sera chargée.

image: https: //assets.digitalocean.com/articles/node-red/jpWUEbI.png [Interface d’édition principale de Node-RED]

Si cela a fonctionné, vous pouvez taper + CTRL + C + dans votre terminal pour fermer Node-RED et revenir à l’invite de commande. Nous avons installé Node-RED et l’avons testé avec succès. Nous allons ensuite le configurer pour qu’il se lance lors du démarrage du système.

Étape 3 - Lancement de Node-RED au démarrage

Afin de lancer Node-RED automatiquement au démarrage, nous devrons installer un fichier + node-red.service + au lieu du script d’initiation plus traditionnel. En effet, Ubuntu 16.04 est la première version de LTS qui utilise + systemd + pour son système init. Vous trouverez un résumé de cette modification et d’autres modifications apportées à Ubuntu 16.04 à l’adresse https://www.digitalocean.com/community/tutorials/what-s-new-in-ubuntu-16-04 (Quoi de neuf dans Ubuntu 16.04]).

Ouvrez un fichier de service vierge appelé + node-red.service.

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

Copiez et collez ce qui suit, puis enregistrez et fermez le fichier.

/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//
User=
Group=

[Install]
WantedBy=multi-user.target

Une explication complète des fichiers de service systemd est au-delà de ce tutoriel, mais vous pouvez en apprendre plus en lisant https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal [Systemd Essentials: Utilisation des services, des unités et du journal].

Cela dit, décomposons 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 la mise en réseau et que syslog fonctionnent.

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

[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 de '+ node-red + afin de pouvoir transmettre des options d’économie de mémoire à Node.js. Cela devrait lui permettre de fonctionner correctement sur tout serveur de taille raisonnable, en fonction bien sûr du nombre de flux que vous créez dans Node-RED (et de leur complexité). `+ Restart = on-failure signifie que systemd essaiera de redémarrer Node-RED s’il se bloque, et` + KillS signal` indique à systemd le meilleur moyen de quitter Node-RED lorsqu’il doit arrêter ou redémarrer le processus.

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

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

Cela définit l’étiquette utilisée lors de la journalisation et enregistre toutes les sorties sur le service syslog.

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

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

Nous voulons exécuter Node-RED en tant qu’utilisateur non root. Les lignes ci-dessus indiquent à systemd de lancer Node-RED à l’aide de notre utilisateur et de notre groupe, et à partir de notre répertoire personnel.

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

[Install]
WantedBy=multi-user.target

+ WantedBy + indique les cibles sous lesquelles notre service doit être exécuté. Dans ce cas, lorsque Ubuntu démarrera en mode multi-utilisateur, il saura également lancer notre service Node-RED. Le mode multi-utilisateur est la cible de démarrage par défaut.

Maintenant que notre fichier de service est installé et compris, nous devons l’activer. Cela lui permettra de s’exécuter au démarrage.

sudo systemctl enable node-red

Commençons manuellement le service pour vérifier qu’il fonctionne toujours.

sudo systemctl start node-red

Pointez un navigateur vers le port du serveur + 1880 + et vérifiez que Node-RED est sauvegardé. Si c’est le cas, fermez-le jusqu’à ce que l’installation soit sécurisée à l’étape suivante.

sudo systemctl stop node-red

Étape 4 - Configuration de Nginx

Nous allons utiliser Nginx pour proxy le service Node-RED. Cela signifie que Nginx gérera toutes les connexions SSL sur le port + 443 + (en utilisant les certificats Let’s Encrypt que vous avez configurés précédemment), puis transmettra le trafic à Node-RED.

Ouvrez une nouvelle configuration Nginx pour le site.

sudo nano /etc/nginx/sites-enabled/

Copiez et collez ce qui suit en modifiant le nom du serveur et les chemins de certificat:

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

server {
   listen 80;
   listen 443 ssl http2;
   server_name ;
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//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. Expliquons ce que fait ce fichier.

Les trois premières lignes indiquent à Nginx les ports sur lesquels écouter et le nom de domaine auquel il faut répondre. Les lignes + ssl_certificate + et + ssl_certificate_key + pointent vers les certificats extraits de Let’s Encrypt. Les lignes + ssl_ + restantes choisissent des protocoles, des chiffrements et des options plus sécurisés que les valeurs par défaut.

+ location / + démarre le bloc où nous définissons réellement notre proxy Node-RED.

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

if ($scheme = http) {
   return 301 https://$server_name$request_uri;
}

Ce bloc correspondra à toutes les connexions http simples et non sécurisées et les redirigera vers la version https du site.

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

proxy_pass http://localhost:1880;

Nous signalons notre service Node-RED ici. Il est disponible sur + localhost +, sur le port + 1880 +, nous lui transmettons donc les connexions. Le reste de ce bloc de configuration définit des en-têtes importants pour le bon fonctionnement du proxy. Les en-têtes + Upgrade + et + Connection + sont particulièrement importants pour la gestion des connexions Websocket de Node-RED.

Enfin, nous disposons d’un bloc pour nous assurer que les réponses au défi Let’s Encrypt continuent d’être extraites de la racine Web par défaut de Nginx:

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

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

Rechargez Nginx pour récupérer la nouvelle configuration.

sudo systemctl reload nginx

Enfin, démarrez à nouveau Node-RED.

sudo systemctl start node-red

Encore une fois, accédez à votre serveur: + http: // +. Vous devriez être redirigé vers + https: // + (notez le + https +) et voir l’interface d’administration Node-RED. Cela signifie que nous sommes en train de remplacer par un proxy Node-RED par Nginx. Nous avons juste quelques ajustements à faire pour verrouiller Node-RED et nous aurons terminé.

Étape 5 - Sécurisation du nœud-RED et clôture

Maintenant que notre connexion est sécurisée, ajoutons un mot de passe à l’administrateur Node-RED. Au lieu de mettre un mot de passe nu directement dans notre fichier de paramètres, nous en faisons d’abord un hachage cryptographique unidirectionnel, et nous l’utilisons à la place. Nous allons utiliser + node-red-admin pour créer le hachage:

node-red-admin hash-pw

Vous serez invité à entrer un mot de passe. Tapez-le, appuyez sur + ENTER +, et un hachage sera imprimé à l’écran. Copiez-le dans votre presse-papiers et ouvrez le fichier de paramètres Node-RED.

nano ~/.node-red/settings.js

Faites défiler et décommentez le bloc + adminAuth + (en supprimant le «//» devant chaque ligne). Remplacez + nom d’utilisateur on par celui qui vous convient et collez le hachage dans le champ` + mot_de_passe`.

paramètres.js

adminAuth: {
   type: "credentials",
   users: [{
       username: "",
       password: "",
       permissions: "*"
   }]
},

Pendant que le fichier est ouvert, supprimez la mise en commentaire de la ligne + uihost + en supprimant le + // + situé au début de la ligne.

paramètres.js

uiHost: "127.0.0.1",

Cela signifie que Node-RED n’écoutera que sur l’interface locale et ne sera pas directement accessible par le monde extérieur (il ne sera accessible que via le proxy Nginx). Vous pouvez maintenant sauvegarder et fermer le fichier.

Mettez à jour le pare-feu une dernière fois, pour vous assurer que Node-RED n’est jamais directement accessible.

sudo ufw deny 1880

Enfin, redémarrez Node-RED.

sudo systemctl restart node-red

Accédez à + ​​https: // + et vous verrez un écran de connexion à la place de l’interface d’édition principale.

image: https: //assets.digitalocean.com/articles/node-red/W10ckeg.png [Écran de connexion de Node-RED]

Si votre site affiche un écran de connexion et une connexion + https +, vous avez tout configuré correctement.

Conclusion

Nous avons maintenant une installation raisonnablement sécurisée de Node-RED, étant mandatée par Nginx en utilisant Let’s Encrypt pour ses certificats SSL. Connectez-vous et obtenez le câblage! Beaucoup d’informations et d’inspirations sur les projets sont disponibles sur http://nodered.org [site Web de Node-RED].