ROAMSWITCH POUR LINUX · RÉFÉRENCE DES OPÉRATIONS
Guide des opérations CLI/sans tête
Comment faire fonctionner RoamSwitch pour Linux sans interface graphique — sur des instances cloud VPS, via SSH, à partir de cron, de scripts de surveillance et d'agents d'IA programmatiques (MCP).
- Client Edition (
roamswitch) : conçu pour les ordinateurs portables, les stations de travail mobiles et les appareils de développement. Bascule de manière autonome les profils de pare-feu nftables en fonction du niveau de confiance du réseau connecté. Ce guide se concentre principalement sur la gestion sans tête/CLI de l'édition client. - Server Edition (
roamswitch-server) : conçu pour les instances cloud VPS (AWS, GCP, DigitalOcean, Linode, etc.) et les serveurs sur site exposés directement à Internet. Comprend un filtrage des rejets par défaut entrants, une prévention du verrouillage SSH, une surveillance de l'intégrité des fichiers du chemin critique (FIM), une intégration du runtime eBPF/Falco et des notifications instantanées (Telegram/LINE/Webhooks). Pour obtenir des instructions complètes d'installation et de gestion, consultez le RoamSwitch Server Edition Manuel d'utilisation et le Livre blanc sur la sécurité du serveur. .
1. Composants
| Composant | Fonctionne comme | Rôle |
|---|---|---|
roamswitch-daemon (Client) |
racine (systemd Type=notify) |
Toutes les opérations privilégiées du client : contrôle des nftables, détection du réseau, surveillance des ransomwares/malwares, fanotify, épinglage ARP/NDP, application DNS. N'ouvre aucun socket d'écoute TCP/UDP. |
roamswitch-server-daemon (serveur) |
racine (systemd Type=notify) |
Tout le travail privilégié côté serveur : blocage par défaut du trafic entrant, protection des exceptions SSH / IP d’administration, FIM (détection de falsification de plus de 150 fichiers critiques et d’ensembles de fichiers de répertoires), réception des événements eBPF de Falco sur une socket UNIX et gel des processus (SIGSTOP), enregistreur d’exécutions, transfert d’événements (sur option) et envoi des notifications |
roamswitch (CLI) |
utilisateur de connexion (certaines actions nécessitent sudo) | État du démon de lecture du client léger. Utilise /run/roamswitch/roamswitch.sock IPC sur Client Edition ou fournit les sous-commandes --server, server, fim et emergency-restore sur Server Edition. |
roamswitch-mcp |
générés par les clients IA | Serveur MCP en lecture seule (stdio / JSON-RPC) pour la récupération programmatique de l'état par les agents IA. Voir la configuration de MCP |
roamswitch-ransomware-rollback |
root (watch s’exécute via l’unité systemd roamswitch-ransomware-rollback-watch.service) |
Outil de récupération après ransomware. Prend des instantanés de sous-volumes btrfs et de volumes logiques LVM et n’extrait que les fichiers nécessaires. Inclus dans le paquet client ; également disponible dans l’onglet « Incident Response » de l’interface |
roamswitch-app |
utilisateur de connexion | Interface graphique GTK (édition client uniquement). Non nécessaire dans les environnements sans tête. |
Un déploiement sans tête s'exécute sur le démon + roamswitch CLI (plus roamswitch-mcp si vous le souhaitez). Tous les mécanismes de défense autonomes fonctionnent sans aucune interface graphique.
roamswitch) et Server Edition (roamswitch-server) sont des packages mutuellement exclusifs (Conflicts). Déployez roamswitch-server sur des environnements de serveur.2. Démon (services systemd)
Édition client
sudo systemctl status roamswitch.service # État de fonctionnement
sudo systemctl enable roamswitch.service # Démarrage automatique au boot (activé à l'installation)
sudo systemctl restart roamswitch.service # Redémarrer
journalctl -u roamswitch.service -f # Suivre les journaux
journalctl -u roamswitch.service --since "1h ago"
Ce que fait le démon client de manière autonome au démarrage et à chaque cycle (3 s) :
- Identifie la passerelle MAC connectée et applique les profils nftables (
open/balanced/lockdown) surtrusted_networks - Détection comportementale des ransomwares (fanotify + entropie de Shannon + canaris)
- Analyse des logiciels malveillants à l'accès (fanotify, éventuellement ClamAV)
- Surveillance de l'usurpation d'identité ARP et épinglage préventif de la passerelle ARP/NDP sur des réseaux non fiables
- Renforcement du noyau (sysctl / Yama / core dumps /
/tmpnoexec) par profil - Application DNS de protection contre les menaces (
dns_enabled+dns_scope) - Link Guard (NFQUEUE) pour l'interception de phishing
- Sortie de l'état d'exécution vers
/run/roamswitch/state.json
Édition serveur
sudo systemctl status roamswitch-server.service # État de fonctionnement
sudo systemctl restart roamswitch-server.service # Redémarrer
journalctl -u roamswitch-server.service -f # Suivre les journaux
3. Référence des commandes CLI
Syntaxe de base : roamswitch <command> [options]. L'exécution sans arguments est par défaut status. La langue de sortie suit automatiquement les paramètres régionaux du système d'exploitation (LC_ALL / LC_MESSAGES / LANG).
| Commande | Autorisations | Descriptif |
|---|---|---|
status [--server] (alias report / server-status) |
Utilisateur | Évaluation de la santé de sécurité (27 éléments normalement, l’évaluation serveur à 34 éléments avec --server), score (0–100), note et conseils. --json affiche le même rapport en JSON exploitable par machine sur stdout |
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] |
Utilisateur/root | Gestion de Server Edition. config affiche et modifie les réglages, setup est l’assistant interactif, tui lance la TUI à couverture complète (roamswitch-server-tui ; toutes les actions en root, lecture seule pour les utilisateurs ordinaires), test-notify envoie une notification de test et restart redémarre le service (le rechargement de la configuration n’est pas pris en charge). ack accuse réception de l’isolation d’urgence en cours (il maintient stricte une isolation FULL et lève une isolation DEGRADED ; voir la politique d’isolation au §3). ebpf (alias incidents) affiche l’état de confinement actuel de la protection d’exécution eBPF et l’historique des incidents détectés. allowlist [list|add <rule> <process> [--exe <absolute-path>]|remove] gère la liste d’autorisation permanente des faux positifs ; lier une entrée à l’exécutable avec --exe signifie qu’un processus renommé ne peut pas en bénéficier. bans [--json] affiche la garde contre la force brute SSH et les sources bannies (la liste n'est lisible que par root), et unban <IP|/64 IPv6|--all> lève un bannissement (root) |
fim [verify|update] |
Utilisateur/root | Vérification de la surveillance de l'intégrité des fichiers du chemin critique (verify) et mise à jour de la base de données de hachage de base (update) |
bans [--json] |
Utilisateur/root | Affiche l'état de la garde contre la force brute SSH (blocage / détection seule / arrêtée, et pourquoi), les sources actuellement bloquées avec le temps restant, et les enregistrements récents. La liste des bannissements n'est lisible que par root, donc ajoutez sudo. --json disponible. Identique à server bans de la Server Edition |
unban <IP | IPv6 /64 | --all> |
racine | Lève un bannissement de la garde contre la force brute SSH et efface aussi le compteur d'échecs de cette source. --all les lève tous. Identique à server unban de la Server Edition |
emergency-restore |
racine | Supprimez toutes les isolations d'urgence eBPF/pare-feu et restaurez la base de référence du réseau. |
ports [-a|--all] |
Utilisateur | Ports d'écoute sur 0.0.0.0, bases de données non authentifiées et serveurs de développement. -a inclut des ports de bouclage uniquement |
guards |
Utilisateur | Statut des gardes de défense automatiques (anomalie de port, ARP, stockage USB, téléchargement, menace DNS, Canary, isolateur de serveur de développement, Bluetooth) |
wifi |
Utilisateur | Force de cryptage Wi-Fi (Open / WEP / WPA / filaire) et SSID |
sharing [status|on|off] |
Utilisateur | Arrêt automatique/restauration de SSH/Samba/RDP sur les réseaux non fiables (on déconnecte SSH actif lorsqu'il n'est pas fiable) |
audit-url <URL> |
Utilisateur | Inspecter le phishing d'URL et les risques de menace via le flux local + l'heuristique (ne récupère jamais la cible) |
audit-secrets <text|path|directory> |
Utilisateur | Détecter les clés API, les clés privées et les jetons dans du texte, un fichier ou un répertoire (récursif ; ignore .git/node_modules, etc.) — ne transmet jamais de données |
audit-logs [hours] |
Utilisateur | Agrège et classe les journaux système journald/auth des N dernières heures (24 par défaut). Les clés API et jetons sont automatiquement masqués. Affiche également les résultats de détection d'anomalies de motifs de journaux (nouveaux motifs et pics de fréquence statistiques). |
canary |
Utilisateur | État et intégrité du fichier leurre Ransomware Canary, et historique des incidents détectés (jusqu'aux 50 plus récents) |
port-anomaly (alias port-guard) |
Général | État de la ligne de base du Port Anomaly Guard, ports actuellement auto-isolés, et historique des incidents détectés (jusqu'aux 50 plus récents) |
quarantine [list] |
Utilisateur | Contenu du coffre-fort de quarantaine des logiciels malveillants (échantillon, chemin d'origine, nom de la menace, date) |
knowledge [query] (alias faq) |
Utilisateur | Rechercher dans la base de connaissances hors ligne |
airgap [enable|disable] |
Utilisateur/root | Déclenche ou lève l’isolation d’urgence Air-Gap (Client Edition uniquement). enable coupe tout le trafic externe (les connexions déjà ouvertes sont elles aussi coupées) et disable le rétablit. Voir « Politique d’isolation (Air-Gap) » ci-dessous pour le fonctionnement de la levée automatique |
help (--help / -h) |
Utilisateur | Afficher l'aide (roamswitch <command> --help pour l'aide des sous-commandes) |
scan-packages [DOSSIER...] |
Général | Compare les paquets OS installés (détecte automatiquement dpkg/pacman/dnf/zypper) à la correspondance CVE connue locale. Si des dossiers sont passés en argument, vérifie aussi les fichiers de verrouillage des dépendances de ce projet (npm/PyPI/crates.io et 4 autres écosystèmes). Sous Ubuntu (20.04, 22.04, 24.04, 26.04), elle utilise les données propres à Ubuntu et ne vérifie que les CVE de CVSS 7,0 ou plus pour lesquelles Ubuntu a déjà publié un correctif (« aucun résultat » ne signifie pas qu'il n'y a pas de CVE connue). Les dérivées d'Ubuntu et les versions non prises en charge sont signalées comme non couvertes, sans bascule vers les données Debian. Aucune activité réseau du tout |
scan-vulns [--confirm] |
Général | Ne s'exécute que si active_vuln_scan_enabled: true (désactivé par défaut) : vérifications d'accessibilité non authentifiée limitées à 127.0.0.1 pour Redis/Memcached/MongoDB/dockerd, détection de mauvaise configuration CORS/traversée de chemin/redirection ouverte/SSRF sur les serveurs de dev détectés, diagnostic de relais ouvert SMTP, et diagnostics d'exposition à preuve d'exploitation pour Telnet/FTP/SSH. Sans --confirm, c'est une simulation |
vuln-status |
Général | Affiche, pour chaque sonde enregistrée par scan-vulns --confirm, le dernier résultat consigné et le nombre de jours écoulés (pass_age). Le résultat est l'un des trois états — vulnérable / sûr / non concluant —, et le temps écoulé s'affiche sous la forme « aujourd'hui », « il y a N jour(s) » ou « inconnu » (jamais exécuté). Si aucun scan n'a jamais été exécuté, la commande invite à lancer d'abord scan-vulns --confirm puis se termine (il n'y a pas encore d'exécution planifiée, donc le temps écoulé ne reflète que la fréquence réelle des exécutions manuelles). Les mêmes données sont également disponibles via l'interface graphique (onglet ports) et l'outil MCP get_vulnerability_scan_history |
notifications (alias notification-history) |
Utilisateur | L’historique des notifications envoyées par RoamSwitch (anomalies d’audit des journaux, détections ClickFix, etc.) pour la semaine écoulée, les plus récentes en premier. --json affiche un tableau JSON et --export <FILE> écrit du JSON Lines |
frozen [list|resume <PID>|resume all] |
Utilisateur / root | Liste les processus que les protections (détection de chiffrement rapide par ransomware, falsification de canary, détection d’exploit noyau et confinement ciblé de la protection eBPF) maintiennent en SIGSTOP, et libère (SIGCONT) celui qui était un faux positif. Un gel n’est pas une terminaison : un processus libéré reprend exactement là où il s’était arrêté. resume all les libère tous. Libérer un processus appartenant à root exige sudo |
resource-guard (alias leak-guard) |
Utilisateur | Historique des incidents détectés par le garde contre l'épuisement des ressources et les anomalies de processus (édition Server uniquement) : croissance persistante du RSS (fuite mémoire / DoS) ou boucles de plantage dans les services exposés, avec un niveau de confiance |
timeline (alias incident-timeline) |
Utilisateur | Fusionne en une seule chronologie les détections de la protection des liens (usurpation ARP), du canary anti-ransomware, de la protection d’exécution eBPF et de la protection des ressources, avec filiation des processus et étiquettes MITRE ATT&CK (expérimental). --json affiche chaque enregistrement sous forme de tableau JSON sur stdout, et --export <FILE> écrit du JSON Lines (un enregistrement par ligne) dans un fichier |
xdp-gate [status|enable|disable] |
Utilisateur / root | Affiche ou bascule la barrière XDP au démarrage (expérimental). status indique si roamswitch-xdp-gate.service est activé ainsi que l’état actuel du programme. Désactivé par défaut |
sensor [key|list|pair|repin|unpair|request-audit|results] |
Utilisateur/root | Confiance mutuelle, par codes d’appairage, avec le capteur réseau « RoamSwitch Sensor » installé sur une machine à usage général (un produit distinct). pair --addr <IP> --code <code> --fingerprint <SHA-256> effectue l’appairage avec le code émis par Sensor (Sensor est supposé fonctionner sur une IP fixe ; l’empreinte est la valeur affichée sur l’écran de Sensor ou par roamswitch-sensor pairing show, et épingle le certificat utilisé pour TLS 1.3 — elle n’est jamais récupérée via le réseau et il n’y a aucun repli en clair). repin saisit la nouvelle empreinte après que Sensor a régénéré son certificat, key affiche la clé publique et l’adresse de ce terminal, unpair supprime l’appairage, et request-audit demande à Sensor un audit actif de vulnérabilités (récupérez le résultat avec results). Nécessite sensor_pairing_enabled: true (désactivé par défaut). Pour plus de détails, consultez le Manuel d’exploitation de Sensor |
port-scan (alias portscan) |
Utilisateur | Affiche l'historique de détection de la garde de détection de scan de ports entrants (IP source, blocage automatique ou non, durée du blocage). Une fonction différente de port-anomaly, qui détecte les ports inconnus nouvellement « exposés » |
lockfile-fim [verify|update] [--quiet|-q] |
racine | Vérifie (verify) ou réinitialise (update) la base de référence de surveillance de l’intégrité des lockfiles de dépendances. Nécessite root. Les cibles sont les dossiers de projets surveillés (lockfile_watch_dirs sur l’édition serveur) |
scan-scripts <FOLDER...> |
Utilisateur | Liste statiquement les scripts preinstall / install / postinstall / prepare déclarés par les fichiers package.json sous node_modules dans les dossiers de projets indiqués (un inventaire, pas un verdict ; aucune activité réseau) |
scan-typosquat <FOLDER...> |
Utilisateur | Compare les noms de dépendances de package.json à une liste intégrée de noms de paquets npm populaires par distance d’édition 1–2 et signale les typosquats probables (à titre indicatif ; aucune activité réseau) |
web-scan [FOLDER...] [--quarantine] [--json] |
Utilisateur/root | Recherche les webshells PHP, JavaScript, JSP et ASP, le code injecté, le PHP déguisé en image et l'abus de .htaccess avec les règles de la couche applicative web (intégrées, flux quotidien signé, règles personnelles dans /etc/roamswitch/rules.d). Sans dossier, vérifie les racines de documents de la configuration du serveur web. Vérification seule par défaut ; --quarantine (root) met en quarantaine. Code de sortie : 0 = rien, 2 = critical ou high, 1 = exécution impossible |
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] |
Utilisateur/root | Affiche l'état des règles de la couche applicative web (version, version du flux installée, dossier des règles personnelles, niveau de quarantaine, action sur les comptes, hook après détection) (status), liste les règles chargées (list), valide un fichier de règles personnelles (validate), affiche les shells de connexion désactivés par l'action sur les comptes (locked) et les rétablit (unlock-account, root), et donne des exemples de configuration et de hook (example) |
kernel-modules [--json] [--apply [MODULE...]] [--remove] |
Utilisateur/root | Vérifie, par simple lecture de fichiers (aucune communication), si les modules noyau devenus des voies pour Copy Fail, Dirty Frag et act_pedit (algif_aead, esp4, esp6, rxrpc, act_pedit) peuvent encore être chargés. --apply (root) écrit install … /bin/false dans modprobe.d pour les seuls modules inutilisés ; --remove annule. Ne compte pas dans le score du diagnostic |
audit-agent-setup [FOLDER...] [--json] |
Utilisateur/root | Vérification en lecture seule (sans réseau) des fichiers d'instructions et des skills donnés aux agents IA (~/.claude, ~/.codex, ~/.cursor, ~/.gemini, ~/.agents, ~/.openclaw, ainsi que CLAUDE.md, AGENTS.md et équivalents dans les dossiers de projet enregistrés pour l'analyse CVE des paquets et tout FOLDER indiqué) et du openclaw.json d'OpenClaw. Elle signale les caractères Unicode invisibles, les instructions écrasées, le téléchargement-exécution, les références à des fichiers secrets à côté d'un envoi, le code compilé dans un skill, l'authentification OpenClaw désactivée ou un jeton court, etc. ; ce qui se trouve dans un commentaire HTML est évalué plus haut. Le contenu des fichiers et les secrets ne sont jamais affichés. Une correspondance signifie « une personne devrait lire cette ligne », pas « malveillant ». --json affiche du JSON |
bluetooth-audit [--json] |
Utilisateur | Vérifie la configuration BlueZ (/etc/bluetooth/input.conf et main.conf) à la recherche de réglages qui laissent des appareils non appairés se connecter comme claviers, et liste les claviers et souris Bluetooth connectés (lecture seule) |
audit-npm-signatures <DIR> [--confirm] |
Utilisateur | Vérifie les signatures et la provenance des paquets installés avec npm audit signatures (la seule commande RoamSwitch qui communique avec npmjs.com ; sans --confirm, il s’agit d’une simulation ; l’édition serveur exige aussi npm_audit_signatures_enabled) |
install [--pm npm|pnpm] [--yes] |
Utilisateur | Encapsule npm / pnpm install et confine uniquement la phase des scripts de cycle de vie dans un bac à sable bwrap (le téléchargement des paquets utilise le réseau comme d’habitude) |
forward status|test|queue (alias event-forward) |
Utilisateur/root | Affiche l’état du transfert d’événements (status), envoie un événement de test (test) ou liste la file de nouvelles tentatives (queue) pour syslog RFC 5424 / CEF, JSON Lines et un webhook structuré signé par HMAC. Sur option, désactivé par défaut, et n’envoie que vers les destinations que vous configurez (Manuel d’exploitation serveur §16) |
events search|tree|export|verify|status (alias exec-events) |
racine | Recherche dans (search : --since 2h --pid N --exe S --user U --parent P --text S --json), affiche l’arbre de processus de (tree <pid>), exporte (export), vérifie la chaîne de hachage de (verify ; inviolable de façon détectable, pas infalsifiable) et affiche l’état de (status) le journal local de l’enregistreur d’exécutions. Le journal étant accessible à root uniquement, sudo est normalement nécessaire (Manuel d’exploitation serveur §15) |
Politique d’isolation (Air-Gap)
Une levée sur simple minuterie fixe permet à un attaquant patient d’attendre tout simplement : le déclencheur d’une isolation est donc classé selon son niveau de confiance (les deux éditions).
- Faible confiance (Air-Gap manuel, anomalies génériques, eBPF Error / Warning et inférieur) : restauration complète après une courte minuterie (client :
airgap_low_confidence_secs, 600 s par défaut ; serveur :safety_timer_secsdansguard.yaml, 300 s par défaut ;0désactive la minuterie). - Haute confiance (falsification d’un canary, réécriture massive de type ransomware, usurpation ARP en mode lockdown, eBPF Critical / Emergency / Alert, déclenchement répété de la même règle, etc.) : jamais restaurée silencieusement. Après la minuterie, la cause (PID gelé, canary, ARP, règle qui se redéclenche) est revérifiée et l’isolation n’est levée, avec une notification, que lorsque la disparition de la cause est vérifiée. Si cela ne peut être confirmé, que personne n’a accusé réception et que le plafond est atteint (client :
airgap_hard_cap_secs; serveur :isolation_hard_cap_secsdansserver.conf; tous deux 3600 s par défaut,0= aucun plafond), elle passe en mode DEGRADED. - Le mode DEGRADED ne s’ouvre jamais sur minuterie (le client n’autorise que le loopback ; le serveur n’autorise que les chemins d’administration SSH de maintenance et IP de la liste blanche). Il n’est levé que par une revérification confirmant la disparition de la cause, un accusé de réception explicite (serveur :
roamswitch server ack) ou une levée manuelle (le bouton de l’interface graphique /roamswitch emergency-restore). Dans le mode DEGRADED du client, le rfkill Wi-Fi n’est pas non plus levé, sauf siairgap_degraded_lift_rfkillvauttrue. - Les connexions établies autres que les chemins d’administration sont coupées (serveur : tout sauf les ports SSH de maintenance et les IP de la liste blanche, de sorte qu’un canal C2 ou un reverse shell que l’attaquant a déjà ouvert est lui aussi coupé). Un Air-Gap manuel est à faible confiance lorsqu’il provient du menu / de l’interface graphique / de
roamswitch airgap enablesans contexte d’alerte, mais lorsqu’il est lancé depuis le bouton « bloquer maintenant » d’une alerte d’usurpation ARP, il hérite de la confiance (élevée) de cette alerte, et la MAC de la passerelle est revérifiée sans émettre de trafic jusqu’à ce qu’elle corresponde à la MAC de confiance lors de vérifications consécutives (arp_recheck_consecutivevérifications couvrant au moinsarp_recheck_min_secssecondes). Chaque transition est consignée dans la chronologie des incidents.
Récupération après ransomware (instantanés et restauration de fichiers)
Les commandes suivantes appartiennent à roamswitch-ransomware-rollback (ce ne sont pas des sous-commandes de roamswitch). Son état est stocké dans /var/lib/roamswitch.
| Commande | Autorisations | Descriptif |
|---|---|---|
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] |
root | Prend tout de suite un instantané de la cible (par défaut $HOME). Les cibles sont des sous-volumes btrfs et des volumes logiques LVM |
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] |
root | Surveillance permanente. Prend automatiquement un instantané lors de rafales de réécritures de fichiers et d’événements Critical consignés par d’autres protections, et prend aussi des instantanés avant dommage selon un calendrier (toutes les 6 heures par défaut ; 4 générations sur btrfs, 2 sur LVM ; après un instantané à la détection, les instantanés périodiques sont suspendus 7 jours par défaut) |
roamswitch-ransomware-rollback list [--path PATH] [--json] |
root | Liste les instantanés créés par cet outil (type, existence, instantané avant dommage recommandé). --json pour une sortie lisible par machine |
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] |
root | Copie uniquement le fichier ou le répertoire indiqué hors d’un instantané vers un autre emplacement, sans écraser l’état actuel (par défaut <cible>/RoamSwitch-Recovered/<ID>/). Premier choix pour la récupération |
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> |
root | Rend visible le contenu d’un instantané pour choisir le chemin à passer à restore-files (btrfs : tel quel ; LVM : montage temporaire en lecture seule). À démonter ensuite avec unmount-browse |
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N |
root | Intervalle des instantanés avant dommage (secondes ; 0 désactive, sinon au moins 300). Pris en compte par un watch en cours sans redémarrage. Il n’existe aucun réglage pour désactiver les instantanés à la détection |
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] |
root | Ramène toute la cible à l’état d’un instantané (destructif). Un instantané pris à la détection contient des fichiers déjà chiffrés ; il est refusé sans --accept-tampered. Essayez d’abord restore-files |
Exemples
sudo roamswitch status # Diagnostic complet client (27 éléments)
sudo roamswitch status --server # Diagnostic complet Server Edition (34 éléments)
sudo roamswitch ports -a # Tous les ports en écoute
roamswitch guards # État des gardes
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets . # Analyser récursivement le répertoire courant
roamswitch audit-logs 72 # Analyser les journaux des dernières 72 heures
sudo roamswitch sharing on # Arrêt automatique de SSH/Samba/RDP sur réseau non approuvé
sudo roamswitch fim verify # Vérification de l'intégrité des fichiers FIM
sudo roamswitch fim update # Mettre à jour la référence FIM
sudo roamswitch emergency-restore # Lever entièrement le confinement d'urgence et restaurer
sudo roamswitch airgap enable # Confinement d'urgence
sudo roamswitch airgap disable # Lever
sudo roamswitch server ack # Accuse réception de l’isolation d’urgence (maintient stricte une isolation FULL, lève une isolation DEGRADED)
roamswitch canary # Historique des incidents du canari
roamswitch vuln-status # Affiche le dernier résultat de l'analyse et le temps écoulé (pass_age)
roamswitch port-anomaly # Historique des incidents du Port Anomaly Guard
roamswitch server ebpf # État d'isolement et historique des incidents du garde eBPF
roamswitch server bans # État de la garde contre la force brute SSH et liste des sources bannies
sudo roamswitch server unban 203.0.113.9 # Lever un bannissement de la garde SSH (root requis)
roamswitch notifications # Historique des notifications des 7 derniers jours
roamswitch frozen # Lister les processus gelés
sudo roamswitch frozen resume 12345 # Libérer un faux positif
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10 # S'appaire avec Sensor à l'aide d'un code d'appairage
sudo roamswitch sensor key # Affiche la clé publique/l'adresse propres à ce terminal
roamswitch port-scan # Historique de détection de scan de ports
roamswitch timeline --json # all incident-timeline records as JSON
roamswitch notifications --export n.jsonl # JSON Lines
sudo roamswitch events search --since 2h --exe curl
sudo roamswitch forward status
sudo roamswitch server allowlist add "<rule>" mytool --exe /usr/local/bin/mytool
sudo roamswitch sensor repin <PUBLIC_KEY> --fingerprint <NEW_FINGERPRINT>
sudo roamswitch server tui
Le démon de l'édition serveur s'exécute en tant que root ; les commandes qui doivent lire le jeu de règles nftables ou identifier le propriétaire d'un processus (status / status --server / ports -a) renvoient donc des résultats inexacts sans sudo (un faux verdict « inactif », ou des informations de processus manquantes). Les commandes qui modifient la configuration (sharing / fim update / airgap / emergency-restore, etc.) nécessitent également sudo. Toutes les autres commandes, en lecture seule, fonctionnent correctement sans sudo.
- L’option
--helppar sous-commande est prise en charge (par exempleroamswitch ports --help). - Pour une sortie exploitable par machine, utilisez
status --json,--json(un tableau JSON) et--export <FILE>(JSON Lines) surtimeline/notifications,events search --json, MCP (§6) ou/run/roamswitch/state.json(§5). - Sur l’édition client, aucune commande de la CLI ne bascule directement le profil (le démon décide de façon autonome). Pour en forcer un, définissez
manual_overridedansconfig.jsonou appelez directement la méthode IPCset_security_level(§5). statusrenvoie le code de sortie 0 quel que soit le résultat. Pour l’utiliser en supervision, analysez la ligne de score de la sortie (un exemple figure au §7).
4. Fichiers de configuration
Édition client (~/.config/roamswitch/config.json)
Le démon s'exécute en tant que root et analyse /home/*/.config/roamswitch/config.json, en utilisant le premier fichier valide qu'il trouve (ou /root/.config/roamswitch/config.json dans les environnements root uniquement).
| Clé | Type / Par défaut | Descriptif |
|---|---|---|
language | chaîne / paramètres régionaux du système d'exploitation | Langue de l'interface utilisateur et de la CLI (ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT) |
trusted_networks | [{name, mac, level}] | Réseaux de confiance ; mac est la passerelle MAC, level est open / balanced / lockdown |
away_protection_level | chaîne / lockdown | Profil par défaut sur les réseaux inconnus |
manual_override | chaîne / nul | Forcer open / balanced / lockdown (nul pour automatique) |
dns_enabled | booléen / true | Application du DNS pour la protection contre les menaces |
dns_provider | chaîne / quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | chaîne / untrusted_only | untrusted_only / always_on |
arp_spoof_guard_enabled | booléen / true | Surveillance des usurpations ARP |
gateway_arp_lock_enabled | booléen / true | Verrouillage préventif ARP/NDP de la passerelle sur les réseaux non fiables |
port_anomaly_guard_enabled | booléen / true | Bloquer automatiquement les nouveaux ports d'écoute |
system_wide_fanotify_enabled | booléen / true | Protection contre les logiciels malveillants fanotify à l'échelle du système |
pre_exec_blocking_enabled | booléen / true | Blocage de pré-exécution (FAN_DENY) |
mount_hardening_enabled | booléen / true | noexec sur /tmp et /dev/shm (appliqué sur les profils non ouverts) |
yama_memory_protect_enabled | booléen / true | Restrictions de trace Yama |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | booléen / false | Stockage USB / Protection clavier BadUSB (désactivé par défaut) |
usb_zero_trust_enabled | booléen / false | Bus USB autorisé_default=0 |
bluetooth_guard_enabled | bool / true | Désactive la « visibilité » Bluetooth sur un réseau non fiable (activé par défaut ; la radio reste allumée et les appareils connectés le restent) |
sharing_service_control_enabled | booléen / true | Arrêt/restauration automatique SSH / Samba / RDP |
scan_exclusions | [string] | Chemins absolus exclus de l'analyse |
link_guard | objet | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | booléen / false | Tunnel VPN à démarrage automatique sur des réseaux non fiables |
vpn_backend | chaîne / wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | Autorise l'exécution de scan-vulns (désactivé par défaut). Nécessite un opt-in explicite car des sondes d'accessibilité limitées à 127.0.0.1 sont envoyées |
pkgcve_watched_folders | [string] | Dossiers de projet (chemins absolus) ciblés par la vérification des dépendances de l'interface graphique. La commande CLI scan-packages ignore ce réglage et n'utilise que les dossiers passés en argument |
sensor_pairing_enabled | bool / false | Autorise la confiance mutuelle par code d'appairage avec RoamSwitch Sensor (désactivé par défaut). Requis pour utiliser la commande sensor |
port_scan_detect_enabled | bool / true | Garde de détection de scan de ports entrants |
port_scan_detect_min_distinct_ports | int / 15 | Une source se connectant à au moins ce nombre de ports distincts dans la fenêtre de détection est jugée comme un scan |
port_scan_detect_window_secs | int / 300 | Fenêtre d'agrégation pour la détection de scan (secondes) |
port_scan_block_enabled | bool / true | Bloque automatiquement l'IP source du scan détecté |
port_scan_block_duration_secs | int / 600 | Durée du blocage automatique (secondes) |
airgap_low_confidence_secs | int / 600 | Secondes avant la restauration automatique d’un Air-Gap à faible confiance (0 = jamais automatiquement). Non appliqué aux isolations à haute confiance (§3, « Politique d’isolation (Air-Gap) ») |
airgap_hard_cap_secs | int / 3600 | Secondes avant qu’une isolation à haute confiance passe en mode DEGRADED (0 = aucun plafond). Le mode DEGRADED ne s’ouvre jamais sur minuterie |
airgap_degraded_lift_rfkill | bool / false | Indique si le mode DEGRADED lève aussi le rfkill Wi-Fi (non par défaut) |
airgapAutoRfkill | bool / true | Indique si Air-Gap bloque aussi la radio Wi-Fi avec rfkill (rétablie à la levée) |
arp_recheck_consecutive | int / 3 | Nombre de vérifications consécutives pendant lesquelles la MAC de la passerelle doit correspondre à la MAC de confiance avant qu’une isolation pour usurpation ARP soit considérée comme levée (1 ou plus) |
arp_recheck_min_secs | int / 60 | Nombre minimal de secondes que doit couvrir la correspondance consécutive |
arp_recheck_active_probe | bool / true | Pour un isolement déclenché par ARP, lorsque la passerelle n'a pas d'entrée dans le cache de voisinage (et que le lien est actif), envoie une requête ARP directe pour vérifier la MAC de la passerelle. Toute réponse portant une MAC autre que la MAC de confiance compte comme une discordance. Au plus une sonde toutes les 20 secondes |
credential_access_watch_enabled | bool / true | Notifie lorsqu'un processus inattendu ouvre un fichier d'identifiants (clé privée dans ~/.ssh, ~/.aws/credentials, ~/.config/gcloud, magasin d'identifiants d'un navigateur) ; notification seule, activée par défaut. Les outils de sauvegarde et les indexeurs sont exclus d'emblée ; excluez-en d'autres avec credential_access_watch_allow. Les changements s'appliquent en 30 secondes environ. Une lecture très brève, comme cat ou head, où le programme se termine avant que RoamSwitch puisse identifier son exécutable, peut ne pas être notifiée. |
ssh_guard_* | — | Réglages de la garde contre la force brute SSH. Les 10 clés et leurs valeurs par défaut sont les mêmes que dans la Server Edition (server.conf) : ssh_guard_enabled (true), ssh_guard_block_enabled (true), ssh_guard_max_failures (6), ssh_guard_window_secs (600), ssh_guard_ban_secs (3600), ssh_guard_ban_max_secs (604800), ssh_guard_allow (vide ; un tableau d'IP / CIDR ou une chaîne séparée par des virgules), ssh_guard_log_source (auto), ssh_guard_yield_to_fail2ban (true) et ssh_guard_trust_key_days (30). Ne travaille que tant que sshd tourne. Une valeur hors limites revient à la valeur par défaut. Les changements sont pris en compte en environ une minute (sans redémarrage). Lister et lever les bannissements avec roamswitch bans et roamswitch unban |
fim_intrusion_context_enabled | bool / true | Ajoute aux notifications d'altération de fichiers (FIM) et de fichiers de verrouillage le compte et l'exécutable du processus écrivain ainsi que la connexion SSH à laquelle il appartient (source, heure, méthode d'authentification) ; pour un fichier d'identifiants, seulement si le processus appartient à une connexion SSH. Pris en compte après un redémarrage du démon. Rien n'est envoyé vers l'extérieur |
forward_* | — | Réglages du transfert d’événements (syslog / JSON Lines / webhook signé). Sur option, désactivé par défaut. Les clés sont forward_enabled, forward_syslog_url, forward_syslog_format, forward_syslog_framing, forward_tls_ca_file, forward_file_path, forward_file_max_mb, forward_file_keep, forward_webhook_url, forward_webhook_secret, forward_webhook_secret_file, forward_min_severity, forward_queue_max_mb et forward_queue_max_age_hours (types et valeurs par défaut dans le Manuel d’exploitation serveur §18) |
exec_recorder_* / exec_rule* | — | Réglages de l’enregistreur d’exécutions local et des règles de corrélation en notification seule EXR-001 à EXR-007. Activés par défaut (désactivés sur les hôtes disposant de moins de 1 Gio de mémoire ; un réglage explicite l’emporte). Les clés sont exec_recorder_enabled, exec_recorder_retention_mb, exec_recorder_retention_days, exec_recorder_hash_chain, exec_recorder_hash_exe, exec_recorder_cpu_budget_pct, exec_rules_enabled, exec_rules_disabled, exec_rule_service_users, exec_rule_window_secs et exec_rules_isolation_optin (false par défaut ; seulement lorsqu’il vaut true, les règles de gravité élevée déclenchent une isolation) |
sharing_service_control_enabled: true, la connexion à un réseau non fiable déconnecte les sessions SSH actives. Laissez-le désactivé sur les serveurs sans tête.Édition serveur (/etc/roamswitch/server.conf)
L’édition serveur utilise un fichier de configuration au format INI protégé par les permissions 0600 (root uniquement). Le type, les valeurs autorisées, la valeur par défaut et la nécessité d’un redémarrage de chaque clé figurent dans le Manuel d’exploitation serveur §18. Modifiez les clés avec roamswitch server config show|get|set ou dans l’éditeur de configuration de roamswitch server tui (les 146 clés de server.conf et guard.yaml). L’édition serveur ne prend pas en charge le rechargement de sa configuration : appliquez donc les changements avec sudo roamswitch server restart.
Machines partagées : mode administrateur uniquement
Sur une machine partagée par plusieurs personnes, sudo touch /etc/roamswitch/admin-only active le mode administrateur uniquement. Les modifications qui touchent toute la machine (pare-feu, DNS, VPN, USB, durcissement du noyau et des montages, radios, confiance de Sensor, etc.) sont alors réservées à root ou aux utilisateurs du groupe sudo, wheel ou roamswitch. Les actions liées à vos propres fichiers et processus (isolement, kill, freeze, analyses) fonctionnent comme avant. /etc/roamswitch/admin-only n'est pris en compte que s'il appartient à root et n'est pas modifiable par les autres (un utilisateur ne peut donc pas créer le fichier pour changer de mode). Désactivé par défaut (pas de fichier).
5. Journaux et fichiers d'état d'exécution
| Chemin | Cible | Descriptif |
|---|---|---|
journalctl -u roamswitch.service | Client | Journaux du démon client (commutateurs de profil, détections, erreurs) |
journalctl -u roamswitch-server.service | Serveur | Journaux du démon du serveur (événements FIM, détections Falco, isolations) |
/run/roamswitch/roamswitch.sock | Client | Socket de domaine IPC Unix du démon client |
/run/roamswitch/events.sock | Serveur | La socket d’intégration eBPF de Falco / Tetragon (root:root, mode 0600 ; Falco s’exécute aussi en root, aucune configuration de permissions supplémentaire n’est donc nécessaire) |
/run/roamswitch/state.json | Client | État du cycle : {active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | Client | File d'attente d'alertes récentes |
/run/roamswitch/approvals.json | Client | File d'attente d'approbation en attente |
/run/roamswitch/fanotify.ready | Client | Fichier d'indicateur indiquant que Fanotify Guard est en cours d'exécution |
/var/lib/roamswitch/fim.db | Serveur | Base de données de hachage de base FIM SHA-256 |
~/.local/share/roamswitch/quarantine/ | Les deux | Coffre de quarantaine (0700, échantillons 0400) + .metadata.json |
/var/lib/roamswitch/exec_log/ | Les deux | Les JSON Lines chaînés par hachage de l’enregistreur d’exécutions (root uniquement, 0600). Recherche et vérification avec roamswitch events |
/run/roamswitch/airgap_isolation.json / host_isolation.json | Les deux | L’état d’isolation (Air-Gap) (FULL / DEGRADED) et l’enregistrement du déclencheur ; l’isolation survit à un redémarrage du démon |
Appel direct d'IPC (avancé)
Le démon accepte le JSON délimité par des nouvelles lignes sur /run/roamswitch/roamswitch.sock :
# Forcer le changement de profil (édition client)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
# Revérifier immédiatement le verrouillage ARP de la passerelle
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
6. Statut programmatique (MCP)
roamswitch-mcp expose des outils en lecture seule sur JSON-RPC sur stdio (get_security_report / verify_security_findings / get_exposed_ports / get_guard_status / audit_url_safety / audit_secrets / audit_security_logs / audit_mcp_configs / audit_agent_setup / get_app_help / get_quarantine_status / get_file_scan_guard_status / verify_fim / get_port_anomaly_incidents / get_ebpf_incidents / get_resource_guard_incidents / get_port_scan_incidents / get_ssh_guard_incidents / get_canary_status / get_vulnerability_scan_history / get_notification_history / search_exec_events / get_process_tree / get_incident_timeline / get_fleet_status / get_vpn_status / get_link_guard_status / get_air_gap_status / get_sharing_services_status / get_bluetooth_guard_status / get_usb_guard_status / run_active_vuln_scan / run_package_cve_scan / run_package_cve_scan_languages / run_package_lifecycle_script_scan / run_typosquat_scan / run_npm_audit_signatures / get_sensor_audit_results).
Il ne se connecte à aucun hôte externe et s'adresse localement au socket du démon ou appelle directement roamswitch-core. get_security_report et verify_security_findings n'envoient rien non plus au réseau local (la passerelle est seulement lue dans le cache ARP et d'autres informations locales). Voir Guide de configuration MCP
7. Recettes d'automatisation
Bilan de santé cron quotidien → Envoyer un e-mail si le score tombe en dessous du seuil
#!/usr/bin/env bash
# /etc/cron.daily/roamswitch-health
out=$(runuser -u "$SUDO_USER" -- roamswitch status 2>&1)
score=$(printf '%s\n' "$out" | grep -oE '[0-9]+/100' | head -1 | cut -d/ -f1)
if [ -n "$score" ] && [ "$score" -lt 80 ]; then
printf '%s\n' "$out" | mail -s "RoamSwitch health: ${score}/100" root
fi
Surveiller la file d'attente des alertes (sondage alerts.json)
#!/usr/bin/env bash
last=0
while :; do
ts=$(jq -r 'max_by(.timestamp).timestamp // 0' /run/roamswitch/alerts.json 2>/dev/null || echo 0)
if [ "$ts" -gt "$last" ]; then
jq -c ".[] | select(.timestamp > $last)" /run/roamswitch/alerts.json | logger -t roamswitch-alert
last=$ts
fi
sleep 10
done
Vérifier la santé du garde fanotify (state.json)
jq -e '.fanotify_ready == true' /run/roamswitch/state.json >/dev/null \
|| echo "WARNING: fanotify guard is not running" >&2
8. Dépannage
| Symptôme | Résolution |
|---|---|
roamswitch se termine avec "vérifiez que roamswitch-mcp est installé" |
Le démon n'est pas en cours d'exécution → sudo systemctl start roamswitch.service (ou roamswitch-server.service). Vérifier que le socket existe |
roamswitch status montre fanotify 🔴 "garde arrêtée" |
Épuisement transitoire fs.fanotify.max_user_groups. Redémarrez avec sudo systemctl restart roamswitch.service et vérifiez dans le journal |
Le profil reste à balanced, n'atteint jamais open |
Vérifiez que la passerelle MAC est enregistrée dans trusted_networks avec level: open |
| SSH se déconnecte de manière inattendue | L'édition client a sharing_service_control_enabled: true sur un réseau non approuvé. Désactiver via roamswitch sharing off |
| Les modifications de configuration ne prennent pas effet | The client daemon reads the first of /home/*/.config/…; apply with systemctl restart roamswitch.service. For the server edition, edit /etc/roamswitch/server.conf then run sudo roamswitch server restart (no reload). |
| Communications du serveur bloquées accidentellement | Accédez à la console cloud (VNC / Série) et exécutez sudo roamswitch emergency-restore |