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).

Choisir l'édition
  • 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.

Forfaits mutuellement exclusifs
Client Edition (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) sur trusted_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 / /tmp noexec) 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_secs dans guard.yaml, 300 s par défaut ; 0 dé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_secs dans server.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 si airgap_degraded_lift_rfkill vaut true.
  • 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 enable sans 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_consecutive vérifications couvrant au moins arp_recheck_min_secs secondes). 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.

Mises en garde et limites
  • L’option --help par sous-commande est prise en charge (par exemple roamswitch ports --help).
  • Pour une sortie exploitable par machine, utilisez status --json, --json (un tableau JSON) et --export <FILE> (JSON Lines) sur timeline / 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_override dans config.json ou appelez directement la méthode IPC set_security_level (§5).
  • status renvoie 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
languagechaîne / paramètres régionaux du système d'exploitationLangue 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_levelchaîne / lockdownProfil par défaut sur les réseaux inconnus
manual_overridechaîne / nulForcer open / balanced / lockdown (nul pour automatique)
dns_enabledbooléen / trueApplication du DNS pour la protection contre les menaces
dns_providerchaîne / quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopechaîne / untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabledbooléen / trueSurveillance des usurpations ARP
gateway_arp_lock_enabledbooléen / trueVerrouillage préventif ARP/NDP de la passerelle sur les réseaux non fiables
port_anomaly_guard_enabledbooléen / trueBloquer automatiquement les nouveaux ports d'écoute
system_wide_fanotify_enabledbooléen / trueProtection contre les logiciels malveillants fanotify à l'échelle du système
pre_exec_blocking_enabledbooléen / trueBlocage de pré-exécution (FAN_DENY)
mount_hardening_enabledbooléen / truenoexec sur /tmp et /dev/shm (appliqué sur les profils non ouverts)
yama_memory_protect_enabledbooléen / trueRestrictions de trace Yama
usb_storage_guard_enabled / usb_keyboard_guard_enabledbooléen / falseStockage USB / Protection clavier BadUSB (désactivé par défaut)
usb_zero_trust_enabledbooléen / falseBus USB autorisé_default=0
bluetooth_guard_enabledbool / trueDé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_enabledbooléen / trueArrêt/restauration automatique SSH / Samba / RDP
scan_exclusions[string]Chemins absolus exclus de l'analyse
link_guardobjet{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbooléen / falseTunnel VPN à démarrage automatique sur des réseaux non fiables
vpn_backendchaîne / wireguardwireguard / tailscale
active_vuln_scan_enabledbool / falseAutorise 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_enabledbool / falseAutorise la confiance mutuelle par code d'appairage avec RoamSwitch Sensor (désactivé par défaut). Requis pour utiliser la commande sensor
port_scan_detect_enabledbool / trueGarde de détection de scan de ports entrants
port_scan_detect_min_distinct_portsint / 15Une 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_secsint / 300Fenêtre d'agrégation pour la détection de scan (secondes)
port_scan_block_enabledbool / trueBloque automatiquement l'IP source du scan détecté
port_scan_block_duration_secsint / 600Durée du blocage automatique (secondes)
airgap_low_confidence_secsint / 600Secondes 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_secsint / 3600Secondes 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_rfkillbool / falseIndique si le mode DEGRADED lève aussi le rfkill Wi-Fi (non par défaut)
airgapAutoRfkillbool / trueIndique si Air-Gap bloque aussi la radio Wi-Fi avec rfkill (rétablie à la levée)
arp_recheck_consecutiveint / 3Nombre 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_secsint / 60Nombre minimal de secondes que doit couvrir la correspondance consécutive
arp_recheck_active_probebool / truePour 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_enabledbool / trueNotifie 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_enabledbool / trueAjoute 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)
Attention SSH à distance
Avec 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.serviceClientJournaux du démon client (commutateurs de profil, détections, erreurs)
journalctl -u roamswitch-server.serviceServeurJournaux du démon du serveur (événements FIM, détections Falco, isolations)
/run/roamswitch/roamswitch.sockClientSocket de domaine IPC Unix du démon client
/run/roamswitch/events.sockServeurLa 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.jsonClientÉtat du cycle : {active_level, network_trusted, fanotify_ready}
/run/roamswitch/alerts.jsonClientFile d'attente d'alertes récentes
/run/roamswitch/approvals.jsonClientFile d'attente d'approbation en attente
/run/roamswitch/fanotify.readyClientFichier d'indicateur indiquant que Fanotify Guard est en cours d'exécution
/var/lib/roamswitch/fim.dbServeurBase de données de hachage de base FIM SHA-256
~/.local/share/roamswitch/quarantine/Les deuxCoffre de quarantaine (0700, échantillons 0400) + .metadata.json
/var/lib/roamswitch/exec_log/Les deuxLes 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.jsonLes deuxL’é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

9. Références