#届け先は3つあります
検知の結果は、3つの経路で外に出せます。目的が違うので、分けて設定します。
| 経路 | 何のためか | 設定 |
|---|---|---|
| 緊急通知(Telegram・LINE・Webhook) | 人のスマートフォンやチャットに、すぐ知らせる | webhook_url など。Linux Server の導入と、最初の設定 で扱いました |
| イベントの転送(SIEM・syslog・Webhook) | SIEM やログ基盤に、機械が読める形で残す | forward_ で始まるキー |
| 通知の履歴 | このマシンの中で、出した通知を振り返る | 設定は要りません |
この講座は、イベント転送と通知の履歴を扱います。イベント転送は、オプトインで、既定はオフです。設定ファイルの注記によると、forward_enabled=true で、かつ宛先が1つ以上あるときだけ、何かを送ります。
sudo roamswitch forward statusイベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: いいえ
デーモンは転送を実行していません (無効、または未設定)#3つの宛先を設定して、試験の1件を送る
転送の宛先は、syslog、JSON Lines のファイル、Webhook の3種類です。練習では、同じマシンの中に受け取り側を立てて、3つを同時に試します。
設定ファイルを書き換えて、サービスを再起動します(変更を伴う操作です)。練習用の環境で試してください。元に戻す手順は、後の章にあります。
受け取り側を2つ立てます。Webhook は 8099 番(TCP)で、署名のヘッダーと本文を記録します。syslog は 5514 番(UDP)です。
cat > /tmp/recv.py <<'PY'
import http.server
class H(http.server.BaseHTTPRequestHandler):
def do_POST(self):
n = int(self.headers.get('content-length', 0))
body = self.rfile.read(n)
sig = self.headers.get('X-RoamSwitch-Signature', '')
with open('/tmp/fwd.log', 'a') as f:
f.write(sig + '\n' + body.decode() + '\n')
open('/tmp/fwd.body', 'wb').write(body)
open('/tmp/fwd.sig', 'w').write(sig)
self.send_response(200); self.end_headers()
def log_message(self, *a): pass
http.server.HTTPServer(('127.0.0.1', 8099), H).serve_forever()
PY
cat > /tmp/syslog.py <<'PY'
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 5514))
while True:
data, _ = s.recvfrom(65535)
with open('/tmp/syslog.log', 'a') as f:
f.write(data.decode(errors='replace') + '\n')
PY
nohup python3 /tmp/recv.py >/dev/null 2>&1 &
nohup python3 /tmp/syslog.py >/dev/null 2>&1 &Webhook の署名に使う秘密を、root だけが読めるファイルに置きます。labsecret123 は練習用のダミーです。受け取り側は同じマシン(127.0.0.1)にあります。内部のアドレスへの送信は既定で断るので、forward_webhook_allow_addresses に 127.0.0.1/32 を書いて許します。前の版から更新したサーバーでも、この手順のままで動きます(旧版の既定値 false の移行は、判断の節にあります)。宛先を設定して、再起動し、試験の1件を送ります。
sudo sh -c 'umask 077; echo labsecret123 > /etc/roamswitch/fwd.secret'
sudo roamswitch server config set forward_webhook_url http://127.0.0.1:8099/events
sudo roamswitch server config set forward_webhook_secret_file /etc/roamswitch/fwd.secret
sudo roamswitch server config set forward_syslog_url udp://127.0.0.1:5514
sudo roamswitch server config set forward_file_path /var/log/roamswitch/events.jsonl
sudo roamswitch server config set forward_webhook_allow_addresses 127.0.0.1/32
sudo roamswitch server config set forward_enabled true
sudo roamswitch server restart
sleep 5
sudo roamswitch forward status
sudo roamswitch forward testイベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: はい
稼働中: 送信要求=0 破棄(最古)=0 再送キュー=0 件 / 0 bytes
- syslog_udp: 成功=0 失敗=0 直近エラー=-
- file: 成功=0 失敗=0 直近エラー=-
- webhook: 成功=0 失敗=0 直近エラー=-
成功 syslog_udp
成功 file
成功 webhookforward_ のキーは、再起動するまで反映されません。forward status に宛先が3つ並べば、デーモンが読み込んでいます。試験の1件は、宛先ごとに成功か失敗かが出ます。
再起動の直後は、forward status に「デーモンは、まだ転送を始めていません」と出ることがあります。この確認では、2回とも再起動の直後から「稼働中」でした。sleep 5 は、念のための待ち時間です。
3か所に届いたものを見ます。
cat /tmp/syslog.log
sudo cat /var/log/roamswitch/events.jsonl
cat /tmp/fwd.log<38>1 2026-11-12T01:51:02.907Z ubuntu roamswitch 1427 forward_test [roamswitch@32473 event_id="1a1cd7386fb-593-0" rule="FWD-TEST" action="none" severity="info"] RoamSwitch event-forwarding test message
{"host":"ubuntu","event_id":"1a1cd7386fb-593-0","ts":"2026-11-12T01:51:02.907Z","source":"forward_test","severity":"info","rule":"FWD-TEST","action":"none","pid":null,"proc":null,"summary":"RoamSwitch event-forwarding test message"}
sha256=a7e53113a1e79e7a072b5c6832a60db07a1cbdb8acc6a3c990491a4b17da5963
{"host":"ubuntu","event_id":"1a1cd7386fb-593-0","ts":"2026-11-12T01:51:02.907Z","source":"forward_test","severity":"info","rule":"FWD-TEST","action":"none","pid":null,"proc":null,"summary":"RoamSwitch event-forwarding test message"}同じ event_id の1件が、3か所に届きました。読み方は次のとおりです。
- syslog は RFC 5424 の形です。先頭の
<38>は、facility 4 (auth) × 8 + 重大度 6 (info) です - ファイルと Webhook の本文は、同じ JSON です。項目は、ホスト、ID、時刻、発生元、重大度、規則、対応、PID、プロセス名、要約です
tsは UTC です(末尾のZ)。01:51:02Zは、日本時間の 11 月 12 日 10:51:02 です- ファイル
/var/log/roamswitch/events.jsonlは-rw-------で、root だけが読めます。root ではない SIEM のエージェントに読ませるなら、forward_file_groupにグループを書きます
Webhook の受け取り側は、本文が RoamSwitch から来たことを、署名で確かめられます。ヘッダー X-RoamSwitch-Signature は、本文の HMAC-SHA256 を sha256= に続けたものです。
cat > /tmp/verify.py <<'PY'
import hmac, hashlib
key = open('/etc/roamswitch/fwd.secret', 'rb').read().strip()
body = open('/tmp/fwd.body', 'rb').read()
got = open('/tmp/fwd.sig').read().strip()
want = 'sha256=' + hmac.new(key, body, hashlib.sha256).hexdigest()
print('match' if hmac.compare_digest(got, want) else 'MISMATCH')
PY
sudo python3 /tmp/verify.py
python3 -c "import hmac,hashlib;print(hmac.compare_digest(open('/tmp/fwd.sig').read().strip(),'sha256='+hmac.new(b'wrongsecret',open('/tmp/fwd.body','rb').read(),hashlib.sha256).hexdigest()))"match
False正しい秘密では一致し、違う秘密では一致しません。受け取り側では、届いた本文のバイト列そのもので計算します。JSON を読み込んで書き直すと、空白や順序が変わり、一致しなくなります。比べるときは、hmac.compare_digest のような、時間が一定の比較を使います。
- 秘密は、
forward_webhook_secretに直接書くより、forward_webhook_secret_file(0600 のファイル)か、環境変数ROAMSWITCH_FORWARD_SECRETを使います(設定ファイルの注記) - 練習では
http://を使いました。実機の宛先は、https://にします。本文には、プロセス名や要約が入ります
#本物の検知を転送する
試験の1件が届いても、本物の検知が届くとは限りません。無害な変更で、本物の検知を起こします。
/root/.ssh/authorized_keys に、コメントの行を1行足します(変更を伴う操作です)。コメントの行は、ログインの鍵として働きません。この講座の中で、元に戻します。
: > /tmp/syslog.log
sudo sh -c 'echo "# lab comment" >> /root/.ssh/authorized_keys'
sleep 10
cat /tmp/syslog.log<36>1 2026-11-12T01:51:04.238Z ubuntu roamswitch 1193 timeline.fim [roamswitch@32473 event_id="18e729305c5ec506-1193" rule="" action="notified" severity="medium" pid="1446" proc="dash"] /root/.ssh/authorized_keys: modified (no SSH login found: service tart-guest-agent.service)
<37>1 2026-11-12T01:51:04.292Z ubuntu roamswitch 1193 notification [roamswitch@32473 event_id="1a1cd738c64-4a9-1" rule="" action="notify" severity="low"] クリティカルパス改ざん検知 (FIM) (1 件の改ざん): ホスト: ubuntu (IP: 192.168.64.23) / ハッシュが一致しない重要システムファイル: / /root/.ssh/authorized_keys: 内容の変更 / プロセス: root / /usr/bin/dash / コマンド: sh -c echo "# lab comment" >> /root/.ssh/authorized_keys (pid 1446) / SSH のログインは見つかりませんでした(systemd サービス tart-guest-agent.service のプロセスです) / 推奨対応: `sudo roamswitch fim verify` で改ざん箇所を特定し復旧してください。 / 時刻: 2026-11-12 01:51:041つの変更から、2件が届きました。
timeline.fim: 検知そのものです。重大度はmediumで、書き込んだプロセス(dash、PID 1446)が入っています。要約は英語の固定の文ですnotification: 出した通知の写しです。通知には重大度がないため、いつもlowで送られます(コードの注記)。要約は通知の本文全体で、行の区切りが/になります。言語は、サーバーの設定languageのものです
元に戻します。ファイルの中身を書き戻すだけで、置き換えはしません。基準と同じ中身に戻るので、新しい検知は出ません。戻したあとに同じ行をもう一度足すと、再起動しなくても、検知と通知の写しがまた届きました。
sudo sh -c 'grep -v "^# lab comment$" /root/.ssh/authorized_keys > /tmp/ak; cat /tmp/ak > /root/.ssh/authorized_keys'次に、送る重大度の下限 forward_min_severity(既定は low)を medium に上げて、同じ変更をします。
sudo roamswitch server config set forward_min_severity medium
sudo roamswitch server restart
sleep 5
: > /tmp/syslog.log
sudo sh -c 'echo "# lab comment" >> /root/.ssh/authorized_keys'
sleep 10
cat /tmp/syslog.log
sudo roamswitch forward status<36>1 2026-11-12T01:51:40.929Z ubuntu roamswitch 1618 timeline.fim [roamswitch@32473 event_id="18e72938e77de549-1618" rule="" action="notified" severity="medium" pid="1843" proc="dash"] /root/.ssh/authorized_keys: modified (no SSH login found: service tart-guest-agent.service)
イベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: はい
稼働中: 送信要求=1 破棄(最古)=0 再送キュー=0 件 / 0 bytes
- syslog_udp: 成功=1 失敗=0 直近エラー=-
- file: 成功=1 失敗=0 直近エラー=-
- webhook: 成功=1 失敗=0 直近エラー=-届いたのは timeline.fim の1件だけです。low の通知の写しは、送られませんでした。送信要求 も 1 で、下限より低いものは数に入りません。転送しなかった通知も、通知の履歴には残りました。終わったら、上と同じコマンドで、ファイルを元に戻します。
重大度は5段階です。syslog と CEF の値は、次のように対応します(コードの対応表)。
| 重大度 | syslog | CEF |
|---|---|---|
critical | 2 (crit) | 10 |
high | 3 (err) | 8 |
medium | 4 (warning) | 5 |
low | 5 (notice) | 3 |
info | 6 (info) | 1 |
- 既定の
low: 検知と、通知の写しの両方が届きます。SIEM 側で「通知が出たか」まで追えます medium以上: 通知の写しは届きません。SIEM の取り込み量を抑えたいときに使いますforward testの試験の1件はinfoですが、下限がlowのときも届きました。試験は、宛先に届くかを見るためのものです
#届かないときと、再送キュー
宛先が止まっていても、検知は失われにくくなっています。TCP、TLS、Webhook の宛先に送れなかった分は、ディスクの再送キューに入ります。
下限を low に戻してから、Webhook の受け取り側を止めます。待ち受けは、ss で PID を調べて止めます。
sudo roamswitch server config set forward_min_severity low
sudo roamswitch server restart
sleep 5
P=$(sudo ss -ltnpH 'sport = :8099' | sed -n 's/.*pid=\([0-9]*\).*/\1/p'); kill $P
sudo roamswitch forward test; echo "exit=$?"
sudo roamswitch forward queue 成功 syslog_udp
成功 file
失敗 webhook: HTTP 0
exit=2
再送キュー: 0 (0 bytes) /var/lib/roamswitch/forward_queue.jsonlHTTP 0 は、応答が返らなかったという意味です。宛先に1つでも失敗があると、forward test は終了コード 2 で終わります(宛先が1つもないときは 1)。試験の1件は、再送キューに入りません。 再送キューは、本物のイベントのためのものです。そこで、本物の検知を起こします。
sudo sh -c 'echo "# lab comment" >> /root/.ssh/authorized_keys'
sleep 10
sudo roamswitch forward status
sudo roamswitch forward queueイベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: はい
稼働中: 送信要求=2 破棄(最古)=0 再送キュー=2 件 / 1150 bytes
- syslog_udp: 成功=2 失敗=0 直近エラー=-
- file: 成功=2 失敗=0 直近エラー=-
- webhook: 成功=0 失敗=4 直近エラー=HTTP 0
再送キュー: 2 (1150 bytes) /var/lib/roamswitch/forward_queue.jsonl
2026-11-12T01:52:02.926Z webhook /root/.ssh/authorized_keys: modified (no SSH login found: service tart-guest-agent.service)
2026-11-12T01:52:02.977Z webhook クリティカルパス改ざん検知 (FIM) (1 件の改ざん): ホスト: ubuntu (IP: 192.168.64.23) / ハッシュが一致しない重要システムファイル: / /root/.ssh/authorized_keys: 内容の変更 / プロセス: root / /usr/bin/dash / コマンド: sh -c echo "# lab comment" >> /root/.ssh/authorized_keys (pid 2180) / SSH のログインは見つかりませんでした(systemd サービス tart-guest-agent.service のプロセスです) / 推奨対応: `sudo roamswitch fim verify` で改ざん箇所を特定し復旧してください。 / 時刻: 2026-11-12 01:52:02syslog とファイルには届き、Webhook の2件だけがキューに残りました。受け取り側を、もう一度立てます。
: > /tmp/fwd.log
nohup python3 /tmp/recv.py >/dev/null 2>&1 &
sleep 20
sudo roamswitch forward queue
sudo roamswitch forward status再送キュー: 0 (0 bytes) /var/lib/roamswitch/forward_queue.jsonl
イベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: はい
稼働中: 送信要求=2 破棄(最古)=0 再送キュー=0 件 / 0 bytes
- syslog_udp: 成功=2 失敗=0 直近エラー=-
- file: 成功=2 失敗=0 直近エラー=-
- webhook: 成功=2 失敗=4 直近エラー=-20 秒ほどで、キューは空になりました。/tmp/fwd.log には、止まっていた間の2件が、元の ts のまま届いています。再送が成功すると、直近エラー は - に戻りました。失敗 の数は、止まっていた間の分が残ります。終わったら、ファイルを元に戻します。
キューの大きさには上限があります。設定ファイルの注記では、forward_queue_max_mb(既定 20 MiB)と forward_queue_max_age_hours(既定 72 時間)を超えた分は残りません。3日を超えて止まる宛先なら、そのあいだのイベントは、ファイルの宛先から取り戻します。
forward_webhook_block_private_addresses は、既定で true です。ループバック、プライベート、リンクローカル(クラウドのメタデータ)などのアドレスへの送信を、Webhook と syslog の両方で断ります。設定を誤って、内部のサービスに送ってしまうのを防げます。この講座では、同じマシンの受け取り側に送るので、最初に forward_webhook_allow_addresses に 127.0.0.1/32 を書きました。
社内の SIEM や syslog サーバーのように、内部に送る宛先があるなら、forward_webhook_allow_addresses に、その CIDR だけを書きます。許可リストにない内部のアドレスは送らず、forward status と forward test に宛先ごとの理由が出ます。理由は、画面の言語で出ます。断られた宛先のイベントは、ほかの宛先には届きます。
false にすると、内部のアドレスへの送信も断りません。宛先を許可リストに足せるときは、true のまま使います。
前の版から更新したサーバーで、server.conf に旧版の既定値の forward_webhook_block_private_addresses=false が残っているときは、更新後の最初の起動で 1 回だけ移行します。いまの送り先が使う内部のアドレスを forward_webhook_allow_addresses に足してから true にし、そのことを通知の履歴に 1 回出します。送り先の名前を引けないときは false のまま残して 1 回知らせ、次の起動でもう一度試します。転送がオフでも、アドレスで書いた送り先は移行します。移行のあとの false と、server config set で設定したスイッチは、そのまま残ります。server.json を使うホストは移行しません。
sudoを付けずにforward statusを見る: 一般ユーザーは、設定ファイル(-rw-------)を読めません。状態は出ず、「/etc/roamswitch/server.conf を読めないため、転送の設定と状態を確かめられません(root だけが読めるファイルです)。sudo roamswitch forward status で実行してください」と出て、終了コード 1 で終わります。forward testも同じ文を出し、終了コード 1 で終わります。スクリプトで確かめるときも、0 にならないので失敗とわかります。状態は、sudoを付けて見ます- ファイルの宛先を
/tmpなどに置く: サービスはProtectSystem=strictで動き、書ける場所が限られます。置けるのは/var/log/roamswitch/か/var/lib/roamswitch/の下です
sudo roamswitch server config set forward_file_path /tmp/events.jsonl
sudo roamswitch server restart
sleep 5
sudo roamswitch forward status ! forward_file_path の /tmp/events.jsonl は、サービスの保護設定(ProtectSystem=strict)で書き込めない場所のため、使われません。/var/log/roamswitch/ か /var/lib/roamswitch/ の下に置くか、ドロップイン(systemctl edit roamswitch-server)で ReadWritePaths=<ディレクトリ> を足してください
稼働中: 送信要求=0 破棄(最古)=0 再送キュー=0 件 / 0 bytes
- syslog_udp: 成功=0 失敗=0 直近エラー=-
- webhook: 成功=0 失敗=0 直近エラー=-宛先の一覧から file が消えました。このとき forward test を実行すると、失敗 file: の行に同じ理由が出ました。設定を変えたら、forward status の ! の行も読みます。試し終えたら、forward_file_path を /var/log/roamswitch/events.jsonl に戻して、再起動します。
#通知の履歴を読む
通知の履歴 は、RoamSwitch が出した通知の記録です。過去1週間の分を、roamswitch notifications で見ます。設定は要りません。
sudo roamswitch notifications=====================================================
🔔 通知履歴(過去1週間)
=====================================================
2026-11-12T01:52:02.978097915+00:00
クリティカルパス改ざん検知 (FIM) (1 件の改ざん)
ホスト: ubuntu (IP: 192.168.64.23)
ハッシュが一致しない重要システムファイル:
/root/.ssh/authorized_keys: 内容の変更
プロセス: root / /usr/bin/dash / コマンド: sh -c echo "# lab comment" >> /root/.ssh/authorized_keys (pid 2180)
SSH のログインは見つかりませんでした(systemd サービス tart-guest-agent.service のプロセスです)
推奨対応: `sudo roamswitch fim verify` で改ざん箇所を特定し復旧してください。
時刻: 2026-11-12 01:52:02
合計: 4件
これは RoamSwitch が出した通知の記録です。届いたかどうかは示しません(通知先が未設定でも記録されます)。届くことの確認: sudo roamswitch server test-notify読み方は次のとおりです。
- 先頭の時刻は UTC(
+00:00)です。日本時間は 9 時間足して、11 月 12 日 10:52 です - 書き込んだプロセス、コマンド、SSH のログインの有無が入っています。プロセスがすでに終わっていたときは、実行の記録から補ったことを一文で添えます
- 最後の2行のとおり、届いたかどうかは示しません。通知先がなくても記録されます。届くことは、
test-notifyで確かめます
本文は、読む人の言語で出ます。この確認では、language を en にしたマシンの通知も、LANG=ja_JP.UTF-8 で読むと日本語で出ました(「内容の変更」など)。アドレス、パス、コマンドの行は、記録したままです。転送の写しと通知先に送る文は、送ったときの language の言語です。
ほかのツールに渡すときは、JSON か JSON Lines で取り出します。
sudo roamswitch notifications --json | python3 -c 'import json,sys; print(sorted(json.load(sys.stdin)[0]))'
sudo roamswitch notifications --export /tmp/notif.jsonl
ls -l /tmp/notif.jsonl['body', 'text', 'timestamp', 'title']
4件を /tmp/notif.jsonl にJSON Lines形式で書き出しました。
-rw------- 1 admin admin 6272 Nov 12 01:53 /tmp/notif.jsonl1件の項目は、timestamp、title、body、text の4つです。title と body は読む人の言語の文で、text は言語によらない形(文の鍵と値)の記録です。重大度の項目はありません。書き出したファイルは -rw------- で、sudo を実行した利用者(ここでは admin)の持ち物になります。本文にはコマンドの行が入るので、ほかの人に渡すときは中身を確かめます。
#元に戻す
この講座で変えたものを、元に戻します(変更を伴う操作です)。authorized_keys は、演習のたびに元に戻してあることが前提です。
sudo roamswitch server config set forward_enabled false
for k in forward_webhook_url forward_webhook_secret_file forward_syslog_url forward_file_path forward_webhook_allow_addresses; do
sudo roamswitch server config set $k ""
done
sudo roamswitch server config set forward_min_severity low
sudo rm -f /etc/roamswitch/fwd.secret
sudo roamswitch server restart
sleep 5
sudo grep -E '^forward_(enabled|webhook_url|syslog_url|file_path)=' /etc/roamswitch/server.conf
sudo roamswitch fim verify
sudo roamswitch forward statusforward_enabled=false
forward_syslog_url=
forward_file_path=
forward_webhook_url=
✓ 改ざんは検知されませんでした。すべて正常です。 (91 ファイルを監視中)
✓ SUID / SGID ファイルに、追加や変更はありません。 (20 件を確認)
イベント転送 (SIEM/syslog/webhook) — オプトイン、既定はオフ
有効: いいえ
デーモンは転送を実行していません (無効、または未設定)forward status は、転送を止めて再起動すると「デーモンは転送を実行していません」に戻ります。受け取り側の2つは、ss で PID を調べて止めます(8099 番は TCP、5514 番は UDP)。
#見えない部分
実機(使い捨ての Ubuntu 24.04 の VM)で確かめた範囲では、次のようになります。
- 試験の1件が届いても、本物のイベントが届く証明にはなりません。この講座では、FIM の検知を起こして確かめました。宛先の取り込み規則は、本物のイベントで確かめます
- UDP の syslog は、再送しません。コードでは、再送キューに入るのは TCP、TLS、Webhook の宛先だけです。取りこぼしたくないなら、
tcp://かtls://を使います - syslog は CEF の形でも送れます(
forward_syslog_format=cef)。この確認では、CEF:0|Lafine|RoamSwitch|…で始まる行を受け取れました。server config set forward_syslog_format ""で、既定のrfc5424に戻ります。ファイルは、forward_file_max_mb(既定 50 MiB)の大きさに達すると切り替わり、古いファイルをforward_file_keep(既定 5)個まで残します(コードで確認)
forward test で、3つの宛先がすべて「成功」でした。この結果から言えることはどれですか
解説を見る
試験の1件は、宛先に届くかだけを見ます。重大度は
infoで、下限のlowより低くても送られ、再送キューにも入りません。本物のイベントは、重大度で絞られ、送れなければキューに入ります。届き方を確かめるには、無害な変更で本物の検知を起こします。
#次に学ぶこと
- 通知を受けたあとの判断は、封じ込めが働いたあとの最初の1時間 で練習できます
- 通知を読んで、誤報か本物かを見分ける方法は、「アラートが鳴ったとき(誤報か本物か)」(準備中)で扱います
- 設定ファイルの全項目は、Linux Server の運用マニュアル にあります
2026-11-12に確認しました。対象は Linux 1.17.39 です。公開の apt の 1.17.39 を入れた使い捨ての Ubuntu 24.04 の VM で、同じマシンに Webhook と UDP syslog の受け取り側を立て、全演習(forward test と終了コード、sudo なしの status、FIM の本物の検知、forward_min_severity、再送キュー、宛先の制限、CEF と既定への戻し、通知の履歴の表示と書き出し)を、日本語の VM と language=en の VM で実行しました。2026-11-12 の追記: 内部のアドレスへの送信の拒否が既定でオンになり、syslog にも効くようになったことを、roamswitch-linux の main(885c3cee)の webhook_guard.rs・event_forward.rs・server_config.rs で確かめ、演習に forward_webhook_allow_addresses 127.0.0.1/32 を足し、判断の節と後片付けを直しました。この追記の部分は VM では動かしていません。同日 2 回目の追記: 旧版の既定値 false の移行を、roamswitch-linux の main(5073d7a3・fb00c636)の egress_guard_migration.rs で確かめて判断の節に書き足しました。この追記の部分も VM では動かしていません。
コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。