Installation sécurisée de Jeedom avec Docker

Renaud Cerrato
Jan 5 · 7 min read

C’est la deuxième fois cette année que la carte SD de mon installation de Jeedom sur Raspberry Pi rend l’âme. Heureusement, mes sauvegardes sont en sécurité sur Google Drive.

Mais plutôt que de racheter une énième carte SD, ou de la remplacer par un disque externe, j’ai décidé de me passer de Raspberry Pi et d’installer Jeedom sur mon serveur. Aprés tout, il dispose déjà d’un disque et cela me permettra de recycler mon Raspberry Pi pour autre chose.

Il est aussi tout à fait possible d’installer Jeedom dans un Docker sur Raspberry Pi, les avantages sont réels.

La documentation officielle au sujet de l’installation de Jeedom avec Docker est vraiment succincte, mais surtout incomplète et peu recommandable car elle préconise de lancer le conteneur en mode privilégié, ce qui est inacceptable d’un point de vue sécurité.

Les conteneurs privilégiés ont virtuellement les mêmes droits d’accès à la machine hôte que n’importe quel processus root s’exécutant sur l’hôte. Si un seul conteneur privilégié est compromis, alors l’hôte et l’intégralité de vos conteneurs sont aussi compromis.

Au delà de cet aspect sécuritaire, la documentation n’explique pas comment attacher votre RFXCom ou votre Z-Stick Gen5 (pour n’en citer que deux) ou s’assurer que le conteneur se lance à chaque redémarrage de votre machine.

Pré-Requis

Mon serveur tourne sous Ubuntu 18.04, donc les commandes ci-dessous devraient fonctionner sous n’importe quelle distribution dérivée de Debian.

L’installation de docker sur une distribution Debian est très simple :

Une fois docker installé, il est possible d’ajouter le groupe docker à votre utilisateur afin de ne pas avoir à faire usage de sudo avec la commande docker:

Afin que le changement ci-dessus soit effectif, il est nécessaire de se déconnecter puis de se reconnecter de sa session.

Assurez-vous ensuite que le service docker est bien activé au démarrage (et lancé):

Installation de la base de donnée

Jeedom nécessite une base de donnée pour fonctionner, et nous allons aussi utiliser un conteneur pour cela.

La documentation officielle utilise mysql, mais je recommande mariadb qui est 100% compatible mais surtout un logiciel libre.

Le conteneur à besoin d’un emplacement sur votre machine pour stocker la base de donnée et sa configuration. Disons /opt/jeedom/mysql :

La création de notre conteneur nommé jeedom-mysql est simple. N’oubliez pas de remplacer your-sql-password par le mot de passe de votre choix:

L’utilisateur jeedom est crée automatiquement. L’option --restart always permettra au conteneur de se relancer à chaque redémarrage du système. L’option --publish expose le port 3306 du conteneur sur le port 3306 de l’hôte.

Identification des périphériques USB

Avant d’installer Jeedom, il vous faut identifier les périphériques USB que vous souhaitez utiliser avec Jeedom. Branchez votre périphérique, et surveillez la sortie de dmesg :

Sur l’exemple ci-dessus, l’on peut voir que mon Z-Stick Gen5 est associé au périphérique /dev/ttyACM1. Attention, le nom de ce périphérique n’est pas stable et peut changer car il dépend de l’ordre de détection lors du démarrage. Heureusement, sur ma distribution du moins, udev crée aussi un lien symbolique stable (et supposé unique) à partir des informations exposés par le périphérique :

Nous retiendrons donc le lien symbolique /dev/serial/by-id/usb-0658_0200-if00 au lieu de /dev/ttyACM1 dans une variable d’environnement pour la suite:

Si vous ne savez pas si udev a crée des liens symboliques pour votre périphérique, vous pouvez aussi exécuter la commande suivante pour faire une recherche :

Procédant de la même façon pour notre RFXCom :

Nous retiendrons donc le lien symbolique /dev/serial/by-id/usb-RFXCOM_RFXtrx433_08WFE3F9-if00-port0 au lieu de /dev/ttyUSB0 dans une variable d’environnement pour la suite :

Installation de Jeedom

Avant de procéder à l’installation, un petit mot important sur le mode réseau d’un conteneur : par défaut, l’interface réseau d’un conteneur est distincte de celle de l’hôte et dispose de son propre sous-réseau (habituellement 172.17.0.0/16), c’est le mode bridge. Cela signifie que votre conteneur n’est pas sur le réseau hôte et certains plugins peuvent ne pas fonctionner s’ils doivent communiquer avec des périphériques présents sur le réseau hôte : mDns et Bonjour sont deux exemples de protocole ne pouvant traverser les sous-réseaux.

Pour remedier à cela, il est possible de faire en sorte que le conteneur utilise l’interface réseau de l’hôte afin d’être sur le même réseau. Si vous êtes confortable avec cela, alors le mode host est fait pour vous.

L’espace de stockage d’un conteneur Docker étant difficilement accessible et surtout lié au cycle de vie de ce dernier, il est préférable que le répertoire d’installation de Jeedom /var/www/html soit hébergé sur la machine hôte à l’emplacement de votre choix. Disons /opt/jeedom/html :

Ci-dessous, la commande vous permettant de créer votre conteneur en mode host. N’oubliez pas de remplacer your-root-password par le mot de passe de votre choix :

Si vous préferez rester en mode bridge, vous trouverez ci-dessous la commande équivalente (j’ai mis en évidence les différences) :

Contrairement à la documentation officielle, je ne recommande pas l’utilisation de l’option --privileged pour des raisons évidentes de sécurité : donner aux conteneurs un accès sans restrictions à votre machine hôte n’est pas acceptable mais surtout non nécessaire.

De plus, contrairement à l’exemple donné dans la documentation officielle, il est très important de spécifier la version de l’image Docker de Jeedom que vous utilisez (ici master) car, si vous l’omettez, Docker va utiliser le tag latest qui est vieux de plus de 2 ans à l’heure où j’écris ces lignes :

Afin d’éviter des conflits avec d’autres services déjà présent sur l’hôte, j’ai redirigé le port 80 du conteneur sur le port 9080 de l’hôte, et fait de même pour le port SSH (9022).

L’option --device $RFXCOM:/dev/ttyUSB0 autorise l’accès de votre périphérique RFXCom (précédemment identifié) et lui assigne le périphérique /dev/ttyUSB0 dans le conteneur.

Attention, l’utilisation de l’option --device ne supporte pas l’insertion à chaud : votre périphérique doit être présent au démarrage du conteneur et ne pas être retiré. Le support du hotplug est possible à travers d’autres moyens, mais cela dépasse le cadre de cet article.

L’option --restart always permettra au conteneur de se lancer à chaque redémarrage du système. Vous pouvez désormais lancer votre conteneur et observer la progression de l’installation :

Configuration de Jeedom

Si l’installation s’est bien passé, ouvrez votre navigateur à l’adresse de votre serveur http://<ip-de-votre-serveur>:9080 et renseignez les informations de la base de donnée.

Pour le nom d’hôte de la base de donnée, utilisez localhost si vous êtes en mode host, sinon utilisez jeedom-mysql pour le mode bridge seulement.

Une fois votre base de donnée initialisée, avant de poursuivre votre installation, allez dans l’onglet “Réseaux” de la page de configuration et désactivez la gestion du réseau par Jeedom. Assurez-vous que la section “Accès Interne” soit 127.0.0.1:9080 si vous êtes en mode host, sinon 127.0.0.1:80 en mode bridge :

Votre installation de Jeedom est maintenant opérationnelle. Vos conteneurs sont correctement isolés et seront lancés à chaque redémarrage de votre machine.

La procédure permettant l’accès à distance de votre instance Jeedom via la redirection de ports de votre routeur ne change pas et dépasse le cadre de cet article. Pour la suite vous pouvez suivre la documentation officielle.

Si nécessaire, voici quelques commandes Docker qui pourraient vous être nécessaire :

Si cet article vous a été utile, n’oubliez pas de l’applaudir en cliquant plusieurs fois sur l’icône ci-dessous. Je vous recommande également de jeter un oeil à son article compagnon : “Vos Sauvegardes Jeedom sur Google Drive”.

 by the author.

Renaud Cerrato

Written by

Analog at birth but digital by design. Hardcore Android Developer. Linux devotee. Came back once from /dev/null.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade