5

Xiaomi Roborock : contrôle à distance sécurisé avec nginx

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 certainement 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 ses ports ouverts plus tôt que tard) et que, pour l’instant, Valetudo ne propose aucun système d’authentification. Heureusement il est facile de placer Valetudo derrière un reverse-proxy comme Nginx qui nous fournira la sécurité nécessaire !

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.

5 thoughts on “Xiaomi Roborock : contrôle à distance sécurisé avec nginx”

  1. Bonjour et merci pour cet excellent tuto. Ça m’a permis de sécuriser l’accès à mon Roborock.
    Juste une petite erreur sur la commande concernant la création d’utilisateur. Il n’y a pas de guillemet à la fin.
    Pour le fichier de configuration j’ai ajouté l’extension en .conf car sinon ça ne chargeait pas la conf. Peut-etre une reeur de ma part.
    Sinon tout le reste est parfait.
    Cordialement

  2. Bonjour,
    Merci pour ce tuto qui m’as permis de sécuriser l’accès à mon Roborock.
    Cependant il y a une petite erreur qui s’est glissée dans la deuxième commande à taper. Il n’y a pas de guillemet à la fin.
    Concernant le fichier de configuration j’ai ajouté l’extension en .conf après le nom. J’avais l’impression que le fichier n’était pas pris en compte sans l’extension.
    En tous cas merci pour tout.
    Cordialement

    • En effet, une erreur de formatage en rédigeant le post je pense, merci ! (et cette série d’articles sur le Roborock meritera une mise à jour aussi à l’occasion, les devs derrière Valetudo & Dustcloud ont l’air d’avoir pas mal avancé depuis)

    • Et l’extension .conf n’est pas nécessaire, peut-etre y avait-il une autre erreur sur la première version, avant de changer le nom du fichier ?

      • Bonsoir, tout d’abord désolé pour le doublon, s’il y a possibilité de supprimer un message sur les 2 je suis preneur.
        Après mise à jour du Roborock S50 en version Valetudo 0.3.1 ( la dernière en date), je confirme que l’extension .conf n’est pas nécessaire pour le fichier de configuration de Nginx.
        En revanche pour que le service Nginx puisse démarrer il faut supprimer le fichier « default » qui se trouve dans « /etc/nginx/sites-enabled/ ».
        Je ne sais pas pourquoi mais cela fonctionne. Peut-être à rajouter dans le tuto.

        Cordialement,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *