導入と設定

署名つきデータの更新の状態を見る

署名つきデータの更新の状態を確かめ、デーモンの異常終了からの再起動と通知、元に戻せるアンインストールを、手順で確かめます。

  • レベル: 入門
  • 約30分
  • 2026-11-12

#署名つきデータの更新の状態を見る

Server Edition は、カーネルの CVE マップ、Web ルール、KEV の一覧などを、署名を確かめてから受け取ります。これが 署名つきの脅威データの自動更新 です。受け取るのは roamswitch-updater で、roamswitch-update.timer が1日に1回動かします。

タイマーは、起動の 15 分後に初めて動き、そのあとは 24 時間ごとです。台数が多くても同じ時刻に集まらないよう、最大 3 時間ずらします(タイマーの設定 OnBootSec=15min、OnUnitActiveSec=24h、RandomizedDelaySec=3h)。

受け取ったデータの日付と、doctor の行を見る

初めて入れた直後の状態です。初めて入れるときは、パッケージの処理が、署名つきデータを 1 回取りに行きます。

ls /var/lib/roamswitch/*.VERSION
systemctl list-timers roamswitch-update.timer --all --no-pager
sudo roamswitch doctor | grep 署名
実行結果
/var/lib/roamswitch/cve_kernel_map.VERSION
/var/lib/roamswitch/epss_scores.VERSION
/var/lib/roamswitch/kev_catalog.VERSION
/var/lib/roamswitch/package_cve_map_homebrew.VERSION
/var/lib/roamswitch/package_cve_map_ubuntu.VERSION
/var/lib/roamswitch/web_rules.VERSION
NEXT                            LEFT LAST PASSED UNIT                    ACTIVATES
Thu 2026-11-12 04:19:39 UTC 2h 21min -         - roamswitch-update.timer roamswitch-update.service

1 timers listed.
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:57 UTC

*.VERSION のファイルが、もうあります。入れたときの 1 回の取得で、届いたものです。タイマーの LAST は - のままです。この取得はタイマーではなく、パッケージの処理が動かしたためです。

パッケージの処理は、取得を始めるだけで、終わりを待ちません。apt の直後に見ると、まだ届く途中のこともありました。そのときは *.VERSION が一部だけで、doctor は「まだ1度も動いていません」と出ます。数秒後には、6 つそろいました。

1 回だけ、手で動かします。

sudo systemctl start roamswitch-update.service
sudo journalctl -u roamswitch-update.service --no-pager -o cat | grep -E "installed|already"
for f in /var/lib/roamswitch/*.VERSION; do echo "$f: $(cat $f)"; done
sudo roamswitch doctor | grep 署名
出力の抜粋
2026-11-12T01:57:47.396749Z  INFO cve kernel map installed: 2026-11-09 (7763393 bytes)
2026-11-12T01:57:48.437448Z  INFO Ubuntu package-CVE map installed: 2026-11-09 (8628608 bytes)
2026-11-12T01:57:48.795744Z  INFO Homebrew CVE map installed as package_cve_map_homebrew.json (Linux uses its node, php and gitlab rows for the runtime checks): 2026-11-11 (1973025 bytes)
2026-11-12T01:57:49.148917Z  INFO web rules installed: 2026-11-11 (33126 bytes)
2026-11-12T01:57:49.386060Z  INFO KEV list installed: 2026-11-10.1903 (29654 bytes)
2026-11-12T01:57:49.641100Z  INFO EPSS scores installed: 2026-11-11 (573614 bytes)
2026-11-12T01:58:28.739960Z  INFO web rules already at 2026-11-11
2026-11-12T01:58:28.739993Z  INFO KEV list already at 2026-11-10.1903
2026-11-12T01:58:28.740000Z  INFO EPSS scores already at 2026-11-11
/var/lib/roamswitch/cve_kernel_map.VERSION: 2026-11-09
/var/lib/roamswitch/epss_scores.VERSION: 2026-11-11
/var/lib/roamswitch/kev_catalog.VERSION: 2026-11-10.1903
/var/lib/roamswitch/package_cve_map_homebrew.VERSION: 2026-11-11
/var/lib/roamswitch/package_cve_map_ubuntu.VERSION: 2026-11-09
/var/lib/roamswitch/web_rules.VERSION: 2026-11-11
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:58 UTC

ログの前の 6 行は、入れたとき(01:57)の取得です。後の 3 行が、いま手で動かした分です。版が変わっていないので、何も受け取らずに「already at」で終わりました。それでも、doctor の「最後の成功」は 01:58 に進みます。(この VM のジャーナルには、前に入れたときの行も残っていました。抜粋は、最後に入れたときの分だけです。)

*.VERSION には、データごとの版(日付)が1行ずつ入ります。package_cve_map_homebrew.VERSION は、ログの「Homebrew CVE map」の版です。名前は Homebrew ですが、Linux では、その中の node・php・gitlab の行を、実行中のプログラムの検査に使います(ログの文)。

doctor の時刻は UTC です。この例は、日本時間の 11 月 12 日 10 時 58 分です。

doctor の更新の行は、状態によって分かれます(ソースの文言。上の 3 つは、この講座の VM でも出ました)。

表示意味
正常 「更新は動いています」直近の実行が成功した
正常 「運用者の設定で止めてあります」cve_kernel_map_updates_enabled が false
正常 「まだ1度も動いていません」1 度も成功していない。入れたときの取得がまだ終わっていないか、行われず、タイマーの最初の実行を待っている
注意 「直近の実行が失敗しました」失敗の理由と、最後の成功の時刻が出る
注意 「更新タイマー … が止まっています」動かすコマンドが一緒に出る
注意 「最後の実行は … で、1週間以上たっています」タイマーは動いているが、実行が止まっている

#通信先を確かめて、止めて、戻す

更新は、受け取るだけです。外へ出るのは roamswitch-updater の HTTPS の GET だけで、待ち受けるポートはありません。設定とログで、そのとおりかを見ます。

通信先と待ち受けを見て、更新を止める

変更を伴う操作です(設定を変えて、デーモンを再起動します)。最後に元へ戻します。

まず、通信先を見ます。デバッグのログを出して、updater を手で1回動かします。手で動かすと、systemd の制限の外で動くので、確かめるときだけに使います。

sudo RUST_LOG=debug /usr/bin/roamswitch-updater 2>&1 | sed -n "/writing prelude/,/^\$/p" | head -20
sudo ss -ltnupH | grep -c roamswitch
sudo ss -xlpH | grep roamswitch
出力の抜粋
2026-11-12T01:58:40.442031Z DEBUG writing prelude: GET /updates/v1/manifest HTTP/1.1
Host: lafine.net
User-Agent: RoamSwitch-Updater
Accept: */*
2026-11-12T01:58:40.667525Z DEBUG Streaming body until content-length: 6968
2026-11-12T01:58:40.667545Z DEBUG response 200 to GET https://lafine.net/updates/v1/manifest
2026-11-12T01:58:40.667566Z DEBUG adding stream to pool: https|lafine.net|443 -> Stream(RustlsStream)
2026-11-12T01:58:40.667581Z DEBUG pulling stream from pool: https|lafine.net|443 -> Stream(RustlsStream)
2026-11-12T01:58:40.667586Z DEBUG sending request (reused connection) GET https://lafine.net/updates/v1/manifest.sig
2026-11-12T01:58:40.667588Z DEBUG writing prelude: GET /updates/v1/manifest.sig HTTP/1.1
Host: lafine.net
User-Agent: RoamSwitch-Updater
Accept: */*
2026-11-12T01:58:40.909261Z DEBUG Body entirely buffered (length: 89)
2026-11-12T01:58:40.909293Z DEBUG adding stream to pool: https|lafine.net|443 -> Stream(RustlsStream)
2026-11-12T01:58:40.909299Z DEBUG response 200 to GET https://lafine.net/updates/v1/manifest.sig
2026-11-12T01:58:40.913498Z  INFO web rules already at 2026-11-11
2026-11-12T01:58:40.913524Z  INFO KEV list already at 2026-11-10.1903
2026-11-12T01:58:40.913529Z  INFO EPSS scores already at 2026-11-11
0
u_str LISTEN 0      4096                       /run/roamswitch/events.sock 14720 * 0 users:(("roamswitch-serv",pid=1798,fd=25))

読み方は次のとおりです。

  • 通信先は lafine.net だけです。署名つきの一覧(manifest)と、その署名(manifest.sig)を、同じ接続で取ります。データの版が変わっていなければ、ここで終わります
  • 送るヘッダーは Host、User-Agent: RoamSwitch-Updater、Accept だけです。問い合わせの文字列もありません
  • TCP と UDP の待ち受けは 0 件です。あるのは、同じマシンの中だけで使う UNIX ソケットです

次に、更新を止めます。設定のキーは cve_kernel_map_updates_enabled で、既定は true です。反映には再起動が要ります。

sudo roamswitch server config get cve_kernel_map_updates_enabled
sudo roamswitch server config set cve_kernel_map_updates_enabled false
grep -o '"enabled": [a-z]*' /var/lib/roamswitch/updates.json | head -1
sudo systemctl restart roamswitch-server; sleep 5
grep -o '"enabled": [a-z]*' /var/lib/roamswitch/updates.json | head -1
sudo journalctl -u roamswitch-server --since "-30s" --no-pager -o cat | grep -i "CVE data updates"
sudo RUST_LOG=debug /usr/bin/roamswitch-updater 2>&1 | tail -5
grep '"lastSuccess"' /var/lib/roamswitch/updates.json
sudo roamswitch doctor | grep 署名
出力の抜粋
true
  ✓ サーバー設定を更新・保存しました。 (cve_kernel_map_updates_enabled = false)
  反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
"enabled": true
"enabled": false
2026-11-12T01:58:42.089522Z  INFO roamswitch_server_daemon: CVE data updates: disabled by the operator — no network contact; using the embedded baseline (kernel CVE map, web rules, KEV list, EPSS scores, Ubuntu package-CVE map)
2026-11-12T01:58:47.344666Z  INFO updates disabled — nothing to do, no network contact
  "lastSuccess": "2026-11-12T01:58:40.913591712+00:00",
[正常] 署名つきデータの更新は、運用者の設定で止めてあります(server.conf: cve_kernel_map_updates_enabled = false)。更新のための接続はせず、同梱のデータで動きます。

保存しただけでは、updates.json は true のままです。デーモンが起動するときに、server.conf の値を updates.json へ写します。止めたあとの updater は、通信せずに終わりました。lastSuccess は、止める前に手で動かした 01:58 のままです。doctor は、設定で止めてあることを示します。

元に戻します。

sudo roamswitch server config set cve_kernel_map_updates_enabled true
sudo systemctl restart roamswitch-server; sleep 5
grep -o '"enabled": [a-z]*' /var/lib/roamswitch/updates.json | head -1
sudo roamswitch doctor | grep 署名
出力の抜粋
  ✓ サーバー設定を更新・保存しました。 (cve_kernel_map_updates_enabled = true)
  反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
"enabled": true
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:58 UTC
止めていた間の実行は、記録に残りません

戻したあとの「最後の成功: 01:58」は、止める前の実行の時刻です。止めていた間に updater が「何もしない」で終わった実行では、updates.json の lastRun も lastSuccess も書き換わりません。doctor の時刻が古ければ、止めていた期間があったと読めます。

#デーモンが落ちても戻ることを確かめる

自己監視と自動再起動 は、Server Edition では systemd とデーモンが分けて受け持ちます。異常終了したデーモンを、systemd が起動し直します(Restart=always、RestartSec=3)。ユニットは Type=notify と WatchdogSec=30 で、デーモンが 30 秒応えなければ、ハングとみなして起動し直します。起動し直したデーモンは、前回が異常終了だったことを、通知で知らせます。

デーモンを強制終了して、戻るまでを見る

変更を伴う操作です(デーモンを止めます)。最後に systemctl start で戻します。

systemctl cat roamswitch-server | grep -E "^(Restart|RestartSec|Type|NotifyAccess|WatchdogSec)="
systemctl show roamswitch-server -p NRestarts -p MainPID
sudo kill -9 $(systemctl show roamswitch-server -p MainPID --value)
sleep 1; systemctl is-active roamswitch-server
sleep 4; systemctl is-active roamswitch-server
systemctl show roamswitch-server -p NRestarts -p MainPID
sudo journalctl -u roamswitch-server --since "-15s" --no-pager -o short-iso | grep -E "systemd\[1\]"
出力の抜粋
Type=notify
NotifyAccess=main
WatchdogSec=30
Restart=always
RestartSec=3
MainPID=3297
NRestarts=0
activating
active
MainPID=3631
NRestarts=1
2026-11-12T01:59:47+00:00 ubuntu systemd[1]: roamswitch-server.service: Main process exited, code=killed, status=9/KILL
2026-11-12T01:59:47+00:00 ubuntu systemd[1]: roamswitch-server.service: Failed with result 'signal'.
2026-11-12T01:59:47+00:00 ubuntu systemd[1]: roamswitch-server.service: Consumed 1.917s CPU time, 59.3M memory peak, 0B memory swap peak.
2026-11-12T01:59:50+00:00 ubuntu systemd[1]: roamswitch-server.service: Scheduled restart job, restart counter is at 1.
2026-11-12T01:59:50+00:00 ubuntu systemd[1]: Starting roamswitch-server.service - RoamSwitch Server Edition Daemon (eBPF Runtime Guard & FIM)...
2026-11-12T01:59:51+00:00 ubuntu systemd[1]: Started roamswitch-server.service - RoamSwitch Server Edition Daemon (eBPF Runtime Guard & FIM).

PID が変わり、NRestarts が 1 増えました。落ちてから起動し直すまでは、約 3 秒でした。Type=notify なので、デーモンが準備を終えて知らせるまでは activating です。

通知の履歴を見ます。

sudo roamswitch notifications | sed -n 5,10p
実行結果
  2026-11-12T01:59:50.883309296+00:00
  RoamSwitch Server が異常終了し、再起動しました
    ホスト: ubuntu (IP: 192.168.64.26)
    RoamSwitch Server が異常終了し、systemd が再起動しました。いまは動いています。
    終了した理由は `sudo journalctl -u roamswitch-server --since "2026-11-12 01:59:06"` で確かめてください。
    時刻: 2026-11-12 01:59:50

起動し直した時刻に、1 件の通知が入りました。この VM の中の Webhook の受け取り側にも、同じ本文が届きました。--since の時刻は、落ちる前の起動の時刻です。通知の履歴は、読む人の言語で出ます(LANG=en_US.UTF-8 なら英語)。Webhook に送る本文は、server.conf の language の言語です。

続けて 2 回目の kill -9 をすると、通知は増えませんでした。デーモンのログには「told together with the next notice (at most one an hour)」と出ます。落ち続けるときも、通知は 1 時間に 1 回にまとめます。systemctl restart のあとには、通知は出ませんでした。

systemctl stop で止めたときは、戻りません。運用者が止めたものとして扱われるからです。

sudo systemctl stop roamswitch-server; sleep 6; systemctl is-active roamswitch-server
sudo nft list tables | grep -c roamswitch
sudo systemctl start roamswitch-server; sleep 5; systemctl is-active roamswitch-server
実行結果
inactive
6
active

止めている間も、RoamSwitch の nft のテーブルは 6 つ残っていました。サービスを止めても、ネットワークの規則は消えません。systemctl stop は運用者の操作なので、起動し直したあとも、異常終了の通知は出ません。

長く止めたときは、別の通知が出ます。ログ改ざん監視が有効なとき、3 分以上止めてから起動すると、「RoamSwitch のデーモンが止まっていました」と、止まっていた時間(この VM では約 4 分)が、次の起動のときに届きました。止まっている間は、何も知らせられません。

サービスを止めただけで、外したつもりになる

systemctl stop や disable だけでは、nft のテーブルはカーネルに残ります。規則を書き直すものがいなくなるだけです。RoamSwitch を外すときは、次の章の roamswitch uninstall を使います。

#apt で版が上がったときに見ること

アップグレードは apt で行います。パッケージは、動いているデーモンだけを再起動します。止めてあったサービスは、止めたままにします。サービスが無効なときは、有効にするコマンド(sudo systemctl enable --now roamswitch-server.service)を1行で示します。例外は更新のタイマーで、更新が有効なら動かします(パッケージのスクリプト)。

apt upgrade のあとに doctor を読む

変更を伴う操作です(パッケージを入れ替えます)。リポジトリにある版は1つだけです(apt-cache policy roamswitch-server)。前の版に戻して上げ直すことは、apt ではできません。そこで、同じ版を --reinstall で入れ直します。パッケージの処理は、版が上がったときと同じ道を通ります(出力の「was upgraded」)。新しい版が出たときは、sudo apt-get update && sudo apt-get upgrade のあとに、同じことを確かめます。

sudo apt-get install --reinstall -y roamswitch-server 2>&1 | grep RoamSwitch
systemctl is-enabled roamswitch-server; systemctl is-active roamswitch-server
sudo roamswitch doctor | grep -E "パッケージ|デーモン|署名|失敗"
出力の抜粋
RoamSwitch Server Edition was upgraded. Check: roamswitch doctor
enabled
active
[正常] パッケージ roamswitch-server のファイルは、インストール時のままです
[正常] RoamSwitch のデーモンが動いています
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:58 UTC
失敗はありません(注意 2 件)

見るのは3つです。

  • パッケージのファイル: 入れ替えたファイルが、パッケージのとおりかを示します
  • デーモン: 入れ替えたプログラムで、動き直しています
  • 署名つきデータ: 受け取ったデータは、入れ替えでは消えません。「最後の成功」の時刻は、入れ直す前と同じ 01:58 でした

1 分ほど待って、もう一度実行します。

sleep 60; sudo roamswitch doctor | grep -E "パッケージ|デーモン|署名|失敗"
出力の抜粋
[正常] パッケージ roamswitch-server のファイルは、インストール時のままです
[正常] RoamSwitch のデーモンが動いています
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:58 UTC
失敗はありません(注意 3 件)

1 分後は、注意が 3 件に増えました。増えたのは fail2ban の行です。SSH の守りが起動して状態を書き出すまで、直後の doctor には出ませんでした。残りの 2 件は、外向き通信の遮断リストが空であることと、Web ルールです(この VM は Webhook を設定してあるので、緊急通知の経路の注意は出ません)。入れ直しで増えた注意はありません。

サービスを無効にしてから入れ直すと、パッケージは起動せず、roamswitch-server.service is not enabled, so it does not protect this host. To turn it on: sudo systemctl enable --now roamswitch-server.service と出ました。

doctor は、1 分待ってからも読む

アップグレードや再起動の直後は、まだ状態を書き出していない項目があります。直後の 1 回で終えず、1 分ほど待ってから、もう一度実行して比べます。件数が変わったら、増えた行を読みます。

#アンインストールの前後を比べる

元に戻せるアンインストール は、roamswitch uninstall で行います。プログラムを消す前に、ネットワークを元へ戻し、囮ファイルと、セットアップが足した設定ファイルを取り除きます。囮ファイルは、中身に RoamSwitch の印があるものだけを消します。

--purge を付けるか
  • 付けない: /etc/roamswitch(設定)と /var/lib/roamswitch(状態、履歴、受け取ったデータ)を残します。入れ直す予定があるとき
  • 付ける: その2つも消します。マシンを手放すとき、最初からやり直したいとき

どちらでも、ネットワークの規則、サービス、囮ファイルは取り除きます。apt のリポジトリの設定と署名鍵は、どちらでも残ります。

消す前と後を、同じスクリプトで比べる

変更を伴う操作です(RoamSwitch を消します)。使い捨ての VM で試してください。元に戻すには、apt install で入れ直します。

比べるための、状態を書き出すスクリプトを用意します。本物のファイルが消えないことも見るため、囮と同じ場所に、AWS の公開サンプルの鍵で、ダミーの /root/.aws/credentials を置きます。

sudo mkdir -p /root/.aws
printf '[default]\naws_access_key_id = AKIAIOSFODNN7EXAMPLE\naws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\n' | sudo tee /root/.aws/credentials >/dev/null
cat > /tmp/snap.sh <<'EOF'
echo "## nft"; sudo nft list tables | grep roamswitch
echo "## units"; systemctl list-unit-files 'roamswitch*' --no-legend | awk '{print $1, $2}'
echo "## etc"; sudo ls -A /etc/roamswitch 2>&1
echo "## varlib"; sudo ls -A /var/lib/roamswitch 2>&1 | tr '\n' ' '; echo
echo "## decoys"; sudo find / -xdev -name '.roamswitch_security_canary_do_not_delete.*' 2>/dev/null | sort
echo "## awsdummy"; sudo ls -l /root/.aws/credentials 2>&1
echo "## pkg"; dpkg-query -W -f '${db:Status-Abbrev} ${Package}\n' roamswitch-server 2>&1
EOF
sh /tmp/snap.sh
消す前(出力の抜粋)
## nft
table inet roamswitch_server
table inet roamswitch_metadata_watch
table inet roamswitch_egress_block
table inet roamswitch_portscan
table inet roamswitch_dev_guard
table inet roamswitch_dnstunnel
## units
roamswitch-server.service enabled
roamswitch-update.service static
roamswitch-webgate.service disabled
roamswitch-update.timer enabled
## etc
.roamswitch_security_canary_do_not_delete.pdf
.roamswitch_security_canary_do_not_delete.xlsx
.roamswitch_security_canary_do_not_delete.zip
guard.yaml.example
hooks
server.conf
server.conf.example
## varlib
allowlist_clock canary cve_kernel_map.VERSION cve_kernel_map.json ebpf_heartbeat.json epss_scores.VERSION epss_scores.json exec_log fim.db honeytokens_watch.pid incident_timeline.json incident_timeline.json.lock kev_catalog.VERSION kev_catalog.json last_cve_refresh log_tamper_baseline.json notification_history.json package_cve_map_homebrew.VERSION package_cve_map_homebrew.json package_cve_map_ubuntu.VERSION package_cve_map_ubuntu.json port_guard.json quarantine server.conf.last-good server_abnormal_exit.json server_running.json suid_baseline.json updates.json updates.json.lock web_rules.VERSION web_rules.json 
## decoys
/etc/roamswitch/.roamswitch_security_canary_do_not_delete.pdf
/opt/.roamswitch_security_canary_do_not_delete.pdf
/root/.roamswitch_security_canary_do_not_delete.pdf
/srv/.roamswitch_security_canary_do_not_delete.pdf
## awsdummy
-rw------- 1 root root 116 Nov 12 02:06 /root/.aws/credentials
## pkg
ii  roamswitch-server

囮ファイルは、4 つのフォルダーに 3 つずつ、計 12 個ありました(抜粋では .pdf だけを載せています)。

--purge を付けずに消します。

sudo roamswitch uninstall --yes
sh /tmp/snap.sh
出力の抜粋(apt の出力は省略)
  次のものを取り除きます:
    - RoamSwitchのサービスとタイマー(停止して無効化)
    - 通信を止めうる全ての変更(ファイアウォール、DNS、隔離)
    - 配置した囮ファイル(中身にRoamSwitchの印があるものだけ。本物のファイルには触れません)
    - セットアップが追加した設定ファイル(aptのフック、Falco、logrotate)
    - プログラム本体(パッケージマネージャーで)
    (設定・状態・履歴は残します。消すには --purge)

  現在の状態:
    隔離の記録はありません(残った規則は、ここで取り除きます)
    ✓ RoamSwitchのサービスの停止と無効化
    ✓ 隔離の記録
    ✓ 通信を止めうるファイアウォールのテーブル
    ✓ DNSの設定
    ✓ 接続の追跡
    ✓ RoamSwitchのファイアウォールのテーブル(残り全部)
    ✓ 配置した囮ファイル(ランサムウェア用・認証情報用)
    ✓ システムに追加した設定ファイル
  プログラム本体を削除しています...
    ✓ プログラム本体 (apt)
  ✓ RoamSwitchを削除しました。
  aptのリポジトリ設定(/etc/apt/sources.list.d/roamswitch.list)と署名鍵は、そのまま残しています。
## nft
## units
## etc
hooks
server.conf
## varlib
allowlist_clock canary cve_kernel_map.VERSION cve_kernel_map.json ebpf_heartbeat.json ebpf_status.json epss_scores.VERSION epss_scores.json exec_log fim.db honeytokens_watch.pid incident_timeline.json incident_timeline.json.lock kev_catalog.VERSION kev_catalog.json last_cve_refresh log_tamper_baseline.json notification_history.json package-removed package_cve_map_homebrew.VERSION package_cve_map_homebrew.json package_cve_map_ubuntu.VERSION package_cve_map_ubuntu.json port_guard.json quarantine server.conf.last-good server_abnormal_exit.json suid_baseline.json updates.json updates.json.lock web_rules.VERSION web_rules.json 
## decoys
## awsdummy
-rw------- 1 root root 116 Nov 12 02:06 /root/.aws/credentials
## pkg
rc  roamswitch-server

前と後で、次のように変わりました。

見た場所消す前uninstall のあと
nft のテーブルroamswitch_* が 6 つなし
systemd のユニット4 つなし
囮ファイル12 個なし
/etc/roamswitch設定と囮server.conf と hooks が残る
/var/lib/roamswitch状態とデータ残る(server_running.json が消え、package-removed と ebpf_status.json が増える)
ダミーの /root/.aws/credentialsあり残る(印がないため)
パッケージiirc(設定ファイルだけ残る)

/var/lib/roamswitch に増えた package-removed は、パッケージを消したときに置かれる印です。次の入れ直しで、パッケージがこれを見て消します。消す前にあった server_running.json は、デーモンが動いている間の印で、正常に止まったので消えました。server_abnormal_exit.json は、異常終了の通知の記録です。

入れ直します。

sudo apt-get install -y roamswitch-server
systemctl is-enabled roamswitch-server; systemctl is-active roamswitch-server
sleep 3; systemctl is-active roamswitch-server
出力の抜粋
Created symlink /etc/systemd/system/multi-user.target.wants/roamswitch-server.service → /usr/lib/systemd/system/roamswitch-server.service.
Created symlink /etc/systemd/system/timers.target.wants/roamswitch-update.timer → /usr/lib/systemd/system/roamswitch-update.timer.
RoamSwitch Server Edition was installed again with the settings kept by the earlier removal; the service is enabled and running. Check: roamswitch doctor
enabled
active
active

残した設定で、サービスが有効になり、動き出しました。apt の最後の行も、有効で動いていることを示します。apt は 6 秒ほどで終わり、終わった時点で active でした。更新タイマーも enabled と active でした(server.conf の cve_kernel_map_updates_enabled に従います)。server.conf の SHA-256 は、消す前と、入れ直したあとで同じでした。

最後に、--purge で消します。この回は、別の処理が dpkg のロックを持っている間に実行します。練習用に、python3 で 25 秒だけロックを持ちます。

sudo python3 -c 'import fcntl,time; f=open("/var/lib/dpkg/lock-frontend","w"); fcntl.lockf(f, fcntl.LOCK_EX); time.sleep(25)' &
sleep 2
sudo roamswitch uninstall --purge --yes
sh /tmp/snap.sh
出力の抜粋
    - 設定・状態・履歴(/var/lib/roamswitch、/etc/roamswitch、各ユーザーの設定)
    ✓ 設定・状態・履歴
  プログラム本体を削除しています...
    別のパッケージ管理の処理(python3)が動いています。終わるのを待ってから削除します(最長 5 分)。
    ✓ プログラム本体 (apt)
  ✓ RoamSwitchを削除しました。
## nft
## units
## etc
ls: cannot access '/etc/roamswitch': No such file or directory
## varlib
ls: cannot access '/var/lib/roamswitch': No such file or directory 
## decoys
## awsdummy
-rw------- 1 root root 116 Nov 12 02:06 /root/.aws/credentials
## pkg
dpkg-query: no packages found matching roamswitch-server

別の処理が動いていると、何を待っているかを 1 行で示し、終わってから削除しました(最長 5 分待ちます)。--purge では、/etc/roamswitch と /var/lib/roamswitch も消え、パッケージの記録も残りません。ダミーの鍵のファイルは、どちらでも残りました。消したあとも、同じ VM から https://lafine.net/updates/v1/manifest を HTTPS で取れました(応答 200)。

入れ直したら、doctor で確かめます

入れ直した直後の doctor は、この VM では「[正常] RoamSwitch のデーモンが動いています」と出ました。入れ直しは、サービスを有効にして起動します(apt の最後の行が「the service is enabled and running」)。止めておきたいサーバーでは、入れ直したあとで sudo systemctl disable --now roamswitch-server を実行します。

#見えない部分

確かめたこと・確かめていないこと

使い捨ての Ubuntu 24.04(arm64)の VM で確かめた範囲では、次のようになります。

  • doctor の更新の行は、正常のときも3つの意味があります。「まだ1度も動いていません」「動いています」「止めてあります」です。正常の印だけで判断せず、文と時刻を読みます
  • 「最後の成功」は、データを受け取った時刻とは限りません。版が変わっていなければ、何も受け取らずに成功になります(ログは「already at」)。データの新しさは *.VERSION の日付で見ます
  • 通信先は、デバッグのログで見ました。手で動かした updater は、systemd の制限の外で動きます。タイマーから動くときは、ユニットの RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX などの制限の中で動きます
  • アンインストールは、名前に roamswitch が付く nft のテーブルだけを消します(ソースで確認)。ほかの道具が作ったテーブルには触れません
  • --purge のあとは、/var/log/roamswitch も残りませんでした。apt のリポジトリの設定と署名鍵は残ります
確認問題

roamswitch uninstall --yes(--purge なし)のあと、残っているものはどれですか

解説を見る

--purge なしでは、設定と状態と履歴を残します。ネットワークの規則と囮ファイルは、どちらでも取り除きます。入れ直すと、残した設定のまま、サービスが有効になって動き出します。

確認問題

sudo systemctl stop roamswitch-server のあと、正しいのはどれですか

解説を見る

Restart=always で起動し直すのは、異常終了したときです。運用者が止めたときは、止めたままで、異常終了の通知も出ません。規則はカーネルに残るので、外すときは roamswitch uninstall を使います。

#次に学ぶこと

  • 通知の届け先と、届いたかの確かめ方は、「通知と転送の設定」(準備中)で扱います
  • ネットワークの隔離と、その解き方は、「自動隔離の方針の設定」(準備中)で扱います
  • 設定ファイルの全項目は、Linux Server の運用マニュアル にあります
扱う機能

対応する攻撃手法 (ATT&CK): T1685

確認した内容

2026-11-12に確認しました。対象は Linux 1.17.39 です。使い捨ての Ubuntu 24.04(arm64)の VM で、公開の apt から 1.17.39 を purge のあと入れ直し、*.VERSION・doctor・デバッグログの通信先、cve_kernel_map_updates_enabled の切り替え、kill -9 からの再起動と異常終了の通知(履歴と VM の中の Webhook)、3 分以上の systemctl stop、--reinstall での入れ替え、uninstall と --purge(dpkg のロックを持たせた状態)の前後比較と入れ直しを、日本語と英語で実行しました。

コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。