Xiaomi Roborock : contrôle à distance sécurisé avec nginx
Xiaomi Roborock : contrôle à distance sécurisé avec nginx
Edit : cet article est obsolète, la procédure décrite n’est pas du tout recommandée, il reste en ligne à titre informatif.
Le robot est rooté, Valetudo est installé dessus et vous pouvez désormais faire nettoyer votre appartement en toute intimité et sécurité mais il reste un problème : que faire quand vous vous rendez compte que vous avez oublié de lancer le robot avant de partir de la maison ?
Avoir le robot accessible de l’extérieur c’est facile, il vous suffit de configurer votre routeur (opération assez simple dans la plupart des box françaises – et encore mieux avec un vrai routeur tournant sous OpenWRT !) pour rediriger un port quelconque inutilisé de celui-ci vers le port 80 du robot (là où Valetudo écoute). Et éventuellement, si vous n’avez pas d’IP fixe, utiliser un service de Dynamic DNS tel que votre registrar (OVH/…) via un nom de domaine vous appartenant ou un service dédié comme no-ip.com ou dyndns.com (pareil, votre box/routeur propose normalement une option pour gérer ce DynDNS)
Mais le gros problème c’est que n’importe qui entrant votre domaine/IP avec le bon port dans son navigateur aura accès directement au robot (et qu’une IP publique se fera scanner en permanence pour découvrir des services ouverts et potentiellement exploitables) et que, pour l’instant, Valetudo ne propose aucun système d’authentification (ce qui n’est pas son rôle de toute façon). Heureusement il est facile de placer Valetudo derrière un reverse-proxy comme Nginx qui nous fournira la sécurité nécessaire !
Warning
Telle quelle cette procédure rend vulnérable votre robot à une attaque par dictionnaire ou brute force mais surtout à tout exploit concernant son OS, nginx lui-même ou le robot directement si quelquechose était possible sur le port 80 (et ni le fabricant, ni valetudo, ni vous ne vont faire la veille de sécurité nécessaire pour éviter les risques). Et au fur et à mesure que les robots-aspirateurs deviennent de plus en plus mainstream ils deviennent aussi des cibles de choix pour des pirates. Ne laissez pas tout internet découvrir que vous avez un robot accessible depuis l’extérieur via un simple scan d’IP/ports !
Pour se connecter à son robot de l’extérieur la solution sécurisé la plus simple est d’installer un serveur VPN chez vous (possible sur certaines box, notamment des Freebox ou sur n’importe quel serveur/NAS à la maison) qui vous permettra de vous connecter au réseau local depuis l’extérieur avec une sécurité quasi parfaite.
Le second choix est d’utiliser un serveur de domotique (Home Assistant par exemple) pour controler le robot en local et de se connecter à Home Assistant depuis l’extérieur, en suivant les préconisations pour le serveur de domotique de votre choix. Home Assistant a d’ailleurs les outils pour permettre d’automatiquement lancer le nettoyage quand vous quittez la maison pour ne pas avoir besoin d’accéder au robot de l’extérieur ou de se soucier de son timing.
Je laisse la procédure en ligne à titre d’information ci-dessous mais je ne recommande pas son utilisation.
La procédure
Connectez vous au robot par SSH (toujours avec le compte root) puis commencez par installer nginx (la version « core » suffit vu qu’elle contient le module d’authentification qui nous intéresse)
apt update && apt install nginx-core
Après nous allons créer l’utilisateur qui pourra se connecter à Valetudo via nginx (en remplacant roborock par ce que vous voulez)
echo -n 'roborock:' >> /etc/nginx/.htpasswd
Puis le mot de passe (qui vous sera demandé dans le shell après avoir exécuté cette commande)
openssl passwd -apr1 >> /etc/nginx/.htpasswd
Vous pouvez répéter les deux commandes au dessus plusieurs vous si vous voulez plusieurs comptes. Maintenant créons le fichier de configuration (port 8880 et domaine fictif pour l’exemple, changez à ce que vous voulez/avez)
echo "server {
listen 8880;
server_name monroborock.mamaison.com;
location / {
auth_basic \"Restricted Content\";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:80;
}
}" > /etc/nginx/sites-available/roborock
Puis on le place dans les serveurs actifs :
ln -s /etc/nginx/sites-available/roborock /etc/nginx/sites-enabled/
Il nous faut aussi modifier le serveur par défaut de Nginx qui va rentrer en conflit avec Valetudo sur le port 80 sinon. On en profite pour mettre un catch all qui affichera une page d’erreur pour tout autre domaine que ceux configuré (ou ce que vous voulez tant que ça n’écoute pas sur le port 80)
echo "server {
listen 8880 default_server;
server_name _;
return 403;
}" > /etc/nginx/sites-available/default
Il ne reste plus qu’à redémarrer nginx pour prendre en compte les modifications
service nginx restart
Et voilà votre robot est accessible depuis l’extérieur via le domaine/port choisi ! Et il va sans dire que la technique marche pour n’importe quelle interface de contrôle via navigateur que vos appareils peuvent avoir, vous avez juste à créer d’autres serveurs (sur d’autres port ou d’autres domaines) et éventuellement d’autres fichiers de mots de passe si vous ne voulez pas avoir le même pour tous vos appareils.
Astuces pour configurer le routeur/box
Pour me simplifier la vie je voulais une configuration qui me permette de toujours accéder au robot depuis monroborock.mamaison.com
y compris depuis le réseau local. Et comme je fais confiance au VLAN où mes appareils principaux sont connectés, je voulais ne pas avoir à utiliser de mot de passe pour ces appareils là.
Version “box opérateur”
Tout ce que vous pouvez faire est d’ouvrir les ports sur la box. Il faut donc configurer la box pour que le port 8880 redirige sur l’IP du robot qui sera accessible sur http://monroborock.mamaison.com:8880
depuis l’extérieur (et l’intérieur en bouclant via votre FAI)
Version routeur OpenWRT (ou similaire)
Configuration supposée : votre box est en mode “bridge” ou bien son port 80 est déjà redirigé sur le routeur juste derrière elle.
La première étape est d’indiquer au routeur que le nom d’hote monroborock.mamaison.com
est à rediriger sur l’IP du robot. Ainsi toutes les connections depuis le réseau local se feront sur le port 80 directement sur Valetudo sans passer par nginx.
Ensuite il faut ajouter une règle de firewall pour dire au routeur de rediriger les connexions entrantes sur le port 80 depuis “wan” sur l’IP du robot sur le port 8880 pour que les utilisateurs extérieurs soient filtrés par l’authentification nginx.
Et voilà ! http://monroborock.mamaison.com
fonctionne aussi bien dans la maison que dehors, ce qui est pratique pour mettre un raccourci de navigateur sur son écran d’accueil.