Pourquoi et comment exécuter une station de test sans droits root
Lancer une station de test en root (Linux) ou en administrateur (Windows) est le moyen le plus rapide de débloquer l'accès au matériel, mais c'est une facilité qui se paie plus tard, en surface d'attaque et en fragilité au quotidien. Le réflexe le plus rentable tient en une phrase : ne faites pas tourner la station avec un compte administrateur. Ce guide part de là, puis montre jusqu'où pousser le moindre privilège sous Linux et Windows sans sacrifier ni l'accès au matériel ni le démarrage automatique.
Le raccourci et son coût
Quand l'objectif est de déployer vite, faire tourner la station entièrement en root est souvent le chemin le plus court : un périphérique a renvoyé Permission denied, et passer root débloque tout de suite. Avec le temps, ça se fige sous l'une de ces formes :
| Le raccourci, sur le terrain | Ce qu'il fait gagner | Ce qu'il coûte, sans qu'on le voie |
|---|---|---|
| Connexion auto en root, sans mot de passe | L'opérateur ouvre sa session sans attendre | Quiconque a un accès physique a la main sur toute la machine |
| Mot de passe root sur un post-it | Personne ne perd de temps à déverrouiller | Comme sans mot de passe, avec en prime une trace vers le secret |
Des appels sudo dans le code d'exécution | Le script « marche » | Chaque test s'exécute avec un pouvoir système dont il n'a pas complètement besoin |
NOPASSWD dans sudoers pour le runner | Plus aucune invite pendant le poste | Le moindre bug ou détournement grimpe en silence |
Parfois c'est l'urgence, parfois c'est un outil fournisseur qui réclame vraiment root sans échappatoire ce jour-là. Le résultat est le même, et l'addition grimpe : elle se répète sur chaque poste, ressort à chaque audit, et vous suit sur chaque machine renvoyée en réparation. La bonne règle n'est pas « ne jamais élever les droits », mais élever pour installer, jamais pour exécuter : root a sa place le temps d'une mise en place (logiciels, pilotes, règles de périphériques), pas comme identité qui enchaîne les tests, run après run.
La solution pérenne : un compte sans droits admin
Sans passer par une configuration avancée, un seul changement fait tomber l'essentiel du risque pour presque rien : l'opérateur ouvre sa session avec un compte standard, sans droits admin, et la station tourne en mode kiosque. C'est le 80/20.
| Le risque | Un compte standard + kiosque le neutralise-t-il ? |
|---|---|
| L'opérateur détourne la station pour naviguer, copier des fichiers, installer un outil | Impossible, aucun droit admin, et le kiosque masque le bureau |
| L'opérateur modifie un réglage système qu'il ne devrait pas toucher | Impossible, par design |
| Un bug sur un fichier lu corrompt tout le système | Protégé en grande partie, le processus n'écrit rien hors de la portée du compte |
| Une machine volée ou partie en réparation livre tous les secrets stockés | Limité, la portée du compte borne ce qui fuit |
Un compte standard protège autant l'opérateur de la machine que la machine de l'opérateur : il ne doit tout simplement pas pouvoir faire ce qui ne le regarde pas. Le mode kiosque fait l'objet d'un guide à part ; ce qui compte ici, c'est que le compte qui exécute la station ne soit pas administrateur. Tout ce qui suit sert à tenir cette ligne sans perdre l'accès au matériel ni le démarrage automatique.
Ce que coûte le root, côté sécurité
Le moindre privilège, c'est du confinement d'erreur : le pendant logiciel du fusible qu'on met sur un circuit au lieu de parier qu'il n'y aura jamais de court-circuit. Une station de test lit en continu des fichiers qu'elle n'a pas produits (images firmware, données de calibration, trames série, config tirée d'un partage), et le moindre bug s'exécute avec les droits du processus.
| Le risque | Compte à faibles privilèges | En root / admin |
|---|---|---|
| Rayon d'impact | Une lecture qui tourne mal abîme un seul dossier de travail | Le même bug peut écraser le système ou les données d'une autre application |
| Fuite d'identifiants | Le processus ne lit que sa propre clé API | Le processus a accès à tous les secrets de la machine |
| Chaîne d'appro. / élévation de privilèges | Une dépendance compromise reste cantonnée | Un seul paquet vérolé s'empare de la machine, sans même avoir à escalader |
| Machine perdue ou réparée | Ce qui est stocké reste borné par les droits du compte | Tout le disque et chaque identifiant sont à nu |
| Traçabilité | Les journaux rattachent chaque action à l'identité de la station | Les journaux disent root a fait X, pour tout, sans distinguer qui |
Le risque d'élévation est assez réel pour qu'un outillage sérieux refuse carrément de l'ouvrir : la CLI TofuPilot n'installe pas de service de démarrage root si le binaire se trouve dans un répertoire modifiable par l'utilisateur, car quiconque pourrait le remplacer se retrouverait root au prochain boot. Côté traçabilité, l'enjeu est aussi devenu business : un compte admin permanent sur un poste d'atelier vaut de plus en plus un échec d'audit CMMC / NIST 800-171, rédhibitoire dès qu'on fournit l'aérospatial, la défense ou un EMS exigeant. Quant au rayon d'impact, c'est ce que les équipes sécurité appellent le mouvement latéral : un attaquant qui prend pied sur une station trop permissive rebondit sur toute l'usine avant que quiconque s'en aperçoive.
« De toute façon, la station est hors ligne »
L'argument classique pour justifier le root, c'est « la station n'a pas internet, alors quel risque ? ». Il repose sur un malentendu. La station est coupée d'internet, mais elle est presque toujours raccordée à un réseau local sécurisé, visible depuis d'autres machines et souvent capable d'atteindre le MES et le serveur de production où sont centralisées les données.
Si la DSI a accepté la contrainte, franchement pénible, d'une station hors ligne, c'est justement parce que les machines et les données de ce réseau sont sensibles. « Hors ligne » ne veut donc pas dire « sécurité facultative », mais l'inverse : elle y pèse plus lourd qu'ailleurs. Une station en root sur ce réseau, c'est une porte d'entrée commode vers tout le reste : précisément le mouvement latéral que l'isolement était censé empêcher. Les supports amovibles achèvent le tableau : même hors ligne, une station reçoit des firmwares sur clé USB et repart un jour en réparation (le ver Stuxnet a atteint des systèmes industriels isolés justement par clé USB).
Le principe : élever pour installer, jamais pour exécuter
| L'opération | Faut-il élever les droits ? | Qui l'exécute |
|---|---|---|
| Installer logiciels, pilotes, règles de périphériques | Oui, une seule fois | L'admin, à la mise en place |
| Lire ou écrire sur un périphérique série/USB en fonctionnement | Non | Le compte à faibles privilèges, via groupe ou règle |
| Lancer les tests, remonter les résultats | Non | Le compte non-admin de la station |
| Flasher un firmware en I/O brut | Parfois | La seule capability utile, pas root en entier |
La suite montre comment mettre ça en place, sous Linux puis sous Windows.
Linux : mise en place au moindre privilège
Étape 1 : Faire tourner la station sous un compte sans droits
Le compte qui exécute la station doit être un utilisateur ordinaire, sans droits admin : ni root, ni membre de sudo/wheel. Sur la plupart des bancs, c'est déjà le compte operator du kiosque.
# Un compte ordinaire, sans privilèges, pour la station. Pas dans sudo/wheel/adm.
# L'opérateur ouvre sa session et lance l'UI kiosque, mais ne touche pas au système.
sudo useradd --create-home operator
id operator # à vérifier : ni sudo, ni wheel, ni admÉtape 2 : Donner accès au matériel par les groupes, pas par root
Si l'on passe root, c'est presque toujours pour une histoire de permissions de périphérique. La bonne réponse, c'est l'appartenance à un groupe : rattachez le compte operator au groupe qui possède déjà le périphérique.
# Les ports série (/dev/ttyUSB*, /dev/ttyACM*) appartiennent au groupe 'dialout'
sudo usermod -aG dialout operator
# Les instruments USB branchés à chaud relèvent en général du groupe 'plugdev'
sudo usermod -aG plugdev operator
# Repérer le groupe propriétaire du périphérique (4e colonne)
ls -l /dev/ttyUSB0
# crw-rw---- 1 root dialout 188, 0 ... /dev/ttyUSB0
# ^^^^^^^ le groupe qui donne l'accèsPour un périphérique qui n'appartient à aucun groupe standard, écrivez une règle udev (udev est le sous-système Linux qui attribue propriétaire et permissions aux périphériques au fur et à mesure qu'ils apparaissent) :
# Cibler un instrument précis par ses identifiants USB vendor/product et le
# confier au groupe 'dialout' (celui de l'opérateur). Aucun root en exécution.
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP="dialout", MODE="0660"sudo udevadm control --reload-rules && sudo udevadm triggerSi un binaire réclame un privilège noyau bien précis (par exemple l'I/O brut pour flasher un firmware), accordez-lui cette seule capability au lieu de root. Les capabilities découpent les pouvoirs de root en droits indépendants :
# N'accorder que l'I/O brut à ce binaire, rien d'autre de ce que root permet
sudo setcap cap_sys_rawio+ep /usr/local/bin/flash-tool
getcap /usr/local/bin/flash-toolÉtape 3 : Démarrer au boot sans repasser par root
C'est là que root revient d'habitude par la petite porte. Quand vous activez Lancement au démarrage, la CLI TofuPilot installe toute seule le bon service, inutile d'écrire un fichier unit à la main :
| La CLI tourne sous | Service installé | Kiosque |
|---|---|---|
operator (sans droits admin) | service systemd utilisateur (~/.config/systemd/user/) | Oui, sur l'écran local |
root | service systemd système (/etc/systemd/system/) | Non, sans écran, piloté depuis le dashboard |
Le piège qui pousse vers root : si vous activez le démarrage automatique via SSH sous le compte operator, donc dans un shell sans session graphique, systemctl --user n'a aucun bus de session auquel se connecter, et échoue :
Failed to connect to bus: No medium found
systemctl --user: Failed to connect to user scope busLa solution n'est pas de repasser en root. C'est d'autoriser les services de l'operator à tourner sans session ouverte. C'est ce que systemd appelle le lingering (comme une machine qui garde sa routine de fond active même quand personne n'est devant l'IHM) :
# Les services systemd de l'operator démarrent au boot, sans session ouverte
sudo loginctl enable-linger operator
loginctl show-user operator --property=Linger # -> Linger=yesLe lingering activé, la station sans droits root démarre à chaque boot, garde son écran kiosque et n'a plus jamais besoin de root pour se lancer. Les identifiants suivent le même compte : lancez tofupilot login --token <jeton> en tant qu'operator, surtout pas en sudo.
Étape 4 : Vérifier le moindre privilège
# Le processus de la station doit tourner sous 'operator', pas root
ps -o user,cmd -C tofupilot
# Lancer le test EN TANT QU'operator (sudo -u bascule d'identité, il n'élève pas les droits)
sudo -u operator cat /dev/ttyUSB0 # doit s'ouvrir grâce au groupe dialout, pas de « Permission denied »Windows : mise en place au moindre privilège
Même logique : le compte operator est un utilisateur standard, pas un administrateur. Windows simplifie l'essentiel, car un utilisateur standard a déjà tout ce qu'il faut pour une station de test.
| Le besoin | Le droit minimal à accorder | À éviter |
|---|---|---|
| Lire/écrire sur un port COM | Un utilisateur standard ouvre les ports COM par défaut, sans admin | Passer admin « au cas où » |
| Instrument USB via pilote fournisseur | Installer le pilote une fois en admin ; l'accès en exécution se fait par périphérique | Rester admin en exécution |
| Écrire journaux et résultats | Donner l'écriture sur un seul dossier (ex. C:\tofupilot) | Écrire sous C:\Program Files |
| Démarrer au boot | TofuPilot pose une entrée Run par utilisateur, déclenchée à l'ouverture de session, sans admin | Un service à l'échelle machine tournant en SYSTEM/admin |
# Utilisateur local standard (surtout PAS dans le groupe Administrateurs)
$pw = Read-Host -AsSecureString "Mot de passe du compte operator"
New-LocalUser -Name "operator" -Password $pw -PasswordNeverExpires `
-Description "Opérateur de station de test"
# Volontairement omis : Add-LocalGroupMember -Group "Administrators"# Donner au compte operator son propre dossier de travail, en écriture
New-Item -ItemType Directory -Path "C:\tofupilot" -Force
icacls "C:\tofupilot" /grant "operator:(OI)(CI)M"Sous Windows, la station s'exécute comme un processus rattaché à la session du compte operator : elle démarre à l'ouverture de session, sans service admin ni privilèges SYSTEM. Rangez la clé API dans l'environnement utilisateur de l'operator, ou dans un fichier sous C:\tofupilot réservé à ce seul compte, jamais à l'échelle de la machine.
Quand root reste le choix pragmatique
La bonne pratique se heurte parfois à la productivité, et celui qui connaît vraiment les contraintes, le développeur au banc en plein rush, est le mieux placé pour trancher. Chez TofuPilot, on ne bloque pas ce choix : la CLI tourne en root ou en admin si vous le décidez, parce qu'en pleine cadence, lever une friction de déploiement compte plus que d'imposer une rigueur de principe. Lancée en root, la CLI installe d'ailleurs pour vous le bon service système.
Si vous exécutez en root, faites-le en connaissance de cause et réduisez l'exposition :
| Vous tournez en root parce que… | La solution pour réduire le risque est... |
|---|---|
| un outil fournisseur ou de l'I/O brut l'exige vraiment | cibler le besoin : setcap sur ce seul binaire plutôt que root partout |
| l'accès au matériel bloque une échéance | livrer le raccourci root, puis planifier le correctif udev/groupe juste après |
| le banc est sans écran et doit démarrer au boot | garder le binaire dans /usr/local/bin, propriété de root (la CLI refuse un binaire modifiable par l'utilisateur) |
| la machine peut être volée ou partir en réparation | chiffrer le disque et garder la clé API cloisonnée et révocable |
| plusieurs opérateurs partagent la station | doubler le root d'un verrouillage kiosque, pour qu'ils ne sortent pas de l'UI de test |
L'objectif n'est pas la pureté, mais la lucidité : mesurer ce que coûte le raccourci pour décider en toute connaissance, et revenir au moindre privilège une fois l'urgence passée.
Troubleshooting
| Le symptôme | La cause | La solution |
|---|---|---|
systemctl --user: Failed to connect to user scope bus | Démarrage au boot activé depuis un shell sans session (SSH) | sudo loginctl enable-linger operator, ne repassez pas en root |
| La station ne démarre pas au boot, sans erreur | Service utilisateur installé mais lingering désactivé | Activer le lingering (ci-dessus) ; vérifier avec loginctl show-user operator |
Permission denied sur /dev/ttyUSB0 après l'abandon de root | L'operator n'est pas dans le groupe du périphérique | usermod -aG dialout operator, puis rouvrir la session ou redémarrer |
| Le périphérique répond en root mais pas sous operator | Règle udev non appliquée, ou mauvais identifiants vendor/product | Revérifier les ID avec lsusb, recharger avec udevadm control --reload-rules && udevadm trigger |
| La CLI refuse d'installer le service système root | Le binaire est dans un chemin modifiable par l'utilisateur (porte d'entrée vers root au boot) | Le déplacer dans /usr/local/bin, propriété de root, puis relancer |
| Sous Windows, le runner n'écrit plus les résultats après l'abandon de l'admin | Écriture vers un chemin protégé | Diriger la sortie vers le dossier propre de l'operator (C:\tofupilot) |