Nous vous présentons aujourd'hui un nouvel outil qui vous sera fort utile si vous utilisez des modules Yoctopuce dans un environnement réseau protégé, par exemple derrière un filtre NAT ou un pare-feu. S'il vous est déjà arrivé de vouloir interagir à distance de manière interactive, par exemple pour en changer la configuration, sachez que c'est désormais possible... même pour les YoctoHub-GSM !
Le problème
Les filtres NAT et les pare-feu jouent un rôle essentiel pour sécuriser les installations d'automatisation. En cachant entièrement ces systèmes du public, ils évitent tous les fouineurs et autres robots qui cherchent à longueur de journée les éventuelles failles de sécurité de tous les objets connectés. C'est pourquoi Yoctopuce a toujours préconisé la solution des Callback HTTP et Callback Websocket pour les interactions entre les modules Yoctopuce et les serveurs publics: l'objet connecté reste essentiellement inatteignable, et c'est lui qui sait quand et où il se connecte sur un serveur tiers.
Mais parfois on peut avoir envie d'un peu plus de liberté pour contrôler à distance des modules Yoctopuce, sans devoir écrire explicitement du code pour chaque tâche à effectuer dans un serveur de callback. Jusqu'à présent, seules deux possibilités s'offraient:
- Ouvrir un port sur le firewall pour permettre l'accès direct depuis l'extérieur. A éviter ! C'est l'approche la plus dangereuse, et même si les modules Yoctopuce sont raisonnablement robustes, vous risquez fort de vous retrouver au minimum avec des attaques de déni de service. En plus, ça n'est pas toujours possible.
- Utiliser un VPN ou un tunnel SSH pour accéder à distance au réseau local. C'est une solution générique qui fonctionne, mais elle exige du matériel ou des logiciels particuliers aux deux bouts du tunnel sécurisé, donc ça n'est pas très pratique. Dans le cas d'un réseau GSM, l'utilisation d'un réseau de nœuds avec VPN est généralement un service cher.
La solution
La solution que nous vous proposons est un petit portail de connexion sécurisé pour accéder à vos modules, écrit en Node.js, que vous pourrez facilement héberger sur le serveur public de votre choix. Le principe est très simple:
- Les YoctoHubs que vous désirez accéder se connectent par Callback Websocket sur le portail, et y restent en attente.
- Depuis n'importe où, vous pouvez vous authentifier sur le portail et ouvrir une interface Web vers le YoctoHub de votre choix. Une fois authentifié, le portail va simplement mettre bout-à-bout les websockets du YoctoHub et de l'interface Web pour vous donner un accès complet au YoctoHub.
- Le même principe pourra être utilisé si vous désirez connecter une application conçue pour travailler avec des modules Yoctopuce locaux (par exemple écrite en C#) à un YoctoHub déporté derrière un filtre NAT: vous pourrez connecter l'application au tunnel websocket sécurisé du portail, et moyennant que le contrôle d'accès est correct, votre application aura un accès complet au YoctoHub. Notez l'emploi du futur dans ce paragraphe: cette fonctionnalité nécessite une petite adaptation à notre librairie, qui n'a été faite pour l'instant que dans la librairie JavaScript/EcmaScript, mais les autres librairies suivront tout prochainement.
Principe de fonctionnement du portail de connexion sécurisé
Principe
Le portail permet de définir des sous-domaines d'inter-connexion. Chaque sous-domaine permet de connecter un YoctoHub ou un VirtualHub à un utilisateur figurant dans la liste des utilisateurs autorisés pour le sous-domaine.
Pour éviter des tentatives de connexion sur les sous-domaines, seule la page de login (page racine) est visible a priori.
La page de login sécurisée.
Les liens vers les sous-domaines, identifiant les canaux WebSocket, ne sont fournis qu'aux utilisateurs dûment identifiés sur la page de login. Dans tous les cas, l'établissement d'une connexion WebSocket entrante comportera un contrôle d'accès implicite supplémentaire, basé sur la même liste d'utilisateurs. En cliquant sur les boutons correspondant d'un sous-domaine, on peut soit se connecte directement à l'interface Web du YoctoHub correspondant, soit obtenir la page décrivant les détails de la configuration du sous-domaine. Les utilisateurs marqués comme administrateurs disposent en plus du lien permettant de configurer les domaines et les utilisateurs.
La liste des sous-domaines obtenue et la page de détails d'un sous-domaine.
Installation
Ce petit portail est basé sur les solutions standards de Node.js pour offrir un service Web simple (http://) et sécurisé (https://), avec support WebSocket simple (ws://) et sécurisé (wss://).
Ce code requiert une version récente de Node.js. Souvent, les hébergements permettent de choisir la version de Node.js à l'aide du gestionnaire de version nvm. Si c'est le cas, vous pouvez utiliser les commandes suivantes pour activer la dernière version:
nvm use node
Copiez les fichiers de gateway sur votre serveur Node.js, et lancez la commande suivante pour installer automatiquement toutes les dépendances:
Pour permettre le lancement du service sécurisé https, il vous faudra aussi mettre dans le répertoire les certificats à utiliser, sous forme de deux fichiers cert.pem et key.pem. Normalement ces fichiers devraient vous être donnés par votre fournisseur de certificat SSL ou votre hébergeur, mais vous pouvez aussi pour vos tests utiliser des certificats auto-signés créés avec OpenSSL en utilisant la ligne de commande (à taper sur une seule ligne):
Il ne reste plus qu'à lancer manuellement l'application, en indiquant les ports à utiliser respectivement pour les protocoles http et https:
Pour que votre application se lance et se relance automatiquement, vous pouvez utiliser le package forever, ou une autre solution préconisée par votre hébergeur.
Vous devrez probablement ouvrir ces deux port entrants TCP (44080 et 44443) sur votre hébergement, car le plus souvent tous les ports sont filtrés par défaut.
Pour connecter un YoctoHub ou un VirtualHub à un sous-domaine HomeAutomation par exemple, et en supposant que le serveur sur lequel vous avez installé le portail se nomme yoctohost.org avec comme port HTTP 44080, il faut configurer le callback du hub comme suit:
- Type de callback: Yocto-API callback
- Callback URL: ws://yoctohost.org:44080/HomeAutomation/callback
- Type de sécurité: WebSocket
- Mot de passe Websocket callback: selon votre choix...
- Délai de reconnection: 3 secondes
Console distante sur un YoctoHub-GSM-3G-EU
Si vous voulez vous connecter à ce hub à distance depuis une application utilisant la librairie Yoctopuce, vous utiliserez par exemple:
Ceci fonctionnera en supposant que l'utilisateur tintin ait effectivement accès au sous-domaine HomeAutomation avec ce mot de passe.
Conclusion
Il y a encore des amélioration prévues à cet outil. Pour l'instant, il n'est pas possible de combiner l'utilisation du callback websocket nécessaire à l'interaction avec un autre callback HTTP par exemple. Cette fonction viendra par la suite pour rendre cet outil encore plus utile.
Néanmoins, cette solution vous est fournie dès maintenant en code source et en l'état, sur notre site web et sur GitHub. Si vous voulez en faire un usage extensif, vous aurez probablement intérêt à reprendre le code source pour l'adapter à vos besoins. Le programme n'utilise que des packages très standards de Node.js, et le code source ne fait que quelques centaines de lignes de code, qui servent essentiellement à configurer les droits des utilisateurs. Vous pourriez par exemple si nécessaire augmenter encore la sécurité en ne permettant que les connexions identifiées par un certificat client particulier.
Dans tous les cas, n'oubliez pas de mettre à jour régulièrement la version de Node.js et des package Express.js pour installer les éventuels correctifs de sécurité sur le serveur Web embarqué.