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) Toutes les opérations privilégiées du serveur : suppression par défaut entrante, préservation du bastion SSH et administrateur, FIM (plus de 150 hachages binaires critiques), écouteur de socket Falco eBPF UNIX avec gel autonome SIGSTOP, répartition des alertes.
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-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
sudo systemctl reload  roamswitch-server.service      # Recharger le fichier de configuration
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 l'état de sécurité (24 vérifications sur le client, 30 vérifications avec --server), score de 0 à 100, note et recommandations par élément
server [config|setup|test-notify|restart|ebpf] Utilisateur/root Gestion de la configuration Server Edition, assistant de configuration interactif et notifications de test. ebpf (alias incidents) affiche l'état d'isolement actuel du eBPF Runtime Guard et l'historique des incidents détectés
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)
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éclenchez ou soulevez l'isolation d'urgence de l'Air-Gap (enable supprime tout le trafic externe)
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). 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 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
notifications (alias notification-history) Utilisateur Historique des notifications envoyées par RoamSwitch (anomalies d'audit des journaux, détections ClickFix, etc.) — 7 derniers jours, les plus récentes en premier
frozen [list|resume <PID>|resume all] Utilisateur / root Liste les processus que les gardes (détection de rafale de rançongiciel, altération d'un fichier canari, détection d'exploit noyau) maintiennent en SIGSTOP, et libère (SIGCONT) un faux positif. Un gel n'est pas un kill : le processus libéré reprend exactement là où il s'est arrêté. resume all libère tout. Libérer un processus appartenant à root nécessite 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 Regroupe les détections du garde de liens (usurpation ARP), du canary anti-rançongiciel, du garde d’exécution eBPF et du garde de ressources dans une chronologie unique, avec filiation des processus et étiquettes MITRE ATT&CK (expérimental)
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|unpair|request-audit|results] Utilisateur/root Confiance mutuelle par code d'appairage avec RoamSwitch Sensor, un capteur réseau d'un dépôt distinct que vous installez sur du matériel courant. pair --addr <ip> --code <code> échange un code émis par Sensor pour s'appairer (Sensor est supposé fonctionner à une IP fixe), key affiche la clé publique/adresse propre à ce terminal, unpair supprime l'appairage, et request-audit demande à Sensor d'exécuter 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). Voir le manuel d'exploitation Sensor pour plus de détails
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 »

Exemples

sudo roamswitch status                 # Diagnostic complet client (24 éléments)
sudo roamswitch status --server        # Diagnostic complet Server Edition (30 é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             # Accuser réception du minuteur de sécurité (arrêter la reprise automatique)
roamswitch canary                      # Historique des incidents du canari
roamswitch port-anomaly                # Historique des incidents du Port Anomaly Guard
roamswitch server ebpf                 # État d'isolement et historique des incidents du garde eBPF
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  # 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

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'aide spécifique à la sous-commande
  • est prise en charge via roamswitch <command> --help.
  • L'état lisible par machine doit être interrogé via MCP (§6) ou /run/roamswitch/state.json (§5).
  • Dans l'édition Client, il n'existe aucune commande directe pour forcer un profil de pare-feu ; le démon gère cela de manière autonome sur la base de la confiance du réseau. Pour forcer un niveau, configurez manual_override dans config.json ou appelez directement l'IPC set_security_level (§5).
  • status renvoie le code de sortie 0 quel que soit le score. Pour une surveillance automatisée, analysez la ligne de score (voir §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)
entropy_freeze_enabledbooléen / trueGel rapide des ransomwares (SIGSTOP)
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éen / falseDésactivez la radio Bluetooth sur les réseaux non fiables
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)
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)

Server Edition utilise un fichier de configuration au format INI avec des autorisations strictes (0600, root uniquement). Reportez-vous au Manuel d'utilisation de Server Edition.

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.sockServeurSocket d'intégration Falco / Tetragon eBPF (root:root, mode 0660 ; Falco s'exécute en tant que root par défaut, permettant des écritures de socket directes sans configuration)
/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_baseline.dbServeurBase de données de hachage de base FIM SHA-256
~/.local/share/roamswitch/quarantine/Les deuxCoffre de quarantaine (0700, échantillons 0400) + .metadata.json

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 / get_exposed_ports / get_guard_status / audit_url_safety / audit_secrets / audit_security_logs / 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_canary_status / get_notification_history / get_incident_timeline / run_active_vuln_scan / run_package_cve_scan / run_package_cve_scan_languages).

Il n'utilise aucune communication réseau externe, se connectant localement au socket démon ou appelant roamswitch-core. 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