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

De Get Docs
Aller à :navigation, rechercher

Introduction

Node-RED est un standard pour l'Internet des objets, un outil visuel qui vous aide à connecter vos applications, sites Web et matériels préférés pour faire des choses nouvelles et utiles. Le plus souvent comparé à IFTTT ou au regretté Yahoo Pipes, Node-RED possède une interface beaucoup plus puissante et flexible, et une grande communauté open source créant des nœuds pour interagir avec une grande variété de applications et services.

Dans ce didacticiel, nous allons installer Node.js et Node-RED, obtenir un certificat SSL de Let's Encrypt et utiliser Nginx pour gérer les 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 ce didacticiel de configuration du serveur Ubuntu 16.04. Pour ce didacticiel, nous utiliserons un utilisateur appelé sammy, mais vous pouvez bien sûr choisir ce que vous voulez et le remplacer si nécessaire.
  • 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é dans Comment installer Nginx sur Ubuntu 16.04
  • Un nom de domaine pointé vers votre serveur, comme décrit dans Comment configurer un nom d'hôte avec DigitalOcean. Ce didacticiel utilisera node-red.example.com tout au long.
  • Let's 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 guidera à travers les étapes nécessaires. Vous pouvez ignorer les étapes concernant la configuration de Nginx (étapes 3 à 5), car nous en parlerons ici. Assurez-vous simplement d'obtenir un certificat émis avec succès et configurez la tâche cron pour gérer les renouvellements automatiques.

Étape 1 - Installation de Node.js et npm

Ubuntu 16.04 facilite l'installation de la dernière version de support à long terme (LTS) de Node.js, 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 Node.js Foundation continuera à prendre en charge cette version pendant 30 mois à compter de sa date de sortie du 12 octobre 2015.

Remarque : Il est important d'installer la version -legacy du package car les scripts de démarrage de Node-RED s'attendent à ce que votre binaire Node.js soit nommé node, mais le package standard utilise nodejs à la place. Cela est dû à un conflit de nom avec un package préexistant.


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

node -v

Vous verrez Node.js afficher son numéro de version :

Outputv4.2.6

Node Package Manager (npm) vous aide à installer et à gérer les packages logiciels Node.js, et 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'assistance appelé node-red-admin.

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

npm installe normalement ses packages dans votre répertoire actuel. Ici, nous utilisons l'indicateur -g pour installer les packages "globalement" afin qu'ils soient placés dans des emplacements système standard tels que /usr/local/bin. Le drapeau --unsafe-perm nous aide à éviter certaines erreurs qui peuvent apparaître lorsque npm essaie de compiler des modules natifs (modules écrits dans un langage compilé tel que C ou C++ vs. JavaScript).

Après un peu de téléchargement et de mélange de fichiers, vous serez renvoyé à l'invite de ligne de commande normale. Testons notre installation.

Tout d'abord, 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 "Bienvenue dans Node-RED" seront imprimés sur le terminal. Sur votre ordinateur, pointez un navigateur Web sur le port 1880 du serveur. Dans notre exemple, c'est http://node-red.example.com:1880. L'interface d'administration principale de Node-RED se chargera.

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

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

Afin de démarrer Node-RED automatiquement au démarrage, nous devrons installer un fichier node-red.service au lieu du script d'initialisation plus traditionnel. En effet, Ubuntu 16.04 est la première version LTS qui utilise systemd pour son système d'initialisation. Vous pouvez trouver un résumé de cela et d'autres modifications d'Ubuntu 16.04 dans Quoi de neuf dans Ubuntu 16.04.

Ouvrez un fichier de service vierge nommé 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/sammy/
User=sammy
Group=sammy

[Install]
WantedBy=multi-user.target

Une explication complète des fichiers de service systemd va au-delà de ce didacticiel, mais vous pouvez en savoir plus en lisant Systemd Essentials : Travailler avec les services, les unités et le 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 doit être démarré après le fonctionnement de la mise en réseau et de syslog.

/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 certaines options d'économie de mémoire à Node.js. Cela devrait lui permettre de bien fonctionner sur n'importe quel 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 plante, et KillSignal indique à systemd la meilleure façon 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 consigne toutes les sorties dans le service syslog.

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

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

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

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

[Install]
WantedBy=multi-user.target

WantedBy indique les cibles sous lesquelles notre service doit fonctionner. 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

Démarrons manuellement le service maintenant pour tester 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 de retour. Si c'est le cas, fermez-le jusqu'à ce que nous sécurisons l'installation à 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 précédemment configurés), puis transmettra le trafic à Node-RED.

Oouvrez une nouvelle configuration Nginx pour le site.

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

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 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. Expliquons ce que fait ce fichier.

Les trois premières lignes indiquent à Nginx sur quels ports écouter et à quel nom de domaine répondre. Les lignes ssl_certificate et ssl_certificate_key pointent vers les certificats que nous avons récupérés 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 indiquons ici notre service Node-RED. Il est disponible sur localhost, au port 1880, nous lui transmettons donc les connexions là-bas. Le reste de ce bloc de configuration définit certains en-têtes qui sont importants pour le bon fonctionnement du proxy. Les en-têtes Upgrade et Connection sont particulièrement importants pour gérer les connexions websocket de Node-RED.

Enfin, nous avons un bloc pour nous assurer que les réponses au défi Let's Encrypt continuent d'être récupérées à partir 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, redémarrez Node-RED.

sudo systemctl start node-red

Encore une fois, accédez à votre serveur : http://node-red.example.com. Vous devriez être redirigé vers https://node-red.example.com (notez le https) et voir l'interface d'administration Node-RED. Cela signifie que nous utilisons maintenant Node-RED via Nginx. Nous avons juste quelques ajustements supplémentaires pour verrouiller Node-RED, puis nous aurons terminé.

Étape 5 - Sécurisation de Node-RED et conclusion

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 à sens unique, et l'utilisons à la place. Nous utiliserons node-red-admin pour créer le hachage :

node-red-admin hash-pw

Un mot de passe vous sera demandé. 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 vers le bas et décommentez le bloc adminAuth (en supprimant le "//" devant chaque ligne). Remplacez username par ce que vous voulez et collez le hachage dans le champ password.

paramètres.js

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

Pendant que le fichier est ouvert, décommentez également la ligne uihost en supprimant le // 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 accessible directement par le monde extérieur (il ne sera accessible que via le proxy Nginx). Vous pouvez maintenant enregistrer et fermer le fichier.

Mettez à jour le pare-feu une dernière fois, juste 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://node-red.example.com et vous verrez un écran de connexion au lieu de l'interface d'édition principale.

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, mandatée par Nginx en utilisant Let's Encrypt pour ses certificats SSL. Connectez-vous et obtenez le câblage ! Il y a beaucoup plus d'informations et d'inspiration de projet disponibles sur le site Web de Node-RED.