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)、通知送信
roamswitch(CLI) ログインユーザー(一部操作は sudo) デーモンの状態を読む薄いフロントエンド。クライアント版では /run/roamswitch/roamswitch.sock 越しの IPC。サーバー版では --serverserver / fim / emergency-restore サブコマンドを提供
roamswitch-mcp AI クライアントが起動 読み取り専用の MCP サーバー(stdio / JSON-RPC)。プログラムや AI エージェントからの状態取得向け。→ MCP 連携設定
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 / コアダンプ / /tmp noexec)を該当プロファイルで適用
  • 脅威保護 DNS の適用/解除(dns_enabled + dns_scope
  • リンクガード(NFQUEUE)でフィッシング接続を警告/遮断
  • ランタイム状態を /run/roamswitch/state.json に毎サイクル出力

サーバー版

sudo systemctl status  roamswitch-server.service      # 稼働状態
sudo systemctl restart roamswitch-server.service      # 再起動
sudo systemctl reload  roamswitch-server.service      # 設定ファイル再読込
journalctl -u roamswitch-server.service -f            # ログ追尾

3. CLI コマンドリファレンス

基本構文: roamswitch <コマンド> [オプション]。引数なしで実行した場合は status と同義です。出力言語は OS ロケール(LC_ALL / LC_MESSAGES / LANGja* なら日本語、他は英語)に自動適応します。

コマンド 権限 説明
status [--server](別名 report / server-status 一般 セキュリティ健全性診断(通常20項目、--server 指定時はサーバー版25項目)、スコア(0–100)、等級、改善アドバイス
server [config|setup|test-notify|restart] 一般/root Server Edition の設定表示・変更・対話ウィザード・通知テスト
fim [verify|update] 一般/root クリティカルパス改ざん監視 (FIM) の検証 (verify) およびベースライン更新 (update)
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|ファイルパス> 一般 テキストまたはファイル中の API キー・秘密鍵・トークンを検出(内容を送信しない)
audit-logs [hours] 一般 直近 N 時間(既定 24)の journald / 認証ログを集計・分類
canary 一般 ランサムウェア・カナリア(おとりファイル)の設置状況と整合性
quarantine [list] 一般 マルウェア隔離 Vault の中身(検体・元パス・脅威名・日時)
knowledge [query](別名 faq 一般 同梱のオフラインナレッジベースを検索
airgap [enable|disable] 一般/root Air-Gap 緊急遮断の発動 / 解除。enable は全外部通信を drop、disable で復旧
help--help / -h 一般 ヘルプ表示(roamswitch <コマンド> --help でサブコマンドヘルプ)

実行例

roamswitch status                      # クライアント総合診断 (20項目)
roamswitch status --server             # サーバー版総合診断 (25項目)
roamswitch ports -a                    # 全リスニングポート
roamswitch guards                      # ガード稼働状態
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-logs 72               # 直近 72 時間のログ分析
roamswitch sharing on                  # 未信頼ネットで SSH/Samba/RDP を自動停止
roamswitch fim verify                  # FIM ファイル整合性検証
sudo roamswitch fim update             # FIM ベースライン更新
sudo roamswitch emergency-restore      # 緊急遮断の全解除と復旧
roamswitch airgap enable               # 緊急遮断
roamswitch airgap disable              # 解除
運用の注意(仕様と制限)
  • サブコマンド個別の --help(例: roamswitch ports --help)に対応しています。
  • 機械可読な取得は MCP(§6)または /run/roamswitch/state.json(§5)を使用してください。
  • クライアント版において CLI からプロファイルを直接切り替えるコマンドはありません(デーモンが自律判定)。強制したい場合は config.jsonmanual_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)。

キー 型 / 既定 意味
languagestring / OS ロケール通知・CLI の言語(ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT
trusted_networks[{name, mac, level}]信頼ネットワーク。mac はゲートウェイ MAC、levelopen / balanced / lockdown
away_protection_levelstring / lockdown未登録ネットワーク時のプロファイル
manual_overridestring / nullopen / balanced / lockdown を強制。null で自動
dns_enabledbool / true脅威保護 DNS
dns_providerstring / quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopestring / untrusted_onlyuntrusted_only(未信頼のみ)/ always_on(常時)
arp_spoof_guard_enabledbool / trueARP スプーフィング監視
gateway_arp_lock_enabledbool / true未信頼ネットでのゲートウェイ ARP/NDP 予防固定
port_anomaly_guard_enabledbool / true新規の未知リスニングポート自動遮断
system_wide_fanotify_enabledbool / trueシステム全体 fanotify マルウェアガード
pre_exec_blocking_enabledbool / true実行前ブロック(FAN_DENY)
entropy_freeze_enabledbool / trueランサムウェア高速凍結(SIGSTOP)
mount_hardening_enabledbool / true/tmp/dev/shm の noexec 化(open 以外で適用)
yama_memory_protect_enabledbool / trueYama ptrace 制限
usb_storage_guard_enabled / usb_keyboard_guard_enabledbool / falseUSB ストレージ / BadUSB キーボードガード(既定 OFF)
usb_zero_trust_enabledbool / falseUSB バス authorized_default=0
bluetooth_guard_enabledbool / false未信頼ネットで Bluetooth を停波(既定 OFF)
sharing_service_control_enabledbool / trueSSH / Samba / RDP の自動停止・復元
scan_exclusions[string]YARA・ClamAV 両方から除外する絶対パス(配下含む)
link_guardobject{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbool / false未信頼ネットで VPN トンネルを自動起動
vpn_backendstring / wireguardwireguard / tailscale
リモート SSH 運用時の注意
sharing_service_control_enabled: true かつ未信頼ネットワークに接続すると 稼働中の SSH セッションが切断されます。リモート運用では OFF 推奨です。

サーバー版 (/etc/roamswitch/server.conf)

サーバー版は INI 形式の設定ファイルを用い、パーミッション 0600(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 0660。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_baseline.dbサーバーFIM の SHA-256 ベースラインハッシュデータベース
~/.local/share/roamswitch/quarantine/共通隔離 Vault(0700、検体 0400)+ .metadata.json

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 / get_exposed_ports / get_guard_status / get_quarantine_status / get_canary_status / audit_url_safety / audit_secrets / audit_security_logs / get_app_help)。

ネットワークは一切使わず、デーモンの Unix ソケットか roamswitch-core を直接呼びます。設定方法は 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.servicejournalctl -u roamswitch | grep "fanotify marks established" で確認
プロファイルが balanced のまま open にならない そのゲートウェイ MAC が trusted_networkslevel: open で登録されているか確認(levelbalanced なら仕様どおり)
SSH が突然切れる クライアント版で sharing_service_control_enabled: true かつ未信頼ネット判定。リモート運用では roamswitch sharing off
設定を変えたのに効かない クライアント版デーモンは /home/*/.config/…最初の 1 つを読む。反映は systemctl restart roamswitch.service。サーバー版は /etc/roamswitch/server.conf を編集後に sudo systemctl reload roamswitch-server
サーバー版で誤って通信を遮断してしまった クラウド事業者のコンソールから sudo roamswitch emergency-restore を実行し初期復帰

9. 関連ドキュメント