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) |
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.
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
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.
-
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_overridedansconfig.jsonou appelez directement l'IPCset_security_level(§5). statusrenvoie 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 |
|---|---|---|
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) |
entropy_freeze_enabled | booléen / true | Gel rapide des ransomwares (SIGSTOP) |
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éen / false | Désactivez la radio Bluetooth sur les réseaux non fiables |
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) |
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.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 | Socket 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.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_baseline.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 |
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 |