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).
- 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.
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) emtrusted_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/
/tmpnoexec) 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_secsemguard.yaml, 300 s por predefinição;0desativa 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_secsemserver.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 queairgap_degraded_lift_rfkillsejatrue. - 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 enablesem 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_consecutiveverificações que abranjam pelo menosarp_recheck_min_secssegundos). 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.
- O
--helppor subcomando é suportado (por exemploroamswitch ports --help). - Para saída legível por máquina, use
status --json,--json(um array JSON) e--export <FILE>(JSON Lines) emtimeline/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_overrideemconfig.jsonou chame diretamente o método IPCset_security_level(§5). statusdevolve 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 |
|---|---|---|
language | string / localidade do SO | Linguagem 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_level | string /lockdown | Perfil padrão em redes desconhecidas |
manual_override | string/nulo | Forçar open / balanced / lockdown (nulo para automático) |
dns_enabled | bool/true | Aplicação de DNS de proteção contra ameaças |
dns_provider | string /quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | string /untrusted_only | untrusted_only / always_on |
arp_spoof_guard_enabled | bool/true | Monitoramento de falsificação de ARP |
gateway_arp_lock_enabled | bool/true | Bloqueio preventivo de gateway ARP/NDP em redes não confiáveis |
port_anomaly_guard_enabled | bool/true | Bloquear automaticamente novas portas de escuta |
system_wide_fanotify_enabled | bool/true | Fanotify proteção contra malware em todo o sistema |
pre_exec_blocking_enabled | bool/true | Bloqueio de pré-execução (FAN_DENY) |
mount_hardening_enabled | bool/true | noexec em /tmp e /dev/shm (aplicado em perfis não abertos) |
yama_memory_protect_enabled | bool/true | Restrições do Yama ptrace |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | bool/false | Armazenamento USB/proteção de teclado BadUSB (desativado por padrão) |
usb_zero_trust_enabled | bool/false | Barramento USB autorizado_default=0 |
bluetooth_guard_enabled | bool / true | Desativa 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_enabled | bool/true | Parar/restaurar automaticamente SSH/Samba/RDP |
scan_exclusions | [string] | Caminhos absolutos excluídos da verificação |
link_guard | objeto | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | bool/false | Túnel VPN de inicialização automática em redes não confiáveis |
vpn_backend | string /wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | Permite 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_enabled | bool / false | Permite 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_enabled | bool / true | Proteção de detecção de varredura de portas de entrada |
port_scan_detect_min_distinct_ports | int / 15 | Uma 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_secs | int / 300 | Janela de agregação para a detecção de varredura (segundos) |
port_scan_block_enabled | bool / true | Bloqueia automaticamente o IP de origem da varredura detectada |
port_scan_block_duration_secs | int / 600 | Duração do bloqueio automático (segundos) |
airgap_low_confidence_secs | int / 600 | Segundos 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_secs | int / 3600 | Segundos até um isolamento de alta confiança passar ao modo DEGRADED (0 = sem limite). O modo DEGRADED nunca abre por temporizador |
airgap_degraded_lift_rfkill | bool / false | Se o modo DEGRADED também levanta o rfkill do Wi-Fi (por predefinição, não levanta) |
airgapAutoRfkill | bool / true | Se o Air-Gap também bloqueia o rádio Wi-Fi com rfkill (restaurado na libertação) |
arp_recheck_consecutive | int / 3 | Nú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_secs | int / 60 | O número mínimo de segundos que a coincidência consecutiva tem de abranger |
arp_recheck_active_probe | bool / true | Num 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_enabled | bool / true | Notifica 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_enabled | bool / true | Acrescenta à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) |
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.service | Cliente | Logs do daemon do cliente (alterações de perfil, detecções, erros) |
journalctl -u roamswitch-server.service | Servidor | Logs do daemon do servidor (eventos FIM, detecções Falco, isolamentos) |
/run/roamswitch/roamswitch.sock | Cliente | Soquete de domínio Unix do daemon do cliente IPC |
/run/roamswitch/events.sock | Servidor | O 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.json | Cliente | Estado do ciclo: {active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | Cliente | Fila de alertas recentes |
/run/roamswitch/approvals.json | Cliente | Fila de aprovação pendente |
/run/roamswitch/fanotify.ready | Cliente | Arquivo de sinalização indicando que o fanotify guard está em execução |
/var/lib/roamswitch/fim.db | Servidor | Banco de dados hash de linha de base FIM SHA-256 |
~/.local/share/roamswitch/quarantine/ | Ambos | Cofre de quarentena (0700, amostras 0400) + .metadata.json |
/var/lib/roamswitch/exec_log/ | Ambos | O 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.json | Ambos | O 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 |