ROAMSWITCH FOR LINUX · OPERATIONS REFERENCE
CLI / ヘッドレス運用ガイド
GUI を使わずに、クラウド VPS・SSH 越し・cron・監視スクリプト・AI エージェント(MCP)から RoamSwitch for Linux を運用するための完全リファレンスです。
- クライアント版 (
roamswitch): ノートPC・ワークステーション・移動端末向け。接続先ネットワーク(Wi-Fi/有線)の信頼度に応じて自律で nftables プロファイルを切り替えます。本ガイドは主にこのクライアント版のヘッドレス/CLI運用を解説します。 - サーバー版 (
roamswitch-server): インターネットに常時露出するクラウド VPS(AWS, GCP, さくらのVPS等)やオンプレミスサーバー向け。インバウンド既定全拒否(Default Drop)、SSH 締め出し防止、ファイル整合性監視(FIM)、Falco / eBPF 連携、緊急通知(Telegram / LINE / Webhook)を装備した完全ヘッドレス設計です。サーバー版の詳細な運用手順は RoamSwitch Server Edition 運用マニュアル および サーバー版セキュリティ設計書 を参照してください。
1. 構成要素
| コンポーネント | 実行主体 | 役割 |
|---|---|---|
roamswitch-daemon(クライアント版) |
root(systemd Type=notify) |
クライアント特権処理すべて。nftables 制御、ネットワーク判定、ランサム/マルウェア監視、fanotify、ARP/NDP 固定、DNS 適用など。TCP/UDP ソケットは開かない |
roamswitch-server-daemon(サーバー版) |
root(systemd Type=notify) |
サーバー特権処理すべて。インバウンド既定全破棄、SSH/管理元IP例外保護、FIM(150+ の重要ファイルとディレクトリ集合の改ざん検知)、Falco eBPF UNIXソケット受信・プロセス凍結(SIGSTOP)、実行(exec)レコーダー、イベント転送(オプトイン)、通知送信 |
roamswitch(CLI) |
ログインユーザー(一部操作は sudo) | デーモンの状態を読む薄いフロントエンド。クライアント版では /run/roamswitch/roamswitch.sock 越しの IPC。サーバー版では --server や server / fim / emergency-restore サブコマンドを提供 |
roamswitch-mcp |
AI クライアントが起動 | 読み取り専用の MCP サーバー(stdio / JSON-RPC)。プログラムや AI エージェントからの状態取得向け。→ MCP 連携設定 |
roamswitch-ransomware-rollback |
root(watch は systemd の roamswitch-ransomware-rollback-watch.service) |
ランサムウェア復旧ツール。btrfs のサブボリュームと LVM の論理ボリュームのスナップショットを取り、必要なファイルだけを取り出す。クライアント版のパッケージに含まれる。GUI の「侵害対応」タブからも使える |
roamswitch-app |
ログインユーザー | GTK GUI(クライアント版のみ)。ヘッドレス環境では不要 |
ヘッドレス構成ではデーモン + roamswitch CLI(+ 必要なら roamswitch-mcp)だけで運用できます。 GUI が無くても自律防御はすべて動作します。
roamswitch)とサーバー版(roamswitch-server)は排他パッケージ(Conflicts)です。サーバー環境では roamswitch-server を導入してください。2. デーモン(systemd サービス)
クライアント版
sudo systemctl status roamswitch.service # 稼働状態
sudo systemctl enable roamswitch.service # 起動時に自動開始(インストール時に有効)
sudo systemctl restart roamswitch.service # 再起動
journalctl -u roamswitch.service -f # ログ追尾
journalctl -u roamswitch.service --since "1h ago"
デーモンが起動時・毎サイクル(3 秒間隔)に自律で行う処理:
- 接続中のゲートウェイ MAC を識別し、
trusted_networks設定に照らして nftables プロファイル(open/balanced/lockdown)を切り替え - ランサムウェア挙動検知(fanotify + シャノンエントロピー + カナリア)
- マルウェアのオンアクセススキャン(fanotify、任意で ClamAV)
- ARP スプーフィング監視、未信頼ネットワークでのゲートウェイ ARP/NDP 予防固定
- カーネル堅牢化(sysctl / Yama / コアダンプ /
/tmpnoexec)を該当プロファイルで適用 - 脅威保護 DNS の適用/解除(
dns_enabled+dns_scope) - リンクガード(NFQUEUE)でフィッシング接続を警告/遮断
- ランタイム状態を
/run/roamswitch/state.jsonに毎サイクル出力
サーバー版
sudo systemctl status roamswitch-server.service # 稼働状態
sudo systemctl restart roamswitch-server.service # 再起動
journalctl -u roamswitch-server.service -f # ログ追尾
3. CLI コマンドリファレンス
基本構文: roamswitch <コマンド> [オプション]。引数なしで実行した場合は status と同義です。出力言語は OS ロケール(LC_ALL / LC_MESSAGES / LANG、ja* なら日本語、他は英語)に自動適応します。
| コマンド | 権限 | 説明 |
|---|---|---|
status [--server](別名 report / server-status) |
一般 | セキュリティ健全性診断(通常27項目、--server 指定時はサーバー版34項目)、スコア(0–100)、等級、改善アドバイス。--json で同じ内容を機械可読な JSON として標準出力に出力 |
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] |
一般/root | Server Edition の管理。config は設定の表示・変更、setup は対話ウィザード、tui は全機能の TUI(roamswitch-server-tui。root で全操作、一般ユーザーは読み取り専用)、test-notify は通知テスト、restart はサービス再起動(設定のリロードには対応していません)。ack は現在の緊急隔離を確認応答します(FULL 隔離中は厳格な隔離を維持し、縮退モード中は解除。§3 の隔離ポリシー参照)。ebpf(別名 incidents)は eBPF ランタイムガードの現在の隔離状態と検知済みインシデント履歴を表示。allowlist [list|add <rule> <process> [--exe <絶対パス>]|remove] は誤検知の恒久許可リストを管理し、--exe で実行ファイルに紐づけるとプロセス名の偽装では回避できません。bans [--json] は SSH 総当たりガードの状態と禁止中の接続元(一覧は root だけが読めます)、unban <IP|IPv6 の /64|--all> は禁止の解除(root) |
fim [verify|update] [--quiet|-q] |
一般/root | クリティカルパス改ざん監視 (FIM) の検証 (verify) およびベースライン更新 (update)。--quiet で cron / systemd フックからの出力を抑制 |
bans [--json] |
一般/root | SSH 総当たりガードの状態(遮断する/検知のみ/停止中と、その理由)、いま遮断している接続元と残り時間、最近の記録を表示します。遮断の一覧は root だけが読めるので sudo を付けます。--json あり。サーバー版の server bans と同じです |
unban <IP | IPv6 /64 | --all> |
root | SSH 総当たりガードの遮断を解除し、その接続元の失敗の回数も消します。--all ですべて解除します。サーバー版の server unban と同じです |
emergency-restore |
root | eBPF/ファイアウォール緊急遮断の全解除と初期ベースライン復旧 |
ports [-a|--all] |
一般 | 0.0.0.0 で待ち受けるリスニングポート、未認証 DB、開発サーバー。-a でループバックのみのポートも含む |
guards |
一般 | 各自動防御ガード(ポート異常・ARP・USB ストレージ・ダウンロード・DNS 脅威・カナリア・Dev サーバー隔離・Bluetooth)の有効/無効 |
wifi |
一般 | 接続中 Wi-Fi の暗号化強度(Open / WEP / WPA / 有線)。SSID |
sharing [status|on|off] |
一般 | 共有サービス(SSH / Samba / RDP)の未信頼ネットワーク時 自動停止・復元。on で未信頼接続時に自動停止 |
audit-url <URL> |
一般 | URL のフィッシング/危険度をローカルのフィード+ヒューリスティックで診断(対象を取得しない) |
audit-secrets <text|ファイルパス|ディレクトリ> |
一般 | テキスト・ファイル・ディレクトリ(再帰、.git/node_modules等は除外)中の API キー・秘密鍵・トークンを検出(内容を送信しない) |
audit-logs [hours] |
一般 | 直近 N 時間(既定 24)の journald / 認証ログを集計・分類。API キーやトークン等の機密情報は自動マスキング。ログパターンをテンプレート化した新規パターン検知・頻度異常(統計的スパイク)検知の結果も表示 |
canary |
一般 | ランサムウェア・カナリア(おとりファイル)の設置状況と整合性、検知済みインシデント履歴(直近50件) |
port-anomaly(別名 port-guard) |
一般 | 未知ポート露出ガードのベースライン取得状況・自動遮断中のポート・検知済みインシデント履歴(直近50件) |
quarantine [list] |
一般 | マルウェア隔離 Vault の中身(検体・元パス・脅威名・日時) |
knowledge [query](別名 faq) |
一般 | 同梱のオフラインナレッジベースを検索 |
airgap [enable|disable] |
一般/root | Air-Gap 緊急遮断の発動 / 解除(クライアント版専用)。enable は全外部通信を drop(すでに確立していた接続も切断)、disable で復旧。自動解除の仕組みは下の「隔離(Air-Gap)ポリシー」を参照 |
help(--help / -h) |
一般 | ヘルプ表示(roamswitch <コマンド> --help でサブコマンドヘルプ) |
scan-packages [フォルダ...] |
一般 | インストール済み OS パッケージ(dpkg/pacman/dnf/zypper を自動判定)を既知 CVE マップと突き合わせ。フォルダ引数を渡すと、そのプロジェクトの依存関係(npm/PyPI/crates.io 等 7 エコシステム)のロックファイルも対象に追加。Ubuntu(20.04・22.04・24.04・26.04)では Ubuntu 専用のデータで、Ubuntu が修正版を公開済みの CVSS 7.0 以上の CVE だけを照合する(「該当なし」は既知の CVE が無いという意味ではない)。Ubuntu の派生と未対応の版は「対象外」と表示し、Debian のデータには切り替えない。ネットワーク接続は一切行わない |
scan-vulns [--confirm] |
一般 | active_vuln_scan_enabled: true(既定 OFF)の場合のみ、127.0.0.1 限定で Redis/Memcached/MongoDB/dockerd の無認証到達確認、および検出済み開発サーバーへの CORS 設定ミス・パストラバーサル・オープンリダイレクト・SSRF 診断を実行。--confirm なしはドライラン |
vuln-status |
一般 | scan-vulns --confirm が記録した各プローブの最新結果と経過日数(pass_age)を一覧表示。判定は脆弱性あり/問題なし/判定不能の3状態、経過日数は「今日」「N日前」「不明」(未実施)のいずれかで表示。一度もスキャンを実行していない場合は scan-vulns --confirm の実行を促して終了(自動での再スキャンの仕組みは無く、経過日数は実際に手動実行した頻度に依存)。同じデータは GUI(ports タブ)と MCP ツール get_vulnerability_scan_history からも参照可能 |
notifications(別名 notification-history) |
一般 | RoamSwitchが送信した通知(ログ監査異常、ClickFix検知など)の履歴(直近1週間、最新順)。--json で JSON 配列、--export <ファイル> で JSON Lines を出力 |
frozen [list|resume <PID>|resume all] |
一般/root | 各ガード(ランサムウェア高速暗号化検知・カナリア改ざん・カーネル脆弱性攻撃検知・eBPF ガードのピンポイント遮断)が SIGSTOP で凍結中のプロセスを一覧表示し、誤検知だった場合に解除(SIGCONT)。凍結は強制終了ではないため、解除すると停止した位置からそのまま再開する。resume all で全件解除。root所有プロセスの解除には sudo が必要 |
resource-guard(別名: leak-guard) |
一般 | リソース枯渇・プロセス異常検知ガード(Server Edition 限定)の検知済みインシデント履歴。ネットワーク公開サービスの継続的なRSS増大(メモリリーク/DoS)やクラッシュループを確度ティア付きで表示 |
timeline(別名: incident-timeline) |
一般 | リンクガード(ARPスプーフィング)・ランサムウェアカナリア・eBPFランタイムガード・リソースガードの検知を1つの時系列に統合。プロセス系譜と MITRE ATT&CK タグ付き(実験的)。--json で全件を JSON 配列として標準出力へ、--export <ファイル> で JSON Lines(1行1件)をファイルへ書き出し |
xdp-gate [status|enable|disable] |
一般/root | XDP 起動時ゲート(実験的)の状態表示と有効化・無効化。status は roamswitch-xdp-gate.service の有効状態と現在のプログラム状態を表示。既定は無効 |
sensor [key|list|pair|repin|unpair|request-audit|results] |
一般/root | 別リポジトリの汎用機器にインストールするネットワークセンサー「RoamSwitch Sensor」との、ペアリングコード方式による相互信頼。pair --addr <IP> --code <コード> --fingerprint <SHA-256>でSensor側が発行したコードを使ってペアリング(Sensorは固定IPで運用されている前提。フィンガープリントはSensorの画面 / roamswitch-sensor pairing show に表示される値で、TLS 1.3 で通信する証明書をピン留めします。ネットワークからは取得せず、平文へのフォールバックもしません)、repinでSensorが証明書を再生成した後の新しいフィンガープリントを入力し直し、keyで自端末の公開鍵/アドレスを表示、unpairでペアリング解除、request-auditでSensorへ能動的脆弱性監査をリクエスト(結果はresultsで取得)。sensor_pairing_enabled: true(既定 OFF)が必要。詳細は Sensor 運用マニュアル を参照 |
port-scan(別名 portscan) |
一般 | 着信ポートスキャン検知ガードの検知履歴(送信元 IP、自動遮断の有無・継続時間)を表示。port-anomaly(未知ポート「露出」検知)とは別機能 |
lockfile-fim [verify|update] [--quiet|-q] |
root | 依存関係ロックファイルの改ざん監視の検証(verify)とベースライン更新(update)。root 権限が必要。監視対象はプロジェクトフォルダ(サーバー版は lockfile_watch_dirs) |
scan-scripts <FOLDER...> |
一般 | 指定したプロジェクトフォルダ配下の node_modules から、package.json の preinstall / install / postinstall / prepare スクリプトを静的に列挙(インベントリであり脅威判定ではない。ネットワーク接続なし) |
scan-typosquat <FOLDER...> |
一般 | package.json の依存関係名を、有名な npm パッケージ名の同梱リストと編集距離 1〜2 で突き合わせ、タイポスクワッティングの疑いを提示(参考情報。ネットワーク接続なし) |
web-scan [FOLDER...] [--quarantine] [--json] |
一般/root | PHP・JavaScript・JSP・ASP の Web シェル、注入された不正コード、画像に偽装した PHP、.htaccess の悪用を、Web アプリ層の検知ルール(組み込み、署名つきの日次のフィード、/etc/roamswitch/rules.d の独自ルール)で調べる。フォルダを省略すると、Web サーバー設定のドキュメントルート。既定は確認のみで、--quarantine(root)で隔離する。終了コード: 0 = 検知なし、2 = critical または high あり、1 = 実行できなかった |
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] |
一般/root | Web アプリ層ルールの状態(版、配信された版、独自ルールの置き場、隔離の水準、アカウントへの対処、検知後のフック)の表示(status)、読み込み済みのルールの一覧(list)、独自ルールのファイルの検証(validate)、アカウント対処で無効にしたログインシェルの確認(locked)と、元に戻す操作(unlock-account、root)、設定とフックの例(example) |
kernel-modules [--json] [--apply [MODULE...]] [--remove] |
一般/root | Copy Fail・Dirty Frag・act_pedit の通り道になったカーネルモジュール(algif_aead・esp4・esp6・rxrpc・act_pedit)が、読み込める状態かを、ファイルの読み取りだけで調べる(通信しない)。--apply(root)で、使っていないものだけ modprobe.d に install … /bin/false を書き、--remove で戻す。診断のスコアには入らない |
audit-agent-setup [FOLDER...] [--json] |
一般/root | AI エージェントに読ませる指示ファイル・スキル(~/.claude・~/.codex・~/.cursor・~/.gemini・~/.agents・~/.openclaw と、パッケージ CVE 照合に登録したプロジェクトフォルダー(と指定した FOLDER)の CLAUDE.md・AGENTS.md など)と OpenClaw の openclaw.json を、読み取り専用で点検する(通信しない)。見えない Unicode 文字・指示の上書き・取得してそのまま実行する記述・秘密ファイルの参照と外部送信・スキル内のコンパイル済みコード・OpenClaw の認証無効や短いトークンなどを指摘し、HTML コメントの中は重く扱う。ファイルの本文や秘密は出力しない。一致は「人が読んで確認する箇所」で、悪意の断定ではない。--json で JSON |
bluetooth-audit [--json] |
一般 | BlueZ の設定(/etc/bluetooth/input.conf と main.conf)に、ペアリング前の機器のキーボード接続を許す記述がないかを調べ、接続中の Bluetooth のキーボード・マウスを一覧にする(読み取りのみ) |
audit-npm-signatures <DIR> [--confirm] |
一般 | npm audit signatures でインストール済みパッケージの署名・provenance を検証(RoamSwitch で npmjs.com と通信する唯一のコマンド。--confirm なしはドライラン。サーバー版は npm_audit_signatures_enabled の有効化も必要) |
install [--pm npm|pnpm] [--yes] |
一般 | npm / pnpm の install をラップし、ライフサイクルスクリプトの実行だけを bwrap サンドボックスに封じ込める(パッケージのダウンロードは通常どおりネットワークに接続して行う) |
forward status|test|queue (alias event-forward) |
一般/root | イベント転送(syslog RFC 5424 / CEF、JSON Lines、HMAC 署名付き構造化 Webhook)の状態確認(status)・疎通テスト(test)・再送キューの表示(queue)。オプトインで既定オフ、設定した宛先にのみ送信(サーバー版運用マニュアル §16) |
events search|tree|export|verify|status (alias exec-events) |
root | ローカルの実行(exec)レコーダーのログを検索(search: --since 2h --pid N --exe S --user U --parent P --text S --json)・プロセスツリー表示(tree <pid>)・エクスポート(export)・ハッシュチェーン検証(verify。改ざん検知であり防止ではない)・状態表示(status)。ログは root 専用のため通常 sudo が必要(サーバー版運用マニュアル §15) |
隔離(Air-Gap)ポリシー
固定タイマーだけで解除すると、待つだけの攻撃者に突破されるため、隔離のトリガーは信頼度で分類されます(クライアント版・サーバー版共通)。
- 低信頼度(手動の Air-Gap、汎用的な異常、eBPF の Error / Warning 以下など): 短いタイマーの後に全復旧します(クライアント:
airgap_low_confidence_secs、既定600秒。サーバー:guard.yamlのsafety_timer_secs、既定300秒。0でタイマー無効)。 - 高信頼度(カナリア改ざん、ランサムウェア的な大量書き換え、lockdown 中の ARP スプーフィング、eBPF の Critical / Emergency / Alert、同一ルールの繰り返しなど): 黙って復旧しません。タイマー以降は原因(凍結した PID・カナリア・ARP・ルールの再発火)を再確認し、原因の消滅を確認できたときだけ通知付きで解除します。確認できないまま ack もなく上限(クライアント:
airgap_hard_cap_secs、サーバー:server.confのisolation_hard_cap_secs。既定はどちらも3600秒、0= 上限なし)に達すると縮退(DEGRADED)モードに移ります。 - 縮退モードは時間経過では絶対に自動で開きません(クライアントはループバックのみ許可、サーバーは保守 SSH とホワイトリスト IP の管理経路のみ許可)。解除は、原因消滅の再確認、明示的な確認応答(サーバー:
roamswitch server ack)、または手動の解除(GUI の解除ボタン /roamswitch emergency-restore)だけです。クライアントの縮退モードでは、airgap_degraded_lift_rfkillをtrueにしない限り Wi-Fi の rfkill も解除されません。 - 管理経路以外の確立済み接続は切断されます(サーバー: 保守 SSH ポートとホワイトリスト IP 以外。攻撃者がすでに張っている C2 やリバースシェルも遮断)。手動の Air-Gap は、警告なしのメニュー / GUI /
roamswitch airgap enableなら低信頼度ですが、ARP スプーフィング警告の「今すぐ遮断」から発動した場合はその警告の信頼度(高)を引き継ぎ、ゲートウェイの MAC が信頼済みの MAC に連続して一致するかをネットワーク送信なしで再確認します(arp_recheck_consecutive回・arp_recheck_min_secs秒以上)。各遷移はインシデントタイムラインに記録されます。
ランサムウェア復旧(スナップショットとファイル単位の復元)
次のコマンドは roamswitch-ransomware-rollback のものです(roamswitch のサブコマンドではありません)。状態は /var/lib/roamswitch に保存されます。
| コマンド | 権限 | 説明 |
|---|---|---|
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] |
root | 対象(既定は $HOME)を今すぐスナップショットする。対象は btrfs のサブボリュームか LVM の論理ボリューム |
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] |
root | 常駐監視。短時間のファイルの大量書き換えや、ほかの防御が記録した Critical の事象に反応して、スナップショットを自動で取る。あわせて、事前スナップショットを定期的に取る(既定は6時間おき。btrfs は4世代、LVM は2世代を保持。検知時のスナップショットのあとは、定期の取得を既定で7日間止める) |
roamswitch-ransomware-rollback list [--path PATH] [--json] |
root | このツールが作ったスナップショットの一覧(種類、実体の有無、推奨の事前スナップショット)。--json で機械可読 |
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] |
root | スナップショットから、指定したファイルかディレクトリだけを、現在の状態を上書きせずに別の場所へ取り出す(既定は <対象>/RoamSwitch-Recovered/<ID>/)。復旧の第一選択 |
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> |
root | restore-files に渡すパスを選ぶため、スナップショットの中身を見えるようにする(btrfs はそのまま、LVM は読み取り専用の一時マウント)。終わったら unmount-browse で外す |
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N |
root | 事前スナップショットの間隔(秒。0 で無効、それ以外は300以上)。動作中の watch に再起動なしで反映される。検知時のスナップショットを止める設定はない |
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] |
root | 対象全体を、スナップショットの状態へ巻き戻す(破壊的)。検知時のスナップショットは暗号化済みのファイルを含むため、--accept-tampered がないと拒否される。まず restore-files を試す |
実行例
sudo roamswitch status # クライアント総合診断 (27項目)
sudo roamswitch status --server # サーバー版総合診断 (34項目)
sudo roamswitch ports -a # 全リスニングポート
roamswitch guards # ガード稼働状態
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets . # カレントディレクトリを再帰スキャン
roamswitch audit-logs 72 # 直近 72 時間のログ分析
sudo roamswitch sharing on # 未信頼ネットで SSH/Samba/RDP を自動停止
sudo roamswitch fim verify # FIM ファイル整合性検証
sudo roamswitch fim update # FIM ベースライン更新
sudo roamswitch emergency-restore # 緊急遮断の全解除と復旧
sudo roamswitch airgap enable # 緊急遮断
sudo roamswitch airgap disable # 解除
sudo roamswitch server ack # 緊急隔離を確認応答(FULL 隔離中は厳格な隔離を維持、縮退中は解除)
roamswitch canary # カナリアのインシデント履歴
roamswitch vuln-status # 直近のスキャン結果と経過日数(pass_age)を表示
roamswitch port-anomaly # 未知ポート露出ガードのインシデント履歴
roamswitch server ebpf # eBPFガードの隔離状態とインシデント履歴
roamswitch server bans # SSH 総当たりガードの状態と、禁止中の接続元の一覧
sudo roamswitch server unban 203.0.113.9 # SSH 総当たりガードの禁止を解除(root が必要)
roamswitch notifications # 直近1週間の通知履歴
roamswitch frozen # 凍結中プロセスの一覧
sudo roamswitch frozen resume 12345 # 誤検知だったプロセスを解除
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10 # ペアリングコードでSensorとペアリング
sudo roamswitch sensor key # 自端末の公開鍵/アドレスを表示
roamswitch port-scan # ポートスキャン検知履歴
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
サーバー版daemonはroot権限で稼働するため、nftablesルールセットの読み取りやプロセス所有者の特定が必要なコマンド(status / status --server / ports -a)はsudoなしだと不正確な結果(誤った「未稼働」判定やプロセス情報の欠落)を返します。設定を変更するコマンド(sharing / fim update / airgap / emergency-restore等)も同様にsudoが必要です。それ以外の読み取り専用コマンドはsudoなしでも正確に動作します。
- サブコマンド個別の
--help(例:roamswitch ports --help)に対応しています。 - 機械可読な取得は、
status --json、timeline/notificationsの--json(JSON 配列)と--export <ファイル>(JSON Lines)、events search --json、MCP(§6)、または/run/roamswitch/state.json(§5)を使用してください。 - クライアント版において CLI からプロファイルを直接切り替えるコマンドはありません(デーモンが自律判定)。強制したい場合は
config.jsonのmanual_overrideを設定するか、IPC のset_security_levelを直接呼び出します(§5)。 statusは診断結果に関わらず exit code 0 を返します。監視で使う場合は出力のスコア行をパースしてください(例は §7)。
4. 設定ファイル
クライアント版 (~/.config/roamswitch/config.json)
デーモンは root で動作し、/home/*/.config/roamswitch/config.json を走査して最初に見つかったものを読みます(root しかいない場合は /root/.config/roamswitch/config.json)。
| キー | 型 / 既定 | 意味 |
|---|---|---|
language | string / OS ロケール | 通知・CLI の言語(ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT) |
trusted_networks | [{name, mac, level}] | 信頼ネットワーク。mac はゲートウェイ MAC、level は open / balanced / lockdown |
away_protection_level | string / lockdown | 未登録ネットワーク時のプロファイル |
manual_override | string / null | open / balanced / lockdown を強制。null で自動 |
dns_enabled | bool / true | 脅威保護 DNS |
dns_provider | string / quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | string / untrusted_only | untrusted_only(未信頼のみ)/ always_on(常時) |
arp_spoof_guard_enabled | bool / true | ARP スプーフィング監視 |
gateway_arp_lock_enabled | bool / true | 未信頼ネットでのゲートウェイ ARP/NDP 予防固定 |
port_anomaly_guard_enabled | bool / true | 新規の未知リスニングポート自動遮断 |
system_wide_fanotify_enabled | bool / true | システム全体 fanotify マルウェアガード |
pre_exec_blocking_enabled | bool / true | 実行前ブロック(FAN_DENY) |
mount_hardening_enabled | bool / true | /tmp・/dev/shm の noexec 化(open 以外で適用) |
yama_memory_protect_enabled | bool / true | Yama ptrace 制限 |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | bool / false | USB ストレージ / BadUSB キーボードガード(既定 OFF) |
usb_zero_trust_enabled | bool / false | USB バス authorized_default=0 |
bluetooth_guard_enabled | bool / true | 未信頼ネットで Bluetooth の「検出可能」をオフ(既定 ON。電源は切らず、接続済みの機器はそのまま) |
sharing_service_control_enabled | bool / true | SSH / Samba / RDP の自動停止・復元 |
scan_exclusions | [string] | YARA・ClamAV 両方から除外する絶対パス(配下含む) |
link_guard | object | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | bool / false | 未信頼ネットで VPN トンネルを自動起動 |
vpn_backend | string / wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | scan-vulns の実行を許可(既定 OFF)。127.0.0.1 限定の到達確認プローブを送信するため明示的なオプトインが必要 |
pkgcve_watched_folders | [string] | GUI 版の依存関係照合が対象にするプロジェクトフォルダ一覧(絶対パス)。CLI の scan-packages はこの設定を参照せず、コマンドライン引数のフォルダのみを対象にする |
sensor_pairing_enabled | bool / false | RoamSwitch Sensor とのペアリングコード方式での相互信頼を許可(既定 OFF)。sensor コマンド使用に必須 |
port_scan_detect_enabled | bool / true | 着信ポートスキャン検知ガード |
port_scan_detect_min_distinct_ports | int / 15 | 検知ウィンドウ内でこの数以上の異なるポートへの接続があった送信元をスキャンと判定 |
port_scan_detect_window_secs | int / 300 | スキャン判定の集計ウィンドウ(秒) |
port_scan_block_enabled | bool / true | 検知したスキャン元 IP の自動遮断 |
port_scan_block_duration_secs | int / 600 | 自動遮断の継続時間(秒) |
airgap_low_confidence_secs | int / 600 | 低信頼度の Air-Gap が自動で全復旧するまでの秒数(0 = 自動解除しない)。高信頼度の隔離には適用されない(§3「隔離(Air-Gap)ポリシー」) |
airgap_hard_cap_secs | int / 3600 | 高信頼度の隔離が縮退(DEGRADED)モードに移るまでの秒数(0 = 上限なし)。縮退モードは時間経過では開かない |
airgap_degraded_lift_rfkill | bool / false | 縮退モードで Wi-Fi の rfkill も解除するか(既定では解除しない) |
airgapAutoRfkill | bool / true | Air-Gap 中に Wi-Fi 無線を rfkill でブロックするか(解除時に元へ戻す) |
arp_recheck_consecutive | int / 3 | ARP スプーフィングによる隔離の原因が消えたとみなすのに必要な、ゲートウェイ MAC の連続一致チェック回数(1 以上) |
arp_recheck_min_secs | int / 60 | 上記の連続一致が続かなければならない最短の秒数 |
arp_recheck_active_probe | bool / true | ARP 起因の隔離で、ゲートウェイの近隣キャッシュが無いとき(リンクが生きている場合のみ)、ARP を 1 回直接問い合わせてゲートウェイの MAC を確認するか。応答に信頼 MAC 以外が 1 つでもあれば不一致。20 秒に 1 回まで |
credential_access_watch_enabled | bool / true | 認証情報ファイル(~/.ssh の秘密鍵、~/.aws/credentials、~/.config/gcloud、ブラウザの資格情報ストア)を想定外のプロセスが開いたら通知(通知のみ・既定 ON。バックアップツールとインデクサーは最初から除外、ほかは credential_access_watch_allow で除外。設定は約 30 秒以内に反映。cat や head のようなごく短い読み取りで、RoamSwitch が実行ファイルを特定する前にプログラムが終了した場合は、通知されないことがあります) |
ssh_guard_* | — | SSH 総当たりガードの設定です。10 個のキーと既定値は、サーバー版(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(空。IP / CIDR の配列かカンマ区切りの文字列)、ssh_guard_log_source(auto)、ssh_guard_yield_to_fail2ban(true)、ssh_guard_trust_key_days(30)。sshd が動いているときだけ働きます。範囲外の値は既定に戻ります。約 1 分以内に反映されます(再起動は要りません)。一覧と解除は roamswitch bans と roamswitch unban です |
fim_intrusion_context_enabled | bool / true | ファイル改ざん(FIM)とロックファイル改ざんの通知に、書き込んだプロセスのアカウント・実行ファイルと、そのプロセスが属する SSH ログイン(接続元・時刻・認証方法)を添えます。認証情報ファイルの通知には、SSH ログインに属するときだけ添えます。デーモンの再起動後に反映されます。外部には何も送りません |
forward_* | — | イベント転送(syslog / JSON Lines / 署名付き Webhook)の設定。オプトインで既定オフ。キーは 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・forward_queue_max_age_hours(型と既定値はサーバー版運用マニュアル §18) |
exec_recorder_* / exec_rule* | — | ローカル実行(exec)レコーダーと通知専用の相関ルール EXR-001〜007 の設定。既定は有効(メモリ 1 GiB 未満のホストでは無効。明示設定が優先)。キーは 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・exec_rules_isolation_optin(既定 false。true にした場合だけ重大度の高いルールが隔離のトリガーになる) |
sharing_service_control_enabled: true かつ未信頼ネットワークに接続すると 稼働中の SSH セッションが切断されます。リモート運用では OFF 推奨です。サーバー版 (/etc/roamswitch/server.conf)
サーバー版は INI 形式の設定ファイルを用い、パーミッション 0600(root 専用)で保護されます。全キーの型・取り得る値・既定値・再起動要否は サーバー版 運用マニュアル §18 にあります。roamswitch server config show|get|set で変更でき、roamswitch server tui の設定エディタ(server.conf と guard.yaml の全146キー)でも編集できます。サーバー版は設定のリロードに対応していないため、変更後は sudo roamswitch server restart で反映します。
共有マシン向け: 管理者のみモード
1台を複数人で使うマシンでは、sudo touch /etc/roamswitch/admin-only で「管理者のみ」モードにできます。ファイアウォール、DNS、VPN、USB、カーネルとマウントの強化、ラジオ、Sensor の信頼など、マシン全体に効く変更が、root か、sudo / wheel / roamswitch グループのユーザーに限られます。自分のファイルやプロセスに結びついた操作(隔離、kill、freeze、スキャン)は、これまでどおりです。/etc/roamswitch/admin-only は root 所有で、他のユーザーが書き込めない場合だけ有効です(ユーザー自身が作って切り替えることはできません)。既定はオフ(ファイルなし)です。
5. ログ・ランタイム状態ファイル
| パス | 対象 | 内容 |
|---|---|---|
journalctl -u roamswitch.service | クライアント | クライアントデーモンの全ログ(プロファイル切替、検知、エラー) |
journalctl -u roamswitch-server.service | サーバー | サーバーデーモンの全ログ(FIM、Falcoイベント、隔離動作) |
/run/roamswitch/roamswitch.sock | クライアント | クライアントデーモンの IPC Unix ドメインソケット |
/run/roamswitch/events.sock | サーバー | Falco / Tetragon eBPF 連携ソケット(root:root、mode 0600。Falco も root で動くため追加権限設定は不要) |
/run/roamswitch/state.json | クライアント | 毎サイクル更新。{active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | クライアント | 直近の通知キュー |
/run/roamswitch/approvals.json | クライアント | 承認待ちキュー |
/run/roamswitch/fanotify.ready | クライアント | fanotify ガード稼働中フラグ |
/var/lib/roamswitch/fim.db | サーバー | FIM の SHA-256 ベースラインハッシュデータベース |
~/.local/share/roamswitch/quarantine/ | 共通 | 隔離 Vault(0700、検体 0400)+ .metadata.json |
/var/lib/roamswitch/exec_log/ | 共通 | 実行(exec)レコーダーのハッシュチェーン付き JSON Lines(root 専用、0600)。roamswitch events で検索・検証 |
/run/roamswitch/airgap_isolation.json / host_isolation.json | 共通 | 隔離(Air-Gap)の状態(FULL / 縮退)とトリガーの記録。デーモンを再起動しても隔離が継続する |
IPC ソケットを直接叩く(上級者向け)
デーモンは /run/roamswitch/roamswitch.sock(Unix ストリーム)で改行区切り JSON を受けます。
# プロファイルを強制切替(クライアント版)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
# ゲートウェイ ARP 固定を今すぐ照合
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
6. プログラムからの状態取得(MCP)
roamswitch-mcp は stdio の JSON-RPC で読み取り専用ツールを提供します(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)。
外部のホストには接続せず、デーモンの Unix ソケットか roamswitch-core を直接呼びます。get_security_report と verify_security_findings は LAN にも何も送りません(ゲートウェイの確認は ARP キャッシュなどの参照だけです)。設定方法は MCP 連携設定ガイド を参照してください。
7. 自動化レシピ
cron で日次診断 → スコアが閾値未満ならメール通知
#!/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
検知イベントを監視(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
state.json で「ガードが落ちていないか」を確認
jq -e '.fanotify_ready == true' /run/roamswitch/state.json >/dev/null \
|| echo "WARNING: fanotify guard is not running" >&2
8. トラブルシューティング
| 症状 | 対処 |
|---|---|
roamswitch が「roamswitch-mcp がインストールされているか確認」で終了 |
デーモンが動いていない → sudo systemctl start roamswitch.service(サーバー版は roamswitch-server.service)。ソケットの存在確認 |
roamswitch status で fanotify 項目が 🔴「ガード停止中」 |
fs.fanotify.max_user_groups(既定 128)枯渇の一時失敗。sudo systemctl restart roamswitch.service、journalctl -u roamswitch | grep "fanotify marks established" で確認 |
プロファイルが balanced のまま open にならない |
そのゲートウェイ MAC が trusted_networks に level: open で登録されているか確認(level が balanced なら仕様どおり) |
| SSH が突然切れる | クライアント版で sharing_service_control_enabled: true かつ未信頼ネット判定。リモート運用では roamswitch sharing off |
| 設定を変えたのに効かない | クライアント版デーモンは /home/*/.config/… の最初の 1 つを読む。反映は systemctl restart roamswitch.service。サーバー版は /etc/roamswitch/server.conf を編集後に sudo roamswitch server restart(reload 非対応) |
| サーバー版で誤って通信を遮断してしまった | クラウド事業者のコンソールから sudo roamswitch emergency-restore を実行し初期復帰 |