ROAMSWITCH PER LINUX · RIFERIMENTO OPERAZIONI

CLI/Guida alle operazioni senza testa

Come utilizzare RoamSwitch per Linux senza GUI: su istanze VPS cloud, su SSH, da cron, script di monitoraggio e agenti AI programmatici (MCP).

Scelta dell'edizione
  • Client Edition (roamswitch): progettato per laptop, workstation mobili e dispositivi per sviluppatori. Cambia autonomamente i profili firewall di nftables in base al livello di fiducia della rete connessa. Questa guida si concentra principalmente sulla gestione headless/CLI dell'edizione client.
  • Server Edition (roamswitch-server): progettato per istanze VPS cloud (AWS, GCP, DigitalOcean, Linode, ecc.) e server locali esposti direttamente a Internet. Dispone di filtro anti-drop predefinito in entrata, prevenzione del blocco SSH, monitoraggio dell'integrità dei file del percorso critico (FIM), integrazione runtime eBPF/Falco e notifiche istantanee (Telegram/LINE/Webhook). Per istruzioni complete sull'installazione e sulla gestione, consultare il Manuale operativo di RoamSwitch Server Edition e il Server Security Whitepaper.

1. Componenti

Componente Funziona come Ruolo
roamswitch-daemon (Cliente) root (sistemaType=notify) Tutte le operazioni privilegiate del client: controllo nftables, rilevamento della rete, monitoraggio ransomware/malware, fanotify, blocco ARP/NDP, imposizione DNS. Non apre alcun socket di ascolto TCP/UDP.
roamswitch-server-daemon (Server) root (sistemaType=notify) Tutto il lavoro privilegiato lato server: drop predefinito del traffico in ingresso, protezione delle eccezioni SSH / IP di amministrazione, FIM (rilevamento delle manomissioni di oltre 150 file critici e insiemi di file di directory), ricezione degli eventi eBPF di Falco su un socket UNIX e congelamento dei processi (SIGSTOP), il registratore delle esecuzioni, l’inoltro degli eventi (opt-in) e l’invio delle notifiche
roamswitch (CLI) utente di accesso (alcune azioni richiedono sudo) Stato del demone di lettura del thin client. Utilizza /run/roamswitch/roamswitch.sock IPC su Client Edition o fornisce i sottocomandi --server, server, fim e emergency-restore su Server Edition.
roamswitch-mcp generato dai client AI Server MCP di sola lettura (stdio/JSON-RPC) per il recupero dello stato programmatico da parte degli agenti AI. Vedi configurazione MCP
roamswitch-ransomware-rollback root (watch gira come unità systemd roamswitch-ransomware-rollback-watch.service) Strumento di ripristino da ransomware. Crea snapshot di sottovolumi btrfs e volumi logici LVM ed estrae solo i file necessari. Incluso nel pacchetto client; utilizzabile anche dalla scheda «Incident Response» della GUI
roamswitch-app utente di accesso GUI GTK (solo edizione client). Non necessario in ambienti senza testa.

Una distribuzione headless viene eseguita sul demone + roamswitch CLI (più roamswitch-mcp se lo si desidera). Tutti i meccanismi di difesa autonomi funzionano senza alcuna GUI.

Pacchetti reciprocamente esclusivi
Client Edition (roamswitch) e Server Edition (roamswitch-server) sono pacchetti che si escludono a vicenda (Conflicts). Distribuisci roamswitch-server su ambienti server.

2. Demone (servizi di sistema)

Edizione cliente

sudo systemctl status  roamswitch.service      # Stato di funzionamento
sudo systemctl enable  roamswitch.service      # Avvio automatico al boot (abilitato all'installazione)
sudo systemctl restart roamswitch.service      # Riavvia
journalctl -u roamswitch.service -f            # Segui i log
journalctl -u roamswitch.service --since "1h ago"

Cosa fa il demone client in modo autonomo all'avvio e ad ogni ciclo (3 s):

  • Identifica il MAC del gateway connesso e applica i profili nftables (open / balanced / lockdown) rispetto a trusted_networks
  • Rilevamento ransomware comportamentale (fanotify + entropia di Shannon + canarini)
  • Scansione malware in accesso (fanotify, facoltativamente ClamAV)
  • Monitoraggio dello spoofing ARP e blocco preventivo ARP/NDP del gateway su reti non attendibili
  • Rafforzamento del kernel (sysctl / Yama / core dump / /tmp noexec) per profilo
  • Applicazione DNS di protezione dalle minacce (dns_enabled + dns_scope)
  • Link guard (NFQUEUE) per l'intercettazione del phishing
  • Uscita dello stato di runtime su /run/roamswitch/state.json

Edizione server

sudo systemctl status  roamswitch-server.service      # Stato di funzionamento
sudo systemctl restart roamswitch-server.service      # Riavvia
journalctl -u roamswitch-server.service -f            # Segui i log

3. Riferimento ai comandi CLI

Sintassi di base: roamswitch <command> [options]. L'esecuzione senza argomenti viene eseguita per impostazione predefinita su status. La lingua di output segue automaticamente le impostazioni internazionali del sistema operativo (LC_ALL / LC_MESSAGES / LANG).

Comando Autorizzazioni Descrizione
status [--server] (alias report / server-status) Utente Valutazione dello stato di sicurezza (27 voci normalmente, la valutazione server a 34 voci con --server), punteggio (0–100), voto e consigli. --json stampa lo stesso report come JSON leggibile da macchina sullo standard output
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] Utente/root Gestione di Server Edition. config mostra e modifica le impostazioni, setup è la procedura guidata interattiva, tui avvia la TUI a copertura completa (roamswitch-server-tui; ogni azione come root, sola lettura per gli utenti normali), test-notify invia una notifica di test e restart riavvia il servizio (il ricaricamento della configurazione non è supportato). ack riconosce l’isolamento di emergenza corrente (mantiene rigido un isolamento FULL e rilascia uno in DEGRADED; vedere la policy di isolamento nel §3). ebpf (alias incidents) mostra lo stato di contenimento corrente della protezione runtime eBPF e la cronologia degli incidenti rilevati. allowlist [list|add <rule> <process> [--exe <absolute-path>]|remove] gestisce l’allowlist permanente dei falsi positivi; legare una voce all’eseguibile con --exe impedisce a un processo rinominato di usarla. bans [--json] mostra la guardia contro la forza bruta SSH e le origini bannate (l'elenco è leggibile solo da root), e unban <IP|/64 IPv6|--all> rimuove un ban (root)
fim [verify|update] Utente/root Verifica del monitoraggio dell'integrità dei file del percorso critico (verify) e aggiornamento del database hash di base (update)
bans [--json] Utente/root Mostra lo stato della guardia contro la forza bruta SSH (blocca / solo rilevamento / arrestata, e perché), le origini bloccate in questo momento con il tempo residuo e i record recenti. L'elenco dei ban è leggibile solo da root, quindi aggiungi sudo. È disponibile --json. Come server bans della Server Edition
unban <IP | IPv6 /64 | --all> radice Rimuove un ban della guardia contro la forza bruta SSH e azzera anche il conteggio dei fallimenti di quell'origine. --all li rimuove tutti. Come server unban della Server Edition
emergency-restore radice Rimuovere tutti gli isolamenti eBPF/firewall di emergenza e ripristinare la linea di base della rete
ports [-a|--all] Utente Porte in ascolto su 0.0.0.0, DB non autenticati e server di sviluppo. -a include porte di solo loopback
guards Utente Stato delle protezioni di difesa automatiche (anomalia porta, ARP, archiviazione USB, download, minaccia DNS, canary, isolatore dev-server, Bluetooth)
wifi Utente Livello di crittografia Wi-Fi (aperto/WEP/WPA/cablato) e SSID
sharing [status|on|off] Utente Arresto/ripristino automatico di SSH/Samba/RDP su reti non attendibili (on disconnette SSH attivo quando non attendibile)
audit-url <URL> Utente Ispeziona il phishing degli URL e il rischio di minacce tramite feed locale ed euristica (non recupera mai il target)
audit-secrets <text|path|directory> Utente Rileva chiavi API, chiavi private e token in testo, un file o una directory (ricorsivo; esclude .git/node_modules, ecc.) — non trasmette mai dati
audit-logs [hours] Utente Aggrega e classifica i log journald/auth del sistema delle ultime N ore (impostazione predefinita 24). Le chiavi API e i token vengono mascherati automaticamente. Mostra anche i risultati del rilevamento di anomalie nei pattern dei log (nuovi pattern e picchi di frequenza statistici).
canary Utente Stato e integrità del file esca canary ransomware, e cronologia degli incidenti rilevati (fino agli ultimi 50)
port-anomaly (alias port-guard) Generale Stato della baseline del Port Anomaly Guard, porte attualmente auto-isolate, e cronologia degli incidenti rilevati (fino agli ultimi 50)
quarantine [list] Utente Contenuto del deposito di quarantena malware (campione, percorso originale, nome della minaccia, data)
knowledge [query] (alias faq) Utente Cerca nella knowledge base offline
airgap [enable|disable] Utente/root Attiva o rimuove l’isolamento Air-Gap di emergenza (solo Client Edition). enable scarta tutto il traffico esterno (vengono interrotte anche le connessioni già aperte) e disable lo ripristina. Vedere «Policy di isolamento (Air-Gap)» più sotto per il funzionamento del rilascio automatico
help (--help / -h) Utente Mostra aiuto (roamswitch <command> --help per la guida del sottocomando)
scan-packages [CARTELLA...] Generale Confronta i pacchetti del sistema operativo installati (rileva automaticamente dpkg/pacman/dnf/zypper) con la mappa CVE nota locale. Se vengono passate cartelle come argomento, controlla anche i file di lock delle dipendenze di quel progetto (npm/PyPI/crates.io e altri 4 ecosistemi). Su Ubuntu (20.04, 22.04, 24.04, 26.04) usa i dati propri di Ubuntu e controlla solo le CVE con CVSS 7,0 o superiore per cui Ubuntu ha già pubblicato una correzione («nessuna corrispondenza» non significa che non esistano CVE note). Le derivate di Ubuntu e le versioni non supportate vengono segnalate come non coperte, senza passare ai dati di Debian. Nessuna attività di rete
scan-vulns [--confirm] Generale Viene eseguito solo se active_vuln_scan_enabled: true (disattivato per impostazione predefinita): verifiche di raggiungibilità non autenticata limitate a 127.0.0.1 per Redis/Memcached/MongoDB/dockerd, controlli su configurazione CORS errata/path traversal/open redirect/SSRF sui server di sviluppo rilevati, diagnosi di open relay SMTP e diagnosi di esposizione basate su prove per Telnet/FTP/SSH. Senza --confirm è una simulazione
vuln-status Generale Elenca, per ogni prova registrata da scan-vulns --confirm, l'ultimo risultato registrato e i giorni trascorsi (pass_age). L'esito è uno tra tre stati — vulnerabile / sicuro / non conclusivo — e il tempo trascorso viene mostrato come «oggi», «N giorno/i fa» o «sconosciuto» (mai eseguita). Se non è mai stata eseguita una scansione, invita a eseguire prima scan-vulns --confirm e poi termina (non esiste ancora un'esecuzione pianificata, quindi il tempo trascorso riflette solo la frequenza con cui è stata effettivamente eseguita manualmente). Gli stessi dati sono disponibili anche tramite la GUI (scheda ports) e lo strumento MCP get_vulnerability_scan_history
notifications (alias notification-history) Utente La cronologia delle notifiche inviate da RoamSwitch (anomalie dell’audit dei log, rilevamenti ClickFix e simili) nell’ultima settimana, dalla più recente. --json stampa un array JSON e --export <FILE> scrive JSON Lines
frozen [list|resume <PID>|resume all] Utente / root Elenca i processi che le protezioni (rilevamento della cifratura rapida da ransomware, manomissione dei canary, rilevamento di exploit del kernel e il contenimento mirato della protezione eBPF) mantengono in SIGSTOP, e rilascia (SIGCONT) uno che era un falso positivo. Congelare non è terminare, quindi un processo rilasciato riprende esattamente da dove si era fermato. resume all li rilascia tutti. Rilasciare un processo di proprietà di root richiede sudo
resource-guard (alias leak-guard) Utente Cronologia degli incidenti della guardia contro l'esaurimento delle risorse e le anomalie di processo (solo Server Edition): crescita persistente dell'RSS (memory leak / DoS) o crash loop nei servizi esposti, con un livello di confidenza
timeline (alias incident-timeline) Utente Unisce i rilevamenti della protezione dei collegamenti (ARP spoofing), del canary anti-ransomware, della protezione runtime eBPF e della protezione delle risorse in un’unica timeline, con discendenza dei processi e tag MITRE ATT&CK (sperimentale). --json stampa tutti i record come array JSON sullo standard output, e --export <FILE> scrive JSON Lines (un record per riga) in un file
xdp-gate [status|enable|disable] Utente / root Mostra o commuta il gate XDP all’avvio (sperimentale). status indica se roamswitch-xdp-gate.service è abilitato e lo stato attuale del programma. Disattivato per impostazione predefinita
sensor [key|list|pair|repin|unpair|request-audit|results] Utente/root Fiducia reciproca, tramite codici di abbinamento, con il sensore di rete «RoamSwitch Sensor» installato su una macchina general-purpose (un prodotto separato). pair --addr <IP> --code <code> --fingerprint <SHA-256> abbina usando il codice rilasciato dal Sensor (si presume che il Sensor operi con un IP fisso; l’impronta digitale è il valore mostrato sullo schermo del Sensor o da roamswitch-sensor pairing show, e fissa il certificato usato per TLS 1.3: non viene mai recuperata dalla rete e non c’è alcun ripiego sul testo in chiaro). repin inserisce la nuova impronta digitale dopo che il Sensor ha rigenerato il certificato, key mostra la chiave pubblica e l’indirizzo di questo endpoint, unpair rimuove l’abbinamento e request-audit chiede al Sensor un audit attivo delle vulnerabilità (recuperate il risultato con results). Richiede sensor_pairing_enabled: true (disattivato per impostazione predefinita). Per i dettagli consultate il Manuale operativo del Sensor
port-scan (alias portscan) Utente Mostra la cronologia di rilevamento della protezione di rilevamento delle scansioni delle porte in ingresso (IP di origine, se bloccato automaticamente e durata del blocco). Una funzione diversa da port-anomaly, che rileva porte sconosciute appena «esposte»
lockfile-fim [verify|update] [--quiet|-q] radice Verifica (verify) o reimposta (update) la baseline di monitoraggio delle manomissioni dei lockfile delle dipendenze. Richiede root. Gli obiettivi sono le cartelle di progetto monitorate (lockfile_watch_dirs nell’edizione server)
scan-scripts <FOLDER...> Utente Elenca staticamente gli script preinstall / install / postinstall / prepare dichiarati dai file package.json sotto node_modules nelle cartelle di progetto indicate (un inventario, non un verdetto; nessuna attività di rete)
scan-typosquat <FOLDER...> Utente Confronta i nomi delle dipendenze in package.json con un elenco incluso di nomi di pacchetti npm popolari per distanza di edit 1–2 e segnala i probabili typosquat (solo riferimento; nessuna attività di rete)
web-scan [FOLDER...] [--quarantine] [--json] Utente/root Cerca webshell PHP, JavaScript, JSP e ASP, codice iniettato, PHP camuffato da immagine e abuso di .htaccess con le regole del livello applicativo web (integrate, feed giornaliero firmato, regole proprie in /etc/roamswitch/rules.d). Senza cartella controlla le radici dei documenti della configurazione del server web. Per impostazione predefinita solo controllo; --quarantine (root) mette in quarantena. Codice di uscita: 0 = niente, 2 = critical o high, 1 = impossibile eseguire
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] Utente/root Mostra lo stato delle regole del livello applicativo web (versione, versione del feed installata, cartella delle regole proprie, livello di quarantena, risposta sugli account, hook dopo il rilevamento) (status), elenca le regole caricate (list), convalida un file di regole proprie (validate), mostra le shell di login disattivate dalla risposta sugli account (locked) e le ripristina (unlock-account, root), e fornisce esempi di configurazione e hook (example)
kernel-modules [--json] [--apply [MODULE...]] [--remove] Utente/root Verifica, solo leggendo file (nessuna comunicazione), se i moduli del kernel diventati vie per Copy Fail, Dirty Frag e act_pedit (algif_aead, esp4, esp6, rxrpc, act_pedit) possono ancora essere caricati. --apply (root) scrive install … /bin/false in modprobe.d solo per quelli inutilizzati; --remove annulla. Non conta nel punteggio della diagnosi
audit-agent-setup [FOLDER...] [--json] Utente/root Controllo in sola lettura (senza rete) dei file di istruzioni e delle skill dati agli agenti IA (~/.claude, ~/.codex, ~/.cursor, ~/.gemini, ~/.agents, ~/.openclaw, più CLAUDE.md, AGENTS.md e simili nelle cartelle di progetto registrate per il controllo CVE dei pacchetti e in ogni FOLDER indicata) e dell'openclaw.json di OpenClaw. Segnala caratteri Unicode invisibili, istruzioni annullate, scarica-ed-esegui, riferimenti a file segreti accanto a un invio, codice compilato dentro una skill, autenticazione OpenClaw disattivata o token corto e altro; ciò che è in un commento HTML è valutato più alto. Contenuto dei file e segreti non vengono mai stampati. Una corrispondenza significa «una persona dovrebbe leggere questa riga», non «malevolo». --json stampa JSON
bluetooth-audit [--json] Utente Controlla la configurazione di BlueZ (/etc/bluetooth/input.conf e main.conf) alla ricerca di impostazioni che consentono a dispositivi non associati di collegarsi come tastiere, ed elenca le tastiere e i mouse Bluetooth collegati (sola lettura)
audit-npm-signatures <DIR> [--confirm] Utente Verifica le firme e la provenienza dei pacchetti installati con npm audit signatures (l’unico comando RoamSwitch che comunica con npmjs.com; senza --confirm è una simulazione; l’edizione server richiede anche npm_audit_signatures_enabled)
install [--pm npm|pnpm] [--yes] Utente Incapsula npm / pnpm install e confina solo la fase degli script del ciclo di vita in una sandbox bwrap (il download del pacchetto in sé usa la rete normalmente)
forward status|test|queue (alias event-forward) Utente/root Mostra lo stato dell’inoltro degli eventi (status), invia un evento di test (test) o elenca la coda di ritentativi (queue) per syslog RFC 5424 / CEF, JSON Lines e un webhook strutturato firmato con HMAC. Opt-in, disattivato per impostazione predefinita, e invia solo alle destinazioni da voi configurate (Manuale operativo del server §16)
events search|tree|export|verify|status (alias exec-events) radice Cerca (search: --since 2h --pid N --exe S --user U --parent P --text S --json), stampa l’albero dei processi di (tree <pid>), esporta (export), verifica la catena di hash di (verify; a evidenza di manomissione, non a prova di manomissione) e mostra lo stato di (status) il log locale del registratore delle esecuzioni. Il log è accessibile solo a root, quindi normalmente serve sudo (Manuale operativo del server §15)

Policy di isolamento (Air-Gap)

Rilasciare solo con un timer fisso permette a un attaccante paziente di aspettare, quindi il trigger di un isolamento è classificato in base all’affidabilità (in entrambe le edizioni).

  • Bassa affidabilità (un Air-Gap manuale, anomalie generiche, eBPF Error / Warning e inferiori): ripristinato completamente dopo un breve timer (client: airgap_low_confidence_secs, 600 s per impostazione predefinita; server: safety_timer_secs in guard.yaml, 300 s per impostazione predefinita; 0 disattiva il timer).
  • Alta affidabilità (manomissione del canary, riscrittura massiva in stile ransomware, ARP spoofing sotto lockdown, eBPF Critical / Emergency / Alert, attivazione ripetuta della stessa regola e così via): non viene mai ripristinato in silenzio. Dopo il timer la causa (PID congelato, canary, ARP, regola che si riattiva) viene ricontrollata e l’isolamento viene rilasciato con una notifica solo quando si verifica che la causa è stata rimossa. Se ciò non può essere confermato, nessuno lo ha riconosciuto e si raggiunge il limite (client: airgap_hard_cap_secs; server: isolation_hard_cap_secs in server.conf; entrambi 3600 s per impostazione predefinita, 0 = nessun limite), passa alla modalità DEGRADED.
  • La modalità DEGRADED non si apre mai su timer (il client consente solo il loopback; il server consente solo i percorsi di gestione SSH di manutenzione e degli IP in whitelist). Viene rilasciata solo da un ricontrollo che verifichi la rimozione della causa, da un riconoscimento esplicito (server: roamswitch server ack) o da un rilascio manuale (il pulsante della GUI / roamswitch emergency-restore). Nella modalità DEGRADED del client anche l’rfkill del Wi-Fi non viene rimosso, a meno che airgap_degraded_lift_rfkill sia true.
  • Le connessioni stabilite diverse dai percorsi di gestione vengono interrotte (server: tutto tranne le porte SSH di manutenzione e gli IP in whitelist, quindi viene interrotto anche un canale C2 o una reverse shell che l’attaccante ha già aperto). Un Air-Gap manuale è a bassa affidabilità quando proviene dal menu / dalla GUI / da roamswitch airgap enable senza contesto di avviso, ma quando viene avviato dal pulsante «blocca ora» di un avviso di ARP spoofing eredita l’affidabilità (alta) di quell’avviso, e il MAC del gateway viene ricontrollato senza inviare traffico finché non coincide con il MAC attendibile in controlli consecutivi (arp_recheck_consecutive controlli distribuiti su almeno arp_recheck_min_secs secondi). Ogni transizione è registrata nella timeline degli incidenti.

Ripristino da ransomware (snapshot e ripristino di file)

I comandi seguenti appartengono a roamswitch-ransomware-rollback (non sono sottocomandi di roamswitch). Il suo stato è salvato in /var/lib/roamswitch.

Comando Autorizzazioni Descrizione
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] root Crea subito uno snapshot della destinazione (predefinita $HOME). Le destinazioni sono sottovolumi btrfs e volumi logici LVM
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] root Sorveglianza continua. Crea automaticamente snapshot in caso di raffiche di riscritture di file e di eventi Critical registrati da altre protezioni, e crea anche snapshot «prima del danno» a intervalli (ogni 6 ore per impostazione predefinita; 4 generazioni su btrfs, 2 su LVM; dopo uno snapshot al rilevamento, quelli periodici restano in pausa 7 giorni per impostazione predefinita)
roamswitch-ransomware-rollback list [--path PATH] [--json] root Elenca gli snapshot creati da questo strumento (tipo, se esiste ancora, snapshot «prima del danno» consigliato). --json per l’output leggibile da macchina
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] root Copia solo il file o la directory indicati da uno snapshot in un'altra posizione, senza sovrascrivere lo stato attuale (predefinito <destinazione>/RoamSwitch-Recovered/<ID>/). La prima scelta per il ripristino
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> root Rende visibile il contenuto di uno snapshot per scegliere il percorso da passare a restore-files (btrfs: così com'è; LVM: montaggio temporaneo in sola lettura). Al termine, smonta con unmount-browse
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N root Intervallo degli snapshot «prima del danno» (secondi; 0 li disattiva, altrimenti almeno 300). Si applica a un watch in esecuzione senza riavvio. Non esiste alcuna impostazione per disattivare gli snapshot al rilevamento
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] root Riporta l'intera destinazione allo stato di uno snapshot (distruttivo). Uno snapshot al rilevamento contiene file già cifrati, quindi viene rifiutato senza --accept-tampered. Prova prima restore-files

Esempi

sudo roamswitch status                 # Diagnostica completa client (27 voci)
sudo roamswitch status --server        # Diagnostica completa Server Edition (34 voci)
sudo roamswitch ports -a               # Tutte le porte in ascolto
roamswitch guards                      # Stato delle guardie
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets .                          # Scansione ricorsiva della directory corrente
roamswitch audit-logs 72               # Analizza i log delle ultime 72 ore
sudo roamswitch sharing on             # Arresto automatico di SSH/Samba/RDP su reti non attendibili
sudo roamswitch fim verify             # Verifica dell'integrità dei file FIM
sudo roamswitch fim update             # Aggiorna la baseline FIM
sudo roamswitch emergency-restore      # Rimuovi completamente il blocco di emergenza e ripristina
sudo roamswitch airgap enable          # Blocco di emergenza
sudo roamswitch airgap disable         # Rimuovi
sudo roamswitch server ack             # Riconosce l’isolamento di emergenza (mantiene rigido un isolamento FULL, rilascia uno in DEGRADED)
roamswitch canary                      # Cronologia degli incidenti del canary
roamswitch vuln-status                 # Mostra l'ultimo risultato della scansione e i giorni trascorsi (pass_age)
roamswitch port-anomaly                # Cronologia degli incidenti del Port Anomaly Guard
roamswitch server ebpf                 # Stato di isolamento e cronologia degli incidenti della guardia eBPF
roamswitch server bans                 # Stato della guardia contro la forza bruta SSH ed elenco delle origini bannate
sudo roamswitch server unban 203.0.113.9   # Rimuovere un ban della guardia SSH (richiede root)
roamswitch notifications               # Cronologia delle notifiche degli ultimi 7 giorni
roamswitch frozen                      # Elenca i processi congelati
sudo roamswitch frozen resume 12345    # Rilascia un falso positivo
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10  # Si abbina a Sensor tramite un codice di abbinamento
sudo roamswitch sensor key             # Mostra la chiave pubblica/indirizzo propri di questo endpoint
roamswitch port-scan                   # Cronologia di rilevamento delle scansioni delle porte
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

Il demone dell'edizione server viene eseguito come root, quindi i comandi che devono leggere il set di regole nftables o identificare il proprietario di un processo (status / status --server / ports -a) restituiscono risultati imprecisi senza sudo (un falso verdetto “inattivo”, o informazioni di processo mancanti). Anche i comandi che modificano la configurazione (sharing / fim update / airgap / emergency-restore, ecc.) richiedono sudo. Tutti gli altri comandi, di sola lettura, funzionano correttamente senza di esso.

Avvertenze e limitazioni
  • È supportato --help per ogni sottocomando (ad esempio roamswitch ports --help).
  • Per un output leggibile da macchina usate status --json, --json (un array JSON) ed --export <FILE> (JSON Lines) su timeline / notifications, events search --json, MCP (§6) o /run/roamswitch/state.json (§5).
  • Nell’edizione client non esiste alcun comando CLI che cambi direttamente il profilo (il demone decide in autonomia). Per forzarlo, impostate manual_override in config.json o chiamate direttamente il metodo IPC set_security_level (§5).
  • status restituisce il codice di uscita 0 indipendentemente dal risultato. Se lo usate per il monitoraggio, analizzate la riga del punteggio nell’output (un esempio è nel §7).

4. File di configurazione

Edizione client (~/.config/roamswitch/config.json)

Il demone viene eseguito come root ed esegue la scansione di /home/*/.config/roamswitch/config.json, utilizzando il primo file valido che trova (o /root/.config/roamswitch/config.json in ambienti solo root).

Chiave Tipo/Predefinito Descrizione
languagestringa/impostazione locale del sistema operativoLingua dell'interfaccia utente e della CLI (ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT)
trusted_networks[{name, mac, level}]Reti affidabili; mac è il MAC del gateway, level è open / balanced / lockdown
away_protection_levelstringa / lockdownProfilo predefinito su reti sconosciute
manual_overridestringa / nulloForza open / balanced / lockdown (null per automatico)
dns_enabledbool / trueApplicazione DNS di protezione dalle minacce
dns_providerstringa / quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopestringa / untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabledbool / trueMonitoraggio dello spoofing ARP
gateway_arp_lock_enabledbool / trueBlocco preventivo ARP/NDP del gateway su reti non attendibili
port_anomaly_guard_enabledbool / trueBlocca automaticamente le nuove porte di ascolto
system_wide_fanotify_enabledbool / trueFanotify protezione malware a livello di sistema
pre_exec_blocking_enabledbool / trueBlocco pre-esecuzione (FAN_DENY)
mount_hardening_enabledbool / truenoexec su /tmp e /dev/shm (applicato su profili non aperti)
yama_memory_protect_enabledbool / trueRestrizioni sulla traccia Yama
usb_storage_guard_enabled / usb_keyboard_guard_enabledbool / falseMemoria USB/protezione tastiera USB difettosa (disattivata per impostazione predefinita)
usb_zero_trust_enabledbool / falseBus USB autorizzato_default=0
bluetooth_guard_enabledbool / trueDisattiva la «visibilità» Bluetooth su una rete non attendibile (attivo per impostazione predefinita; la radio resta accesa e i dispositivi connessi restano connessi)
sharing_service_control_enabledbool / trueArresto/ripristino automatico SSH/Samba/RDP
scan_exclusions[string]Percorsi assoluti esclusi dalla scansione
link_guardoggetto{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbool / falseAvvio automatico del tunnel VPN su reti non attendibili
vpn_backendstringa / wireguardwireguard / tailscale
active_vuln_scan_enabledbool / falseConsente l'esecuzione di scan-vulns (disattivato per impostazione predefinita). Richiede un'attivazione esplicita poiché invia sonde di raggiungibilità limitate a 127.0.0.1
pkgcve_watched_folders[string]Cartelle di progetto (percorsi assoluti) controllate dalla verifica delle dipendenze della GUI. Il comando CLI scan-packages ignora questa impostazione e usa solo le cartelle passate come argomenti da riga di comando
sensor_pairing_enabledbool / falseConsente la fiducia reciproca tramite codice di abbinamento con RoamSwitch Sensor (disattivato per impostazione predefinita). Necessario per usare il comando sensor
port_scan_detect_enabledbool / trueProtezione di rilevamento delle scansioni delle porte in ingresso
port_scan_detect_min_distinct_portsint / 15Una sorgente che si connette ad almeno questo numero di porte distinte entro la finestra di rilevamento viene considerata una scansione
port_scan_detect_window_secsint / 300Finestra di aggregazione per il rilevamento delle scansioni (secondi)
port_scan_block_enabledbool / trueBlocca automaticamente l'IP di origine della scansione rilevata
port_scan_block_duration_secsint / 600Durata del blocco automatico (secondi)
airgap_low_confidence_secsint / 600Secondi prima che un Air-Gap a bassa affidabilità venga ripristinato automaticamente (0 = mai automaticamente). Non si applica agli isolamenti ad alta affidabilità (§3, «Policy di isolamento (Air-Gap)»)
airgap_hard_cap_secsint / 3600Secondi prima che un isolamento ad alta affidabilità passi alla modalità DEGRADED (0 = nessun limite). La modalità DEGRADED non si apre mai su timer
airgap_degraded_lift_rfkillbool / falseSe la modalità DEGRADED rimuove anche l’rfkill del Wi-Fi (per impostazione predefinita no)
airgapAutoRfkillbool / trueSe Air-Gap blocca anche la radio Wi-Fi con rfkill (ripristinata al rilascio)
arp_recheck_consecutiveint / 3Numero di controlli consecutivi in cui il MAC del gateway deve coincidere con il MAC attendibile perché un isolamento per ARP spoofing sia considerato risolto (1 o più)
arp_recheck_min_secsint / 60Il numero minimo di secondi su cui deve estendersi la corrispondenza consecutiva
arp_recheck_active_probebool / trueIn un isolamento attivato da ARP, quando il gateway non ha una voce nella cache dei vicini (e il collegamento è attivo), invia una singola richiesta ARP diretta per verificare il MAC del gateway. Qualsiasi risposta con un MAC diverso da quello attendibile conta come discrepanza. Al massimo una sonda ogni 20 secondi
credential_access_watch_enabledbool / trueNotifica quando un processo inatteso apre un file di credenziali (chiave privata in ~/.ssh, ~/.aws/credentials, ~/.config/gcloud, archivio di credenziali di un browser); solo notifica, attivo per impostazione predefinita. Gli strumenti di backup e gli indicizzatori sono esclusi fin dall'inizio; escludi gli altri con credential_access_watch_allow. Le modifiche si applicano in circa 30 secondi. Una lettura molto breve, come cat o head, in cui il programma termina prima che RoamSwitch riesca a identificarne l'eseguibile, può non essere segnalata.
ssh_guard_*—Impostazioni della guardia contro la forza bruta SSH. Le 10 chiavi e i loro valori predefiniti sono gli stessi della 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 (vuoto; un array di IP / CIDR o una stringa separata da virgole), ssh_guard_log_source (auto), ssh_guard_yield_to_fail2ban (true) e ssh_guard_trust_key_days (30). Lavora solo finché sshd è in esecuzione. Un valore fuori intervallo torna al predefinito. Le modifiche vengono recepite in circa un minuto (senza riavvio). Elenca e rimuovi i ban con roamswitch bans e roamswitch unban
fim_intrusion_context_enabledbool / trueAggiunge alle notifiche di manomissione di file (FIM) e di lockfile l'account e l'eseguibile del processo che ha scritto e l'accesso SSH a cui appartiene (origine, ora, metodo di autenticazione); per un file di credenziali, solo quando il processo appartiene a un accesso SSH. Ha effetto dopo il riavvio del daemon. Non viene inviato nulla all'esterno
forward_*—Impostazioni di inoltro degli eventi (syslog / JSON Lines / webhook firmato). Opt-in, disattivato per impostazione predefinita. Le chiavi sono 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 e forward_queue_max_age_hours (tipi e valori predefiniti sono nel Manuale operativo del server §18)
exec_recorder_* / exec_rule*—Impostazioni del registratore delle esecuzioni locale e delle regole di correlazione solo notifica da EXR-001 a EXR-007. Attivo per impostazione predefinita (disattivato sugli host con meno di 1 GiB di memoria; un’impostazione esplicita prevale). Le chiavi sono 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 ed exec_rules_isolation_optin (predefinito false; solo quando è true le regole di gravità alta attivano l’isolamento)
Attenzione SSH remoto
Con sharing_service_control_enabled: true, la connessione a una rete non attendibile disconnette le sessioni SSH attive. Lascialo disabilitato sui server headless.

Edizione server (/etc/roamswitch/server.conf)

L’edizione server usa un file di configurazione in formato INI protetto con permessi 0600 (solo root). Tipo, valori consentiti, valore predefinito e necessità di riavvio di ogni chiave sono nel Manuale operativo del server §18. Modificate le chiavi con roamswitch server config show|get|set o nell’editor di configurazione di roamswitch server tui (tutte le 146 chiavi di server.conf e guard.yaml). L’edizione server non supporta il ricaricamento della configurazione, quindi applicate le modifiche con sudo roamswitch server restart.

Computer condivisi: modalità solo amministratore

Su un computer condiviso da più persone, sudo touch /etc/roamswitch/admin-only attiva la modalità solo amministratore. Le modifiche che riguardano l'intero computer (firewall, DNS, VPN, USB, rafforzamento di kernel e mount, radio, fiducia di Sensor e simili) sono allora limitate a root o agli utenti del gruppo sudo, wheel o roamswitch. Le azioni legate ai propri file e processi (isolamento, kill, freeze, scansioni) funzionano come prima. /etc/roamswitch/admin-only vale solo se appartiene a root e gli altri non possono scriverlo (un utente non può quindi crearlo per cambiare modalità). È disattivata per impostazione predefinita (nessun file).

5. Registri e file di stato di runtime

Percorso Obiettivo Descrizione
journalctl -u roamswitch.serviceClienteRegistri del demone client (cambiamenti di profilo, rilevamenti, errori)
journalctl -u roamswitch-server.serviceServerRegistri del demone del server (eventi FIM, rilevamenti Falco, isolamenti)
/run/roamswitch/roamswitch.sockClienteSocket del dominio Unix IPC del demone client
/run/roamswitch/events.sockServerIl socket di integrazione eBPF di Falco / Tetragon (root:root, modalità 0600; anche Falco viene eseguito come root, quindi non serve alcuna configurazione aggiuntiva dei permessi)
/run/roamswitch/state.jsonClienteStato del ciclo: {active_level, network_trusted, fanotify_ready}
/run/roamswitch/alerts.jsonClienteCoda di avvisi recenti
/run/roamswitch/approvals.jsonClienteCoda di approvazione in sospeso
/run/roamswitch/fanotify.readyClienteFile flag che indica che Fanotify Guard è in esecuzione
/var/lib/roamswitch/fim.dbServerDatabase hash di base FIM SHA-256
~/.local/share/roamswitch/quarantine/EntrambiDeposito di quarantena (0700, campioni 0400) + .metadata.json
/var/lib/roamswitch/exec_log/EntrambiI JSON Lines concatenati tramite hash del registratore delle esecuzioni (solo root, 0600). Cercate e verificate con roamswitch events
/run/roamswitch/airgap_isolation.json / host_isolation.jsonEntrambiLo stato di isolamento (Air-Gap) (FULL / DEGRADED) e il record del trigger; l’isolamento sopravvive al riavvio del demone

Chiamata diretta IPC (avanzata)

Il demone accetta JSON delimitato da nuova riga su /run/roamswitch/roamswitch.sock:

# Forza il cambio di profilo (edizione client)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

# Riconcilia subito il blocco ARP del gateway
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

6. Stato programmatico (MCP)

roamswitch-mcp espone strumenti di sola lettura su JSON-RPC su 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).

Non si connette a host esterni e dialoga localmente con il socket del demone o chiama direttamente roamswitch-core. get_security_report e verify_security_findings non inviano nulla nemmeno alla LAN (il gateway viene letto solo dalla cache ARP e da altre informazioni locali). Vedere la Guida all'installazione del sistema MCP

7. Ricette di automazione

Controllo giornaliero dello stato del cron → Invia un'e-mail se il punteggio scende al di sotto della soglia

#!/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

Monitorare la coda degli avvisi (sondaggio 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

Verifica l'integrità di fanotify guard (state.json)

jq -e '.fanotify_ready == true' /run/roamswitch/state.json >/dev/null \
  || echo "WARNING: fanotify guard is not running" >&2

8. Risoluzione dei problemi

Sintomo Risoluzione
roamswitch esce con "verifica che roamswitch-mcp sia installato" Il demone non è in esecuzione → sudo systemctl start roamswitch.service (o roamswitch-server.service). Verificare che il socket esista
roamswitch status mostra fanotify 🔴 "la guardia si è fermata" Esaurimento transitorio fs.fanotify.max_user_groups. Riavvia con sudo systemctl restart roamswitch.service e verifica nel diario
Il profilo rimane in balanced, non raggiunge mai open Verifica che il MAC del gateway sia registrato in trusted_networks con level: open
SSH si disconnette inaspettatamente L'edizione client ha sharing_service_control_enabled: true su una rete non attendibile. Disabilita tramite roamswitch sharing off
Le modifiche alla configurazione non hanno effetto 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).
Comunicazioni del server bloccate accidentalmente Accedi alla console cloud (VNC/Seriale) ed esegui sudo roamswitch emergency-restore

9. Riferimenti