RoamSwitch Server Edition 運用マニュアル
クラウド VPS(AWS, GCP, Azure, さくらのVPS, ConoHa 等)、データセンター、コンテナホスト環境のための公式導入・設定・運用リファレンスです。
1. 概要 & システム要件
RoamSwitch Server Edition は、常時インターネットに晒される Linux サーバー向けに特化した完全ヘッドレス(GUI 依存ゼロ)の自律型セキュリティ&整合性防護スイートです。
Wi-Fi 接続先の切り替えに応じた動的プロファイル切替を行うクライアント版とは異なり、サーバー版は「インバウンド既定拒否 (Default Drop)」「クリティカルパス改ざん監視 (FIM)」「カーネル LPE (Frag Gap) の予防的封鎖」「eBPF ランタイム脅威監視」「SSH 締め出し防止フェイルセーフ」「Telegram / LINE / Webhook への自律緊急通報」を中核機能とします。
動作要件
- 対応 OS: Ubuntu 22.04 / 24.04 LTS, Debian 12+, AlmaLinux / Rocky Linux / RHEL 9+, Fedora 39+, openSUSE Leap 15.5+, Raspberry Pi OS (64-bit)
- アーキテクチャ:
x86_64(amd64) またはaarch64(arm64) - カーネル要件: Linux 5.10 以降(
nftables、cgroups v2、eBPF BTF 推奨) - リソース消費: 常駐メモリ 20〜30MB、アイドル時 CPU 負荷 0.1% 未満
2. インストール手順
公式の署名付きパッケージリポジトリを利用することで、依存関係の自動解決とシステム更新コマンドでの安全な自動アップデートが可能になります。
2.1 APT(Ubuntu / Debian / Raspberry Pi OS)
# 1. リポジトリ署名鍵の登録
curl -fsSL https://lafine.net/apt/roamswitch-archive-keyring.asc \
| sudo gpg --dearmor -o /usr/share/keyrings/roamswitch-archive-keyring.gpg
# 2. リポジトリの追加
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/roamswitch-archive-keyring.gpg] https://lafine.net/apt stable main" \
| sudo tee /etc/apt/sources.list.d/roamswitch.list
# 3. インストール
sudo apt update && sudo apt install roamswitch-server
2.2 DNF / RPM(Fedora / RHEL / AlmaLinux / Rocky Linux)
# 1. GPG 鍵のインポート
sudo rpm --import https://lafine.net/rpm/RPM-GPG-KEY-roamswitch
# 2. リポジトリ設定ファイルの追加
sudo curl -fsSL -o /etc/yum.repos.d/roamswitch.repo https://lafine.net/rpm/fedora/roamswitch.repo
# 3. インストール
sudo dnf install roamswitch-server
2.3 openSUSE(zypper)
sudo rpm --import https://lafine.net/rpm/RPM-GPG-KEY-roamswitch
sudo zypper addrepo https://lafine.net/rpm/opensuse/roamswitch.repo
sudo zypper refresh && sudo zypper install roamswitch-server
roamswitch)とサーバー版(roamswitch-server)は同一ホストへの重複導入を防ぐため、パッケージマネージャのメタデータで排他指定(Conflicts)されています。サーバー用途では必ず roamswitch-server を指定してください。3. 初期設定 & サービス確認
3.1 サービス起動状態の確認
インストールが完了すると、roamswitch-server.service が即座に起動し、自動起動(enabled)に設定されます。
sudo systemctl status roamswitch-server.service
3.2 対話型セットアップウィザード
以下のコマンドで対話型セットアップウィザードを起動し、ポート・保守元 IP・通知先・封じ込め動作を対話形式で構成します(Enter で既定値を採用)。
sudo roamswitch server setup
- ポートの指定: SSH メンテナンスポート(既定
22)と公開サービスポート(既定80,443)をそれぞれカンマ区切りで入力します。 - 保守元 IP の指定: SSH 踏み台や監視元の IP / CIDR(例:
203.0.113.50/32)を指定します(空欄で全 IP からの SSH 許可)。 - 緊急通知先の設定: Telegram Bot、LINE Messaging API、汎用 Webhook(Slack / Discord / Teams)をそれぞれ有効化します。
- eBPF 重大イベント時の動作:
isolate(ホスト隔離)/freeze(当該プロセス凍結)/alert_only(通知のみ)を選択。保存後、テスト通知の送信とサービス再起動を確認します。 - カーネルCVEデータの自動更新(既定
n): コンテナ隔離監査が使うカーネルCVEデータベースを、1日1回 lafine.net から匿名取得(クエリ文字列・Cookie・識別ヘッダなし)するかを選択します。無効のままでも監査自体は組み込みベースラインで動作します。Server Editionでゼロネットワークコード方針が破られる唯一の例外であり、既定は無効(オプトイン)です。 - File Scan Guard の設定: メール中継・共有フォルダ・アップロード先のウイルススキャン(§13)を有効化するかどうか、対象ディレクトリを設定します。任意機能で既定は無効です。
- Resource Guard の設定: ネットワーク公開サービスの継続的な RSS 増大(メモリリーク/DoS)やクラッシュループを検知するリソース枯渇ガードの有効化を設定します。
- 常時稼働の中核保護についての説明表示: インバウンド既定拒否・FIM・eBPF 連携など、ウィザードを介さず常時有効な中核防御機能の一覧が表示されます(設定入力はありません)。
- 調査エージェント連携(investigation)の設定: eBPF 重大イベントや、クリティカルパス FIM・依存関係ロックファイル改ざん検知(いずれも通知のみ判定時)について、外部 AI エージェント CLI(Claude Code / agy / Codex CLI / OpenCode、またはカスタムコマンド)に一次調査を自動的に委任するかどうかを設定します(§10.1)。既定は無効です。
-100 で始まる負の数値です(例 -1001234567890)。curl -s "https://api.telegram.org/bot<token>/getUpdates" のレスポンス中の "chat":{"id":...} で正しい値を確認できます。3.3 30項目 サーバーセキュリティ診断の実行
sudo roamswitch status --server
現在のファイアウォール状態、Frag Gap 対策、Yama LSM メモリ保護、重要ファイルパーミッション、Docker 露出など 30 項目を一括監査し、0〜100 のセキュリティスコアと評価等級(S〜C)を表示します。
4. ファイアウォール & ポート設定
設定ファイル /etc/roamswitch/server.conf は、機密情報保護のためパーミッション 0600(root のみ読み書き可能)が強制されます。
# --- ファイアウォール ---
ssh_ports=22 # SSH 管理用ポート(緊急隔離時も維持)
allowed_ports=80,443 # 公開サービス用ポート
whitelist_ips=203.0.113.10/32 # 保守元 IP / CIDR(空 = 全許可、旧名 admin_source_ips 可)
protect_docker_ports=true # DOCKER-USER 保護(コンテナの FW 迂回を阻止)
preserve_ssh_on_isolation=true # 緊急隔離時も SSH 管理経路を温存(false で完全遮断)
# --- eBPF ランタイムガード ---
action_on_critical=isolate # isolate | freeze(SIGSTOP+ネット遮断) | alert_only
ebpf_socket_path=/run/roamswitch/events.sock
# --- Egress / C2 遮断 & DNS シンクホール ---
egress_ip_blocklist_enabled=true # 既定 true。フィード未投入時は無害(何もブロックしない)
dns_sinkhole_enabled=false # 既定 false(社内DNS/split-horizon環境を壊さないため)
dns_sinkhole_provider=quad9 # quad9 | cloudflare | adguard | cleanbrowsing
# --- コンテナ隔離CVEデータ(オプトイン) ---
cve_kernel_map_updates_enabled=false # 既定 false。唯一の外部通信例外(1日1回・匿名)
# --- 通知 ---
telegram_enabled=false
telegram_bot_token=
telegram_chat_id=
line_enabled=false
webhook_enabled=false
webhook_url=
# --- システム ---
language=ja
fim_check_interval_secs=300 # 旧名 scan_interval 可
設定を直接編集した場合は、サービスを再起動して反映します(roamswitch-server は reload 非対応):
sudo roamswitch server restart
4.1 重大度別ポリシー(guard.yaml、任意設定)
action_on_critical だけでは足りない、より細かい制御が必要な場合は /etc/roamswitch/guard.yaml(配布テンプレート /etc/roamswitch/guard.yaml.example)を作成します。存在しない場合は server.conf の action_on_critical から自動的に等価なポリシーが合成されるため、既存の運用に影響はありません。
policies:
on_warning:
action: log_and_notify
on_critical:
server_action: isolate_process
kill_process: true
fallback_to_host_isolation_after_retries: 3 # 同一プロセスが再発したらホスト隔離へ自動昇格
on_emergency:
action: isolate_host_all
kill_process: true
server_safeguards:
maintenance_ssh_ports: [22]
safety_timer_secs: 300 # ホスト隔離後、この秒数以内に ack が無ければ自動復帰(0で無効化)
セーフティタイマー: ホスト隔離(Air-Gap)が発動すると、管理者は原因調査の後に次のコマンドで確認応答(ack)します。応答が無いまま safety_timer_secs が経過すると、誤検知でサーバーが無期限にネットワークから切り離されたままにならないよう、RoamSwitch が自動的に隔離を解除します。
sudo roamswitch server ack
4.2 Egress / C2 遮断 と DNS シンクホール
egress_ip_blocklist_enabled=true(既定)で、既知の悪性IPへの発信を nftables でブロックします。フィードは /var/lib/roamswitch/threatfeed/malicious_ips.txt(更新機構が管理)を優先し、無ければパッケージ同梱の空シード(/usr/share/roamswitch/threatfeed/)にフォールバックするため、フィード未投入時は既定 true でも何も遮断しません。
dns_sinkhole_enabled=true にすると、フィルタリング DNS リゾルバ(Quad9 / Cloudflare / AdGuard / CleanBrowsing)へ強制的に振り向け、既知の悪性ドメイン解決をブロックします。社内 DNS や split-horizon 構成を壊す可能性があるため既定は false です。
4.3 着信ポートスキャン検知ガード
短時間に多数の異なるポートへ接続してきた送信元 IP を、nftables のログルールと journald の突き合わせで検知します(既定で有効)。確度が高いスキャン元は一定時間、自動的に遮断できます。RoamSwitch Sensor(§10.1 とは別機能。ペアリング済み Sensor による全ポート監査プローブは誤検知対策として除外されます)と併用する場合、Sensor 側の IP は自動的に対象外となります。
# --- 着信ポートスキャン検知(既定で有効) ---
port_scan_detect_enabled=true # false で無効化
port_scan_detect_min_distinct_ports=15 # この数以上の異なるポートへの接続でスキャンと判定
port_scan_detect_window_secs=300 # 判定の集計ウィンドウ(秒)
port_scan_block_enabled=true # 検知したスキャン元IPの自動遮断
port_scan_block_duration_secs=600 # 自動遮断の継続時間(秒)
検知履歴は roamswitch port-scan コマンドで確認できます。
5. SSH 締め出し防止フェイルセーフ
リモートサーバーの運用で最も重大な事故は「ファイアウォール誤設定による SSH ロックアウト」です。RoamSwitch Server Edition は多重の防御策を備えています:
- ESTABLISHED / RELATED の絶対維持: ルール適用中も既存の接続セッションは一切切断されません。
- Air-Gap 隔離時の SSH 温存: 異常を検知して全通信を緊急遮断する場合でも、
preserve_ssh_on_isolation = trueにより管理元 IP からの SSH セッションは維持され、現地対応なしで原因調査・復旧が可能です。 - 自動ロールバック機能: 不正な設定構文や nftables のロード失敗時は、直前の稼働ルールへミリ秒で自動フォールバックします。
6. コンテナ保護 (Docker / Podman)
Docker は標準でコンテナのポート公開時(-p 8080:8080 等)に独自の iptables ルールを作成し、ホストの標準ファイアウォールをバイパス(貫通)して全世界へ直接ポートを露出させる既知の問題があります。
protect_docker_ports=true(既定)のとき、RoamSwitch は DOCKER-USER チェーンの先頭に検査ルールを挿入し、コンテナ宛てのトラフィックも allowed_ports および whitelist_ips のポリシーに準拠させます。意図しない開発用データベースコンテナ等の外部露出を確実に防ぎます。
あわせて、docker events を監視するリアルタイムガードが、--privileged で起動したコンテナや /var/run/docker.sock がマウントされたコンテナ(コンテナ脱出リスク)を起動直後に検知して通知します。設定不要・常時有効で、検知はあくまで通知のみ(自動遮断は行いません)。
7. クリティカルパス FIM (改ざん監視)
150 以上の重要バイナリ(/bin/login, /usr/bin/sudo, /usr/sbin/sshd 等)や認証設定(/etc/shadow, /etc/pam.d/, /etc/sudoers 等)、systemd ユニットを SHA-256 で監視します。
7.1 手動整合性検証
sudo roamswitch fim verify
7.2 イベント駆動検知(即時)
監視対象ファイルは fanotify(FAN_CLASS_NOTIF、書き込み完了イベント)で個別に監視されており、次回の周期スキャンを待たず、改ざんが発生した瞬間にハッシュを再照合します。周期スキャン(既定 fim_check_interval_secs=300 秒間隔)はイベントを取りこぼした場合のバックストップとして併存します。
7.3 OS パッケージ更新時の自動ベースライン同期
Debian / Ubuntu 環境では、パッケージインストール時に /etc/apt/apt.conf.d/99roamswitch-fim の DPkg::Post-Invoke フックが自動構成されます。Fedora / RHEL / Rocky / AlmaLinux / openSUSE では、/var/lib/rpm を監視する systemd.path ユニット(roamswitch-fim-update.path)が同等の役割を果たします。
これにより、管理者が sudo apt upgrade(または dnf upgrade / zypper update)を実行してバイナリが正規に更新された際は、RoamSwitch が自動で検知してハッシュベースラインを静かに再同期します(誤報アラートの発生を防止)。手動で更新を反映する場合は以下を実行します:
sudo roamswitch fim update
8. eBPF ランタイムガード & Falco / Tetragon 連携
カーネル空間で動作する eBPF プローブと連携し、カーネル特権昇格脆弱性(Frag Gap)やリバースシェル、コンテナ脱出を検知します。既定のセンサーは Falco(UNIX ドメインソケット経由の JSONL)です。guard.yaml の sensor.type: tetragon を選択すると、Cilium Tetragon をセンサーとして使うこともできます(Tetragon 側のネイティブ gRPC API を同じ UNIX ソケット越しに購読するのみで、新規リッスンポートは増えません)。
8.1 ログ肥大化・I/O 負荷の徹底排除
従来のセキュリティツールで問題となる「syslog の爆発的肥大化」「ディスク容量圧迫」を防ぐため、RoamSwitch は Falco と UNIX ドメインソケット /run/roamswitch/events.sock で直結します。
- パッケージ同梱の
/etc/falco/config.d/99-roamswitch-optimized.yamlにより、ディスク書き込みなしでデーモンへ直接アラートをストリーミング。 - 日次ローテーションと圧縮保持(
/etc/logrotate.d/roamswitch-falco)により、万が一のファイル出力時もディスクを保護。
8.2 自律リアクション(検知即プロセス凍結)
悪性コードの実行や不審通信を検知した瞬間、デーモンは該当プロセスの PID へ即座に SIGSTOP を発行して実行を凍結し、nftables ルールで通信を遮断(Air-Gap)します。
9. 緊急アラート通知 (Telegram / LINE / Webhook)
重大なインシデント(ポート不正露出、FIM 改ざん、eBPF 脅威検知、緊急隔離発動)が発生した際、外部の通知プラットフォームへ即座に状況を配信します。
[notifications]
language = ja
# Telegram: Bot Token と Chat ID
telegram_bot_token = "123456789:ABCdefGHIjklMNOpqrSTUvwxYZ"
telegram_chat_id = "-1001234567890"
# LINE: Messaging API チャネルアクセストークン と ユーザーID
line_channel_access_token = "YOUR_LINE_ACCESS_TOKEN"
line_user_id = "U1234567890abcdef1234567890abcdef"
# 汎用 Webhook (Slack, Discord, Teams, 自社監視基盤)
webhook_url = "https://hooks.slack.com/services/T00/B00/XXXXX"
これらの外部通知先を設定していない場合でも、送信された通知は直近1週間ぶんローカルに保持されます。roamswitch notificationsで確認できます。
10. AI エージェント / MCP 連携運用
RoamSwitch Server Edition は、Claude、Gemini、Cursor 等の AI エージェントからサーバーのセキュリティ診断を実行できる roamswitch-mcp(Model Context Protocol サーバー)を標準内蔵しています。
設定例(Claude Desktop / AI クライアント)
{
"mcpServers": {
"roamswitch": {
"command": "/usr/bin/roamswitch-mcp",
"args": []
}
}
}
10.1 調査エージェント連携(investigation、一次自動調査のAIエージェント委任)
§10 の roamswitch-mcp が「人間の AI クライアントからの問い合わせ」向けなのに対し、investigation 連携はデーモン自身が検知イベントをきっかけに外部 AI エージェント CLI を自律的に起動する、別の仕組みです。対象は、通知のみ判定(自動隔離・凍結に至らなかった)の eBPF 重大イベント、およびクリティカルパス FIM・依存関係ロックファイルの改ざん検知です。有効化すると、デーモンはローカルのヒューリスティックによる一次判定レポート(誤検知らしさ・根拠・次の調査ステップ)を生成した上で、そのレポートを添えて設定済みの AI エージェント CLI をサブプロセスとして起動し、追加調査と要約を委任します。既定は無効です。
# /etc/roamswitch/guard.yaml に追記(server.conf とは別ファイル)
investigation:
enabled: true
command: "claude" # "claude" | "agy" | "codex" | "opencode" | 任意のカスタムコマンド
args: ["-p"] # プロンプトは自動的に末尾の引数として追加される
timeout_secs: 180
sudo roamswitch server setup の対話式ウィザード(§3.2 最終ステップ)からも同じ内容を設定できます。ツールは Claude Code(claude -p)/ agy(agy -p --dangerously-skip-permissions)/ Codex CLI(codex exec)/ OpenCode(opencode run)のプリセット、または任意のカスタムコマンドから選択します。再実行時は保存済みの設定から該当するプリセットが自動選択されます。
--dangerously-skip-permissions 等の権限確認を省略するモードでツールを起動する設定は、悪意ある入力によってエージェントが意図しない操作を行うリスクを高めます。ウィザードは agy 選択時にこの注意を表示します。信頼できないログ入力経路を持つ環境では、権限確認を省略しないツール設定を推奨します。
ネットワーク遮断中(Air-Gap 発動時など、isolate_host_all 相当の状態)は investigation 連携は呼び出されません。
11. CLI コマンド早見表
| コマンド | 必要権限 | 機能概要 |
|---|---|---|
sudo roamswitch status --server |
root | 30項目のサーバーセキュリティ診断スコアとステータスを表示 |
sudo roamswitch ports |
root | 現在外部露出しているポートおよびバインドプロセスの一覧 |
sudo roamswitch fim verify |
root | クリティカルパス重要ファイルの SHA-256 整合性検査 |
roamswitch notifications |
一般 | 直近1週間の通知履歴(送信済みの全アラート)を表示 |
sudo roamswitch server setup |
root | 対話型の初期セットアップウィザードを実行 |
sudo roamswitch fim update |
root | 現在のファイル状態を元に FIM ベースライン DB を再生成 |
sudo roamswitch server config set <key> <値> |
root | 設定キーを 1 つ変更して保存(一覧は §4) |
sudo roamswitch airgap enable / disable |
root | 手動での Air-Gap 緊急遮断 / 解除 |
sudo roamswitch emergency-restore |
root | eBPF・ファイアウォールの緊急隔離を全解除し、初期ベースラインへ復帰 |
roamswitch port-scan |
一般 | 着信ポートスキャン検知ガード(§4.3)の検知履歴(送信元IP、自動遮断の有無・継続時間)を表示 |
roamswitch sensor [key|list|pair|unpair|request-audit|results] |
一般/root | RoamSwitch Sensor とのペアリングコード方式による相互信頼。pair --addr <IP> --code <コード>でペアリング、request-auditで能動的脆弱性監査をリクエスト(結果はresultsで取得)。sensor_pairing_enabled: true(既定 OFF)が必要。詳細は Sensor 運用マニュアル を参照 |
12. トラブルシューティング & FAQ
Q1. SSH 接続が突然切断される可能性はありますか?
ありません。RoamSwitch は既知の ESTABLISHED/RELATED 接続ステートおよび ssh_ports(既定 22)を無条件に許可します。また、重大攻撃による Air-Gap 緊急隔離発動時でも preserve_ssh_on_isolation=true(既定)により管理セッションは温存されます。
Q2. 誤設定で自分自身がアクセス不能になった場合は?
クラウド事業者の Web 管理コンソール(VNC / シリアルコンソール)からログインし、sudo roamswitch emergency-restore で緊急隔離を解除するか、sudo systemctl stop roamswitch-server を実行してサービスを停止してください。
Q3. Nginx や Apache、Node.js などの Web サーバーを後から追加した場合は?
sudo roamswitch server config set allowed_ports 80,443,3000(または /etc/roamswitch/server.conf を直接編集)し、sudo roamswitch server restart を実行してください。
13. File Scan Guard (メール中継・共有フォルダ・アップロード先の保護)
メール中継、Samba/NFS 共有、ファイルアップロード先など、他者に渡すファイルを保管するディレクトリがある場合のみ関係する任意機能です。組み込み YARA エンジンは外部依存なしで clamav_scan_dirs を常時スキャンし、clamav_enabled=true にすると ClamAV によるセカンドオピニオンも追加されます。確認された脅威は自動的に /var/lib/roamswitch/quarantine へ隔離され、運用者に通知されます。
# --- File Scan Guard (ClamAV, オプトイン) ---
# 組み込みYARAは常時、clamav_scan_dirs を無条件でスキャンします。
clamav_enabled=false # true で clamdscan による追加検査を有効化
clamav_scan_dirs= # スキャン対象の絶対パス(カンマ区切り)
clamav_scan_interval_secs=86400 # スキャン間隔(秒、最小 3600)
clamav_freshclam_interval_secs=7200 # シグネチャDB自動更新間隔(秒、最小 1800)
対話式ウィザード sudo roamswitch server setup からも設定でき、get_file_scan_guard_status MCP ツールから設定・隔離状況を確認できます。
14. Log Audit (ログパターンの異常検知・通知)
journalctl の定期スキャンにより、ログメッセージをテンプレート化して新規パターン(過去に見られなかったログ形式)と頻度異常(統計的なスパイク、Z-score > 3.0)を検知します。追加のデーモンや外部依存を必要としない軽量な仕組みのため、既定で有効です。検出時は File Scan Guard や FIM と同じ通知チャネル(Telegram / LINE / Webhook)へ通知されます。ログに含まれる可能性のあるAPIキーやトークンは、通知本文へ渡す前に自動的にマスキングされます。
# --- Log Audit (既定で有効) ---
log_audit_enabled=true # false で無効化
log_audit_interval_secs=1800 # スキャン間隔(秒、最小 300)
対話式ウィザード sudo roamswitch server setup からも設定でき、roamswitch audit-logs CLI コマンドまたは audit_security_logs MCP ツールから最新の検知結果を確認できます。