ROAMSWITCH PARA LINUX · REFERÊNCIA DE OPERAÇÕES

Guia de operações CLI/headless

Como operar o RoamSwitch para Linux sem GUI — em instâncias VPS na nuvem, por SSH, a partir de cron, scripts de monitoramento e agentes programáticos de IA (MCP).

Escolhendo a edição
  • Client Edition (roamswitch): Projetado para laptops, estações de trabalho móveis e dispositivos de desenvolvedor. Alterna automaticamente perfis de firewall nftables com base no nível de confiança da rede conectada. Este guia se concentra principalmente no gerenciamento headless/CLI da Client Edition.
  • Server Edition (roamswitch-server): Projetado para instâncias VPS em nuvem (AWS, GCP, DigitalOcean, Linode, etc.) e servidores locais expostos diretamente à Internet. Apresenta filtragem de queda padrão de entrada, prevenção de bloqueio SSH, monitoramento de integridade de arquivos de caminho crítico (FIM), integração de tempo de execução eBPF/Falco e notificações instantâneas (Telegram/LINE/Webhooks). Para obter instruções completas de instalação e gerenciamento, consulte o RoamSwitch Server Edition Operations Manual e o Server Security Whitepaper.

1. Componentes

Componente Funciona como Função
roamswitch-daemon (Cliente) raiz (sistemad Type=notify) Todas as operações privilegiadas do cliente: controle de nftables, detecção de rede, monitoramento de ransomware/malware, fanotify, fixação de ARP/NDP, aplicação de DNS. Não abre nenhum soquete de escuta TCP/UDP.
roamswitch-server-daemon (servidor) raiz (sistemad Type=notify) Todo o trabalho privilegiado do lado do servidor: descarte por predefinição do tráfego de entrada, proteção das exceções de SSH / IPs de administração, FIM (deteção de adulteração de mais de 150 ficheiros críticos e de conjuntos de ficheiros em diretórios), receção de eventos eBPF do Falco num socket UNIX e congelamento de processos (SIGSTOP), o gravador de execuções, o reencaminhamento de eventos (opcional) e o envio de notificações
roamswitch (CLI) usuário de login (algumas ações requerem sudo) Estado do daemon de leitura do thin client. Usa /run/roamswitch/roamswitch.sock IPC no Client Edition ou fornece subcomandos --server, server, fim e emergency-restore no Server Edition.
roamswitch-mcp gerado por clientes de IA Servidor MCP somente leitura (stdio/JSON-RPC) para recuperação de status programática por agentes de IA. Consulte configuração MCP
roamswitch-ransomware-rollback root (watch corre como a unidade systemd roamswitch-ransomware-rollback-watch.service) Ferramenta de recuperação de ransomware. Cria snapshots de subvolumes btrfs e volumes lógicos LVM e extrai apenas os ficheiros necessários. Incluída no pacote cliente; também disponível no separador «Incident Response» da interface
roamswitch-app usuário de login GUI GTK (somente edição cliente). Não é necessário em ambientes sem cabeça.

Uma implantação headless é executada no daemon + roamswitch CLI (mais roamswitch-mcp se desejado). Todos os mecanismos de defesa autônomos funcionam sem qualquer GUI.

Pacotes mutuamente exclusivos
Client Edition (roamswitch) e Server Edition (roamswitch-server) são pacotes mutuamente exclusivos (Conflicts). Implante roamswitch-server em ambientes de servidor.

2. Daemon (serviços systemd)

Edição Cliente

sudo systemctl status  roamswitch.service      # Estado de funcionamento
sudo systemctl enable  roamswitch.service      # Início automático no arranque (ativado na instalação)
sudo systemctl restart roamswitch.service      # Reiniciar
journalctl -u roamswitch.service -f            # Acompanhar registos
journalctl -u roamswitch.service --since "1h ago"

O que o daemon cliente faz de forma autônoma na inicialização e em cada ciclo (3 s):

  • Identifica o gateway MAC conectado e aplica perfis nftables (open / balanced / lockdown) em trusted_networks
  • Detecção comportamental de ransomware (fanotify + entropia de Shannon + canários)
  • Verificação de malware no acesso (fanotify, opcionalmente ClamAV)
  • Monitoramento de falsificação de ARP e fixação preventiva de gateway ARP/NDP em redes não confiáveis
  • Endurecimento do kernel (sysctl/Yama/core dumps//tmp noexec) por perfil
  • Aplicação de DNS de proteção contra ameaças (dns_enabled + dns_scope)
  • Link guard (NFQUEUE) para interceptação de phishing
  • Saída do estado de tempo de execução para /run/roamswitch/state.json

Edição de servidor

sudo systemctl status  roamswitch-server.service      # Estado de funcionamento
sudo systemctl restart roamswitch-server.service      # Reiniciar
journalctl -u roamswitch-server.service -f            # Acompanhar registos

3. Referência de comando CLI

Sintaxe básica: roamswitch <command> [options]. Executar sem argumentos tem como padrão status. O idioma de saída segue automaticamente a localidade do sistema operacional (LC_ALL/LC_MESSAGES/LANG).

Comando Permissões Descrição
status [--server] (alias report / server-status) Usuário Avaliação da saúde de segurança (27 itens normalmente, a avaliação de servidor de 34 itens com --server), pontuação (0–100), classificação e recomendações. --json imprime o mesmo relatório como JSON legível por máquina na saída padrão
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] Usuário/raiz Gestão da Server Edition. config mostra e altera definições, setup é o assistente interativo, tui lança a TUI de cobertura total (roamswitch-server-tui; todas as ações como root, só de leitura para utilizadores comuns), test-notify envia uma notificação de teste e restart reinicia o serviço (o recarregamento da configuração não é suportado). ack reconhece o isolamento de emergência atual (mantém um isolamento FULL estrito e liberta um DEGRADED; ver a política de isolamento na §3). ebpf (alias incidents) mostra o estado atual de contenção da proteção de runtime eBPF e o histórico de incidentes detetados. allowlist [list|add <rule> <process> [--exe <absolute-path>]|remove] gere a lista de permissões permanente de falsos positivos; associar uma entrada ao executável com --exe significa que um processo renomeado não a pode usar. bans [--json] mostra a guarda contra força bruta SSH e as origens bloqueadas (a lista só pode ser lida por root), e unban <IP|/64 IPv6|--all> levanta um bloqueio (root)
fim [verify|update] Usuário/raiz Verificação do monitoramento de integridade de arquivos de caminho crítico (verify) e atualização do banco de dados hash de linha de base (update)
bans [--json] Usuário/raiz Mostra o estado da guarda contra força bruta SSH (bloqueia / só deteta / parada, e porquê), as origens bloqueadas neste momento com o tempo restante e os registos recentes. A lista de bloqueios só pode ser lida por root, por isso acrescente sudo. Admite --json. Igual a server bans da Server Edition
unban <IP | IPv6 /64 | --all> raiz Levanta um bloqueio da guarda contra força bruta SSH e apaga também a contagem de falhas dessa origem. --all levanta todos. Igual a server unban da Server Edition
emergency-restore raiz Elimine todos os isolamentos emergenciais de eBPF/firewall e restaure a linha de base da rede
ports [-a|--all] Usuário Portas de escuta em 0.0.0.0, bancos de dados não autenticados e servidores de desenvolvimento. -a inclui portas somente loopback
guards Usuário Status das proteções de defesa automáticas (anomalia de porta, ARP, armazenamento USB, download, ameaça de DNS, canário, isolador de servidor de desenvolvimento, Bluetooth)
wifi Usuário Força de criptografia Wi-Fi (Open/WEP/WPA/com fio) e SSID
sharing [status|on|off] Usuário Parada automática/restauração de SSH/Samba/RDP em redes não confiáveis (on desconecta SSH ativo quando não confiável)
audit-url <URL> Usuário Inspecione phishing de URL e risco de ameaça por meio de feed local + heurística (nunca busca o alvo)
audit-secrets <text|path|directory> Usuário Deteta chaves de API, chaves privadas e tokens em texto, num ficheiro ou diretório (recursivo; ignora .git/node_modules, etc.) — nunca transmite dados
audit-logs [hours] Usuário Agrega e classifica os registos de diário/autenticação do sistema das últimas N horas (padrão 24). As chaves API e os tokens são mascarados automaticamente. Também mostra os resultados de deteção de anomalias de padrões de registo (padrões novos e picos de frequência estatísticos).
canary Usuário Status e integridade do arquivo isca canário ransomware, e histórico de incidentes detetados (até os 50 mais recentes)
port-anomaly (aliás port-guard) Geral Estado da linha de base do Port Anomaly Guard, portas atualmente auto-isoladas, e histórico de incidentes detetados (até os 50 mais recentes)
quarantine [list] Usuário Conteúdo do cofre de quarentena de malware (amostra, caminho original, nome da ameaça, data)
knowledge [query] (alias faq) Usuário Pesquise na base de conhecimento off-line
airgap [enable|disable] Usuário/raiz Acionar ou levantar o isolamento de emergência Air-Gap (apenas na Client Edition). enable descarta todo o tráfego externo (as ligações que já estavam abertas também são cortadas) e disable restaura-o. Consulte «Política de isolamento (Air-Gap)» mais abaixo para saber como funciona a libertação automática
help (--help / -h) Usuário Mostrar ajuda (roamswitch <command> --help para ajuda do subcomando)
scan-packages [PASTA...] Geral Compara os pacotes do SO instalados (deteta automaticamente dpkg/pacman/dnf/zypper) com o mapeamento de CVE conhecido local. Se forem passadas pastas como argumento, também verifica os ficheiros de bloqueio de dependências desse projeto (npm/PyPI/crates.io e mais 4 ecossistemas). No Ubuntu (20.04, 22.04, 24.04, 26.04), usa os dados próprios do Ubuntu e verifica apenas as CVE com CVSS 7,0 ou superior para as quais o Ubuntu já publicou uma correção («sem correspondências» não significa que não existam CVE conhecidas). As derivadas do Ubuntu e as versões não suportadas são indicadas como não cobertas, sem mudar para os dados do Debian. Sem qualquer atividade de rede
scan-vulns [--confirm] Geral Só é executado se active_vuln_scan_enabled: true (desativado por predefinição): verificações de acessibilidade não autenticada limitadas a 127.0.0.1 para Redis/Memcached/MongoDB/dockerd, deteção de configuração incorreta de CORS/path traversal/redirecionamento aberto/SSRF em servidores de desenvolvimento detetados, diagnóstico de open relay SMTP, e diagnósticos de exposição baseados em prova para Telnet/FTP/SSH. Sem --confirm é uma simulação
vuln-status Geral Apresenta, para cada sonda registada por scan-vulns --confirm, o último resultado registado e os dias decorridos (pass_age). O resultado é um de três estados — vulnerável / seguro / inconclusivo —, e o tempo decorrido é apresentado como «hoje», «há N dia(s)» ou «desconhecido» (nunca executado). Se nunca tiver sido executada uma verificação, indica para executar primeiro scan-vulns --confirm e termina (ainda não existe uma execução agendada, pelo que o tempo decorrido reflete apenas a frequência com que foi executada manualmente). Os mesmos dados também estão disponíveis através da GUI (separador ports) e da ferramenta MCP get_vulnerability_scan_history
notifications (alias notification-history) Usuário O histórico das notificações que o RoamSwitch enviou (anomalias de auditoria de registos, deteções de ClickFix e afins) durante a última semana, das mais recentes para as mais antigas. --json imprime um array JSON e --export <FILE> grava JSON Lines
frozen [list|resume <PID>|resume all] Utilizador / root Lista os processos que as proteções (deteção de cifragem rápida por ransomware, adulteração de canary, deteção de exploits do kernel e a contenção pontual da proteção eBPF) mantêm em SIGSTOP, e liberta (SIGCONT) um que tenha sido um falso positivo. Um congelamento não é um kill, pelo que um processo libertado retoma exatamente onde parou. resume all liberta todos. Libertar um processo pertencente a root requer sudo
resource-guard (alias leak-guard) Usuário Historial de incidentes da guarda de esgotamento de recursos e anomalias de processos (apenas Server Edition): crescimento sustentado do RSS (fuga de memória / DoS) ou ciclos de falha em serviços expostos, com um nível de confiança
timeline (alias incident-timeline) Usuário Reúne numa única cronologia as deteções da proteção de links (ARP spoofing), do canary anti-ransomware, da proteção de runtime eBPF e da proteção de recursos, com a linhagem de processos e etiquetas MITRE ATT&CK (experimental). --json imprime todos os registos como um array JSON na saída padrão, e --export <FILE> grava JSON Lines (um registo por linha) num ficheiro
xdp-gate [status|enable|disable] Utilizador / root Mostra ou alterna a porta XDP de arranque (experimental). status indica se roamswitch-xdp-gate.service está ativado e o estado atual do programa. Desativado por predefinição
sensor [key|list|pair|repin|unpair|request-audit|results] Usuário/root Confiança mútua, através de códigos de emparelhamento, com o sensor de rede «RoamSwitch Sensor» instalado numa máquina de uso geral (um produto à parte). pair --addr <IP> --code <code> --fingerprint <SHA-256> emparelha com o código emitido pelo Sensor (parte-se do princípio de que o Sensor funciona com um IP fixo; a impressão digital é o valor apresentado no ecrã do Sensor ou por roamswitch-sensor pairing show, e fixa o certificado usado para o TLS 1.3 — nunca é obtida da rede e não há recurso a texto simples). repin introduz a nova impressão digital depois de o Sensor ter regenerado o seu certificado, key mostra a chave pública e o endereço deste endpoint, unpair remove o emparelhamento e request-audit pede ao Sensor uma auditoria ativa de vulnerabilidades (obtenha o resultado com results). Requer sensor_pairing_enabled: true (desativado por predefinição). Consulte o Manual de Operações do Sensor para mais detalhes
port-scan (alias portscan) Usuário Mostra o histórico de detecção da proteção de detecção de varredura de portas de entrada (IP de origem, se foi bloqueado automaticamente e a duração do bloqueio). Um recurso diferente de port-anomaly, que detecta portas desconhecidas recém-“expostas”
lockfile-fim [verify|update] [--quiet|-q] raiz Verificar (verify) ou repor (update) a linha de base de monitorização de adulteração do ficheiro de bloqueio de dependências. Requer root. Os alvos são as pastas de projeto vigiadas (lockfile_watch_dirs na edição servidor)
scan-scripts <FOLDER...> Usuário Lista estaticamente os scripts preinstall / install / postinstall / prepare declarados pelos ficheiros package.json em node_modules nas pastas de projeto indicadas (um inventário, não um veredicto; sem atividade de rede)
scan-typosquat <FOLDER...> Usuário Compara os nomes de dependências em package.json com uma lista incluída de nomes de pacotes npm populares por distância de edição 1–2 e assinala prováveis typosquats (apenas referência; sem atividade de rede)
web-scan [FOLDER...] [--quarantine] [--json] Usuário/raiz Procura webshells de PHP, JavaScript, JSP e ASP, código injetado, PHP disfarçado de imagem e abuso de .htaccess com as regras da camada de aplicações web (integradas, feed diário assinado e regras próprias em /etc/roamswitch/rules.d). Sem pasta, verifica as raízes de documentos da configuração do servidor web. Por predefinição só verifica; --quarantine (root) coloca em quarentena. Código de saída: 0 = nada, 2 = critical ou high, 1 = não foi possível executar
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] Usuário/raiz Mostra o estado das regras da camada de aplicações web (versão, versão do feed instalada, pasta das regras próprias, nível de quarentena, resposta sobre contas, hook após a deteção) (status), lista as regras carregadas (list), valida um ficheiro de regras próprias (validate), mostra as shells de início de sessão desativadas pela resposta sobre contas (locked) e restaura-as (unlock-account, root), e dá exemplos de configuração e hook (example)
kernel-modules [--json] [--apply [MODULE...]] [--remove] Usuário/raiz Verifica, apenas lendo ficheiros (sem comunicar), se os módulos do kernel que foram vias para Copy Fail, Dirty Frag e act_pedit (algif_aead, esp4, esp6, rxrpc, act_pedit) ainda podem ser carregados. --apply (root) escreve install … /bin/false em modprobe.d só para os não usados; --remove desfaz. Não conta na pontuação do diagnóstico
audit-agent-setup [FOLDER...] [--json] Usuário/raiz Verificação só de leitura (sem rede) dos ficheiros de instruções e das skills dados a agentes de IA (~/.claude, ~/.codex, ~/.cursor, ~/.gemini, ~/.agents, ~/.openclaw, além de CLAUDE.md, AGENTS.md e semelhantes nas pastas de projeto registadas para a verificação de CVE de pacotes e em qualquer FOLDER indicada) e do openclaw.json do OpenClaw. Assinala carateres Unicode invisíveis, instruções anuladas, descarregar e executar, referências a ficheiros secretos junto de um envio, código compilado dentro de uma skill, autenticação do OpenClaw desativada ou token curto e mais; o que estiver num comentário HTML é avaliado mais alto. O conteúdo dos ficheiros e os segredos nunca são impressos. Uma correspondência significa «uma pessoa deveria ler esta linha», não «malicioso». --json imprime JSON
bluetooth-audit [--json] Usuário Verifica a configuração do BlueZ (/etc/bluetooth/input.conf e main.conf) à procura de definições que deixam dispositivos não emparelhados ligar-se como teclados, e lista os teclados e ratos Bluetooth ligados (só leitura)
audit-npm-signatures <DIR> [--confirm] Usuário Verifica as assinaturas e a proveniência dos pacotes instalados com npm audit signatures (o único comando do RoamSwitch que comunica com npmjs.com; sem --confirm é uma simulação; a edição servidor também precisa de npm_audit_signatures_enabled)
install [--pm npm|pnpm] [--yes] Usuário Envolve o npm / pnpm install e confina apenas a fase dos scripts de ciclo de vida dentro de uma sandbox bwrap (a própria transferência dos pacotes usa a rede como habitualmente)
forward status|test|queue (alias event-forward) Usuário/raiz Mostra o estado do reencaminhamento de eventos (status), envia um evento de teste (test) ou lista a fila de repetição (queue) para syslog RFC 5424 / CEF, JSON Lines e um webhook estruturado assinado com HMAC. Opcional, desativado por predefinição, e envia apenas para os destinos que configurar (Manual de Operações do Servidor §16)
events search|tree|export|verify|status (alias exec-events) raiz Pesquisa (search: --since 2h --pid N --exe S --user U --parent P --text S --json), imprime a árvore de processos de (tree <pid>), exporta (export), verifica a cadeia de hashes de (verify; evidente quanto a adulteração, não à prova de adulteração) e mostra o estado de (status) o registo local do gravador de execuções. O registo é acessível apenas a root, pelo que normalmente é necessário sudo (Manual de Operações do Servidor §15)

Política de isolamento (Air-Gap)

Libertar apenas com um temporizador fixo permite que um atacante paciente espere, pelo que o desencadeador de um isolamento é classificado por confiança (em ambas as edições).

  • Baixa confiança (um Air-Gap manual, anomalias genéricas, eBPF Error / Warning e inferiores): totalmente restaurado após um temporizador curto (cliente: airgap_low_confidence_secs, 600 s por predefinição; servidor: safety_timer_secs em guard.yaml, 300 s por predefinição; 0 desativa o temporizador).
  • Alta confiança (adulteração de canary, reescrita em massa ao estilo ransomware, ARP spoofing sob lockdown, eBPF Critical / Emergency / Alert, disparo repetido da mesma regra e afins): nunca é restaurado em silêncio. Após o temporizador, a causa (PID congelado, canary, ARP, regra que volta a disparar) é reverificada e o isolamento é libertado, com uma notificação, apenas quando a causa é verificada como eliminada. Se isso não puder ser confirmado, ninguém o tiver reconhecido e o limite for atingido (cliente: airgap_hard_cap_secs; servidor: isolation_hard_cap_secs em server.conf; ambos 3600 s por predefinição, 0 = sem limite), passa para o modo DEGRADED.
  • O modo DEGRADED nunca abre por temporizador (o cliente permite apenas loopback; o servidor permite apenas os caminhos de gestão de SSH de manutenção e de IPs da lista de permissões). Só é libertado por uma reverificação que confirme a eliminação, por um reconhecimento explícito (servidor: roamswitch server ack) ou por uma libertação manual (o botão da GUI / roamswitch emergency-restore). No modo DEGRADED do cliente, o rfkill do Wi-Fi também não é levantado, a menos que airgap_degraded_lift_rfkill seja true.
  • As ligações estabelecidas que não sejam dos caminhos de gestão são cortadas (servidor: tudo exceto as portas SSH de manutenção e os IPs da lista de permissões, pelo que um canal C2 ou uma reverse shell que o atacante já tenha aberto também é cortado). Um Air-Gap manual é de baixa confiança quando vem do menu / GUI / roamswitch airgap enable sem contexto de aviso, mas quando é iniciado a partir do botão «bloquear agora» de um aviso de ARP spoofing herda a confiança (alta) desse aviso, e o MAC do gateway é reverificado, sem enviar tráfego, até coincidir com o MAC de confiança em verificações consecutivas (arp_recheck_consecutive verificações que abranjam pelo menos arp_recheck_min_secs segundos). Cada transição fica registada na cronologia de incidentes.

Recuperação de ransomware (snapshots e restauro de ficheiros)

Os comandos seguintes pertencem a roamswitch-ransomware-rollback (não são subcomandos de roamswitch). O seu estado é guardado em /var/lib/roamswitch.

Comando Permissões Descrição
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] root Cria já um snapshot do destino (predefinido $HOME). Os destinos são subvolumes btrfs e volumes lógicos LVM
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] root Vigilância permanente. Cria snapshots automaticamente perante rajadas de reescrita de ficheiros e eventos Critical registados por outras proteções, e cria também snapshots anteriores ao dano segundo um calendário (a cada 6 horas por predefinição; 4 gerações no btrfs, 2 no LVM; depois de um snapshot na deteção, os periódicos ficam em pausa 7 dias por predefinição)
roamswitch-ransomware-rollback list [--path PATH] [--json] root Lista os snapshots criados por esta ferramenta (tipo, se ainda existe e o snapshot anterior ao dano recomendado). --json para saída legível por máquina
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] root Copia apenas o ficheiro ou diretório indicado de um snapshot para outro local, sem substituir o estado atual (predefinido <destino>/RoamSwitch-Recovered/<ID>/). A primeira escolha para recuperar
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> root Torna visível o conteúdo de um snapshot para escolher o caminho a passar a restore-files (btrfs: tal como está; LVM: montagem temporária só de leitura). No fim, desmonte com unmount-browse
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N root Intervalo dos snapshots anteriores ao dano (segundos; 0 desativa, caso contrário pelo menos 300). Aplica-se a um watch em execução sem reiniciar. Não existe nenhuma definição para desativar os snapshots na deteção
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] root Reverte todo o destino para o estado de um snapshot (destrutivo). Um snapshot na deteção contém ficheiros já cifrados, pelo que é recusado sem --accept-tampered. Experimente primeiro restore-files

Exemplos

sudo roamswitch status                 # Diagnóstico completo do cliente (27 itens)
sudo roamswitch status --server        # Diagnóstico completo do Server Edition (34 itens)
sudo roamswitch ports -a               # Todas as portas em escuta
roamswitch guards                      # Estado das proteções
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets .                          # Analisar recursivamente o diretório atual
roamswitch audit-logs 72               # Analisar registos das últimas 72 horas
sudo roamswitch sharing on             # Parar automaticamente SSH/Samba/RDP em redes não fiáveis
sudo roamswitch fim verify             # Verificação de integridade de ficheiros FIM
sudo roamswitch fim update             # Atualizar a linha de base do FIM
sudo roamswitch emergency-restore      # Levantar totalmente o bloqueio de emergência e restaurar
sudo roamswitch airgap enable          # Bloqueio de emergência
sudo roamswitch airgap disable         # Levantar
sudo roamswitch server ack             # Reconhecer o isolamento de emergência (mantém um isolamento FULL estrito, liberta um DEGRADED)
roamswitch canary                      # Histórico de incidentes do canário
roamswitch vuln-status                 # Mostra o último resultado da verificação e os dias decorridos (pass_age)
roamswitch port-anomaly                # Histórico de incidentes do Port Anomaly Guard
roamswitch server ebpf                 # Estado de isolamento e histórico de incidentes da guarda eBPF
roamswitch server bans                 # Estado da guarda contra força bruta SSH e lista das origens bloqueadas
sudo roamswitch server unban 203.0.113.9   # Levantar um bloqueio da guarda SSH (requer root)
roamswitch notifications               # Histórico de notificações dos últimos 7 dias
roamswitch frozen                      # Listar processos congelados
sudo roamswitch frozen resume 12345    # Libertar um falso positivo
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10  # Empareia com o Sensor usando um código de emparelhamento
sudo roamswitch sensor key             # Mostra a chave pública/endereço próprios deste endpoint
roamswitch port-scan                   # Histórico de detecção de varredura de portas
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

O daemon da edição servidor é executado como root, pelo que os comandos que precisam de ler o conjunto de regras nftables ou identificar o proprietário de um processo (status / status --server / ports -a) devolvem resultados incorretos sem sudo (um falso veredito de “inativo”, ou informação de processo em falta). Os comandos que alteram a configuração (sharing / fim update / airgap / emergency-restore, etc.) também precisam de sudo. Todos os outros comandos, apenas de leitura, funcionam corretamente sem ele.

Advertências e Limitações
  • O --help por subcomando é suportado (por exemplo roamswitch ports --help).
  • Para saída legível por máquina, use status --json, --json (um array JSON) e --export <FILE> (JSON Lines) em timeline / notifications, events search --json, MCP (§6) ou /run/roamswitch/state.json (§5).
  • Na edição cliente não existe nenhum comando da CLI que mude o perfil diretamente (o daemon decide de forma autónoma). Para forçar um, defina manual_override em config.json ou chame diretamente o método IPC set_security_level (§5).
  • status devolve o código de saída 0 independentemente do resultado. Ao usá-lo para monitorização, analise a linha da pontuação na saída (há um exemplo na §7).

4. Arquivos de configuração

Edição Cliente (~/.config/roamswitch/config.json)

O daemon é executado como root e verifica /home/*/.config/roamswitch/config.json, usando o primeiro arquivo válido que encontrar (ou /root/.config/roamswitch/config.json em ambientes somente root).

Chave Tipo/Padrão Descrição
languagestring / localidade do SOLinguagem UI e CLI (ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT)
trusted_networks[{name, mac, level}]Redes confiáveis; mac é gateway MAC, level é open / balanced / lockdown
away_protection_levelstring /lockdownPerfil padrão em redes desconhecidas
manual_overridestring/nuloForçar open / balanced / lockdown (nulo para automático)
dns_enabledbool/trueAplicação de DNS de proteção contra ameaças
dns_providerstring /quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopestring /untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabledbool/trueMonitoramento de falsificação de ARP
gateway_arp_lock_enabledbool/trueBloqueio preventivo de gateway ARP/NDP em redes não confiáveis
port_anomaly_guard_enabledbool/trueBloquear automaticamente novas portas de escuta
system_wide_fanotify_enabledbool/trueFanotify proteção contra malware em todo o sistema
pre_exec_blocking_enabledbool/trueBloqueio de pré-execução (FAN_DENY)
mount_hardening_enabledbool/truenoexec em /tmp e /dev/shm (aplicado em perfis não abertos)
yama_memory_protect_enabledbool/trueRestrições do Yama ptrace
usb_storage_guard_enabled / usb_keyboard_guard_enabledbool/falseArmazenamento USB/proteção de teclado BadUSB (desativado por padrão)
usb_zero_trust_enabledbool/falseBarramento USB autorizado_default=0
bluetooth_guard_enabledbool / trueDesativa a «visibilidade» do Bluetooth numa rede não fidedigna (ativado por predefinição; o rádio continua ligado e os dispositivos ligados continuam ligados)
sharing_service_control_enabledbool/trueParar/restaurar automaticamente SSH/Samba/RDP
scan_exclusions[string]Caminhos absolutos excluídos da verificação
link_guardobjeto{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbool/falseTúnel VPN de inicialização automática em redes não confiáveis
vpn_backendstring /wireguardwireguard / tailscale
active_vuln_scan_enabledbool / falsePermite a execução de scan-vulns (desativado por predefinição). Requer ativação explícita, pois envia sondas de acessibilidade limitadas a 127.0.0.1
pkgcve_watched_folders[string]Pastas de projeto (caminhos absolutos) verificadas pela verificação de dependências da GUI. O comando scan-packages da CLI ignora esta definição e usa apenas as pastas passadas como argumentos de linha de comandos
sensor_pairing_enabledbool / falsePermite a confiança mútua por código de emparelhamento com o RoamSwitch Sensor (desativado por padrão). Necessário para usar o comando sensor
port_scan_detect_enabledbool / trueProteção de detecção de varredura de portas de entrada
port_scan_detect_min_distinct_portsint / 15Uma origem que se conecta a pelo menos esse número de portas distintas dentro da janela de detecção é considerada uma varredura
port_scan_detect_window_secsint / 300Janela de agregação para a detecção de varredura (segundos)
port_scan_block_enabledbool / trueBloqueia automaticamente o IP de origem da varredura detectada
port_scan_block_duration_secsint / 600Duração do bloqueio automático (segundos)
airgap_low_confidence_secsint / 600Segundos até um Air-Gap de baixa confiança ser restaurado automaticamente (0 = nunca automaticamente). Não se aplica aos isolamentos de alta confiança (§3, «Política de isolamento (Air-Gap)»)
airgap_hard_cap_secsint / 3600Segundos até um isolamento de alta confiança passar ao modo DEGRADED (0 = sem limite). O modo DEGRADED nunca abre por temporizador
airgap_degraded_lift_rfkillbool / falseSe o modo DEGRADED também levanta o rfkill do Wi-Fi (por predefinição, não levanta)
airgapAutoRfkillbool / trueSe o Air-Gap também bloqueia o rádio Wi-Fi com rfkill (restaurado na libertação)
arp_recheck_consecutiveint / 3Número de verificações consecutivas em que o MAC do gateway tem de coincidir com o MAC de confiança para que um isolamento por ARP spoofing seja considerado eliminado (1 ou mais)
arp_recheck_min_secsint / 60O número mínimo de segundos que a coincidência consecutiva tem de abranger
arp_recheck_active_probebool / trueNum isolamento acionado por ARP, quando o gateway não tem entrada na cache de vizinhos (e a ligação está ativa), envia um pedido ARP direto para verificar o MAC do gateway. Qualquer resposta com um MAC diferente do de confiança conta como divergência. No máximo uma sonda a cada 20 segundos
credential_access_watch_enabledbool / trueNotifica quando um processo inesperado abre um ficheiro de credenciais (chave privada em ~/.ssh, ~/.aws/credentials, ~/.config/gcloud, repositório de credenciais de um navegador); apenas notificação, ativado por predefinição. As ferramentas de cópia de segurança e os indexadores ficam isentos desde o início; isente outros com credential_access_watch_allow. As alterações aplicam-se em cerca de 30 segundos. Uma leitura muito curta, como cat ou head, em que o programa termina antes de o RoamSwitch conseguir identificar o seu executável, pode não ser comunicada.
ssh_guard_*—Definições da guarda contra força bruta SSH. As 10 chaves e os seus valores predefinidos são os mesmos da 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 (vazio; uma matriz de IP / CIDR ou uma cadeia separada por vírgulas), ssh_guard_log_source (auto), ssh_guard_yield_to_fail2ban (true) e ssh_guard_trust_key_days (30). Trabalha apenas enquanto o sshd estiver em execução. Um valor fora do intervalo volta ao predefinido. As alterações são aplicadas em cerca de um minuto (sem reiniciar). Liste e levante os bloqueios com roamswitch bans e roamswitch unban
fim_intrusion_context_enabledbool / trueAcrescenta às notificações de adulteração de ficheiros (FIM) e de ficheiros de bloqueio a conta e o executável do processo que escreveu e o início de sessão SSH a que pertence (origem, hora, método de autenticação); num ficheiro de credenciais, só quando o processo pertence a um início de sessão SSH. Tem efeito após reiniciar o daemon. Não é enviado nada para o exterior
forward_*—Definições de reencaminhamento de eventos (syslog / JSON Lines / webhook assinado). Opcional, desativado por predefinição. As chaves são 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 (os tipos e as predefinições estão no Manual de Operações do Servidor §18)
exec_recorder_* / exec_rule*—Definições do gravador de execuções local e das regras de correlação apenas de notificação EXR-001 a EXR-007. Ativado por predefinição (desativado em anfitriões com menos de 1 GiB de memória; uma definição explícita prevalece). As chaves são 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 e exec_rules_isolation_optin (predefinição false; só quando é true é que as regras de gravidade alta desencadeiam isolamento)
Cuidado com SSH remoto
Com sharing_service_control_enabled: true, conectar-se a uma rede não confiável desconecta sessões SSH ativas. Deixe-o desativado em servidores headless.

Edição de servidor (/etc/roamswitch/server.conf)

A edição servidor usa um ficheiro de configuração em formato INI protegido com permissões 0600 (apenas root). O tipo, os valores permitidos, a predefinição e a necessidade de reinício de cada chave estão no Manual de Operações do Servidor §18. Altere as chaves com roamswitch server config show|get|set ou no editor de configuração de roamswitch server tui (todas as 146 chaves de server.conf e guard.yaml). A edição servidor não suporta o recarregamento da configuração, por isso aplique as alterações com sudo roamswitch server restart.

Computadores partilhados: modo só para administradores

Num computador partilhado por várias pessoas, sudo touch /etc/roamswitch/admin-only ativa o modo só para administradores. As alterações que afetam todo o computador (firewall, DNS, VPN, USB, reforço do kernel e das montagens, rádios, confiança do Sensor e semelhantes) ficam então limitadas ao root ou aos utilizadores do grupo sudo, wheel ou roamswitch. As ações ligadas aos seus próprios ficheiros e processos (isolamento, kill, freeze, análises) funcionam como antes. /etc/roamswitch/admin-only só conta se pertencer ao root e não puder ser escrito por outros (um utilizador não o pode criar para mudar de modo). Está desativado por predefinição (sem ficheiro).

5. Logs e arquivos de estado de tempo de execução

Caminho Alvo Descrição
journalctl -u roamswitch.serviceClienteLogs do daemon do cliente (alterações de perfil, detecções, erros)
journalctl -u roamswitch-server.serviceServidorLogs do daemon do servidor (eventos FIM, detecções Falco, isolamentos)
/run/roamswitch/roamswitch.sockClienteSoquete de domínio Unix do daemon do cliente IPC
/run/roamswitch/events.sockServidorO socket de integração eBPF do Falco / Tetragon (root:root, modo 0600; o Falco também corre como root, pelo que não é necessária nenhuma configuração adicional de permissões)
/run/roamswitch/state.jsonClienteEstado do ciclo: {active_level, network_trusted, fanotify_ready}
/run/roamswitch/alerts.jsonClienteFila de alertas recentes
/run/roamswitch/approvals.jsonClienteFila de aprovação pendente
/run/roamswitch/fanotify.readyClienteArquivo de sinalização indicando que o fanotify guard está em execução
/var/lib/roamswitch/fim.dbServidorBanco de dados hash de linha de base FIM SHA-256
~/.local/share/roamswitch/quarantine/AmbosCofre de quarentena (0700, amostras 0400) + .metadata.json
/var/lib/roamswitch/exec_log/AmbosO JSON Lines com cadeia de hashes do gravador de execuções (apenas root, 0600). Pesquise e verifique com roamswitch events
/run/roamswitch/airgap_isolation.json / host_isolation.jsonAmbosO estado de isolamento (Air-Gap) (FULL / DEGRADED) e o registo do desencadeador; o isolamento sobrevive a um reinício do daemon

Chamando IPC diretamente (avançado)

O daemon aceita JSON delimitado por nova linha em /run/roamswitch/roamswitch.sock:

# Forçar mudança de perfil (edição cliente)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

# Reconciliar agora o bloqueio ARP do gateway
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

6. Status Programático (MCP)

roamswitch-mcp expõe ferramentas somente leitura sobre JSON-RPC em 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).

Não se liga a anfitriões externos e comunica localmente com o socket do daemon ou chama diretamente o roamswitch-core. get_security_report e verify_security_findings também não enviam nada para a LAN (o gateway só é lido da cache ARP e de outras informações locais). Consulte Guia de configuração do MCP

7. Receitas de automação

Verificação diária de integridade do cron → Enviar e-mail se a pontuação cair abaixo do limite

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

Fila de alertas do monitor (poll 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

Verifique a integridade do guarda fanotify (state.json)

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

8. Solução de problemas

Sintoma Resolução
roamswitch sai com "verifique se roamswitch-mcp está instalado" O Daemon não está rodando → sudo systemctl start roamswitch.service (ou roamswitch-server.service). Verifique se o soquete existe
roamswitch status mostra fanotify 🔴 "guarda parado" Exaustão transitória fs.fanotify.max_user_groups. Reinicie com sudo systemctl restart roamswitch.service e verifique no diário
O perfil permanece em balanced, nunca chega a open Verifique se o gateway MAC está registrado em trusted_networks com level: open
SSH desconecta inesperadamente A edição do cliente possui sharing_service_control_enabled: true em uma rede não confiável. Desativar via roamswitch sharing off
As alterações de configuração não entram em vigor 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).
Comunicações do servidor bloqueadas acidentalmente Acesse o console da nuvem (VNC/Serial) e execute sudo roamswitch emergency-restore

9. Referências