RoamSwitch Sensor 維運手冊
本指南是 RoamSwitch Sensor 的安裝與維運指南。只需部署在區域網路中,即可偵測同一網段內的新裝置出現與偽裝行為,並對已安裝 RoamSwitch(Mac / Linux Client / Server Edition)的端點執行主動弱點稽核。透過 apt / dnf 套件發佈。
1. 概述與定位
RoamSwitch(Mac / Linux Client / Server Edition)無論哪個版本,本質上都是常駐在主機上的代理程式。這種形態存在兩個結構性盲點。
- 單一主機的自我診斷存在原理性盲點:所謂「對外部封閉,但在同一區域網路內的其他終端看來卻完全暴露」的橫向移動(lateral movement)風險,僅靠主機自身檢視自己是無法察覺的。
- 有些裝置根本無法安裝 RoamSwitch:IoT 裝置(網路攝影機、智慧插座、多功能事務機)、訪客/BYOD 終端、網路設備本身、嵌入式裝置等。
RoamSwitch Sensor 是部署在區域網路中的專用節點,旨在填補這兩個缺口。目前已實作並驗證的功能包括:針對同一區域網路內已安裝 RoamSwitch 的端點進行主動弱點稽核、透過 ARP 掃描與 ARP 表監控建立區域網路設備清冊,並偵測新設備出現與偽冒行為,以及透過需主動開啟的被動擷取,提供可疑行為(連線惡意 IP、殭屍網路化、DNS 通道跡象等)的參考資訊(參見 §6)。Sensor 只做偵測與回報,不會阻斷通訊。它不是 EDR,而是設計為輕量級 NDR(Network Detection & Response)與自行開發的實證型弱點掃描器相結合的產品。
updates.fetch_cve_map,預設 true。設為 false 即為完全離線運作,僅使用內建資料)。此通訊不包含設備與稽核資料。(2) 向維運人員設定的目的地傳送通知與彙整:Webhook、syslog、中央收集器僅在維運人員設定後,才會傳送到自己組織的目的地(預設什麼都不傳送)。配對完全在本機完成,無須雲端註冊或建立帳號。不內建自我防護功能(這是刻意的設計決策)。如需針對 Sensor 主機本身進行攻擊防護,建議在同一台機器上另行安裝 RoamSwitch for Linux 的 Server Edition。兩者可作為完全獨立的行程共存,互不衝突。
2. 目前驗證環境
- 支援的作業系統:Debian 12 (bookworm) 及以上 / Ubuntu 22.04 及以上(apt)、Fedora / RHEL 系列(dnf)。僅支援
x86_64(amd64),arm64目前尚不支援。 - 預期硬體(未來計畫):實際運行時設想使用無風扇 N100/N150 系列迷你 PC 等適合常駐運行的低功耗設備,但目前尚未提供針對此的專用建置與交付。
- 網路部署:需在實體或邏輯上連接到被監控區域網路的網段(
roamswitch-sensor.service使用主機網路常駐執行——因為需要直接觀測 ARP 表)。此外,為了接受端點端的配對與稽核請求,必須使用固定 IP 位址(靜態指派,或在 DHCP 伺服器上做位址保留)運作。監聽 TCP50543連接埠(預設監聽所有介面。可透過control.bind_addr變更,並在同一連接埠上接受 TLS 1.3 —— §4.4)。 - 資源佔用:常駐記憶體約數十 MB,閒置時 CPU 負載極低。
- 建議:
nmap(用於 ARP 掃描、NSE 補充診斷與定期稽核的 MAC 確認。未安裝時其他功能仍可運作,但不會進行 ARP 掃描,只會變為僅觀察 Sensor 曾通訊過的設備的被動模式)。
3. 安裝與啟動
從官方簽署的軟體包儲存庫安裝 roamswitch-sensor 軟體包。安裝後,roamswitch-sensor.service(systemd)會自動啟用並啟動。
3.1 APT(Ubuntu / Debian)
# 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 [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-sensor
3.2 DNF / RPM(Fedora / RHEL)
# 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-sensor
3.3 確認啟動
systemctl status roamswitch-sensor.service
sudo roamswitch-sensor status
3.4 執行 CLI / TUI
CLI(roamswitch-sensor)與互動式 TUI(roamswitch-sensor-tui)安裝後即可直接執行。
sudo roamswitch-sensor status
sudo roamswitch-sensor-tui
ROAMSWITCH_SENSOR_PASSIVE_CAPTURE_IFACE 環境變數(透過 systemctl edit roamswitch-sensor.service 設定)中指定目標介面名稱,即可觀測該介面上的 Ethernet/IPv4 標頭,偵測新裝置出現或與已知惡意 IP 的通訊(參見 §6.1)。預設關閉。4. 配對(配對碼方式)
Sensor 在初始狀態下不信任任何裝置。配對透過 Sensor 操作者發放的一次性配對碼進行。「Sensor 可對此端點執行主動弱點稽核」這項信任關係,會在一次配對操作中同時向雙向建立(不存在僅單向信任的狀態)。
前提條件:請以固定 IP 位址(靜態指派,或在 DHCP 伺服器端保留位址)執行 Sensor。配對完成後,端點此後一律直接連線至配對時確認的那個 Sensor IP 位址(不再透過 mDNS 等方式自動探索),因此若 Sensor 的 IP 之後變更,需要重新配對。端點端可以繼續使用動態 IP。
4.1 發放配對碼(Sensor 端)
# 在 Sensor 端執行(TUI 中為 c 鍵)
sudo roamswitch-sensor issue-code
系統會發放一個 8 碼(大寫英數字,已排除容易誤讀的 0/O/1/I/L)的一次性配對碼。該碼發放後 10 分鐘即失效且僅可使用一次,請透過口頭、聊天等任意頻外方式盡快告知端點端的操作者。同時還會顯示此 Sensor 的 TLS 憑證指紋(SHA-256)。這是需要在端點端固定的值,請與配對碼一併告知(也可隨時透過 roamswitch-sensor pairing show 或 TUI 的 T 畫面查看)。
4.2 使用配對碼完成配對(端點端)
# 端點端 (roamswitch-linux)
sudo roamswitch sensor pair --addr <SENSOR_IP> --code <CODE> --fingerprint <SHA256_FINGERPRINT>
在 Mac 版中,可透過選單列的「🔍 RoamSwitch Sensor 配對…」,輸入 Sensor 的 IP 位址、配對碼與憑證指紋,以圖形介面完成同樣的操作。
配對成立後,此後的主動弱點稽核與稽核結果取得都將透過 Ed25519 簽章進行驗證。Linux 版的端點僅與持有和所輸入指紋一致的憑證的 Sensor 透過 TLS 1.3 通訊,不會自動退回為明文(§4.4)。知道 Sensor 所發放配對碼的端點端,與收到該碼的 Sensor 端,此時都會將對方視為已受信任。
issue-code 重新發放一組新的配對碼。4.3 手動配對(已直接掌握公鑰的情況)
若 Sensor 操作者已透過頻外方式掌握端點的公鑰與位址,也可以不經配對碼交換,直接在 Sensor 端完成登記(通常建議使用 §4.2 的配對碼方式,讓端點自行完成配對)。可透過以下指令查詢自己的公鑰與位址。
# 在端點端查看自身的公鑰/位址
sudo roamswitch sensor key
# 在 Sensor 端查看自身的公鑰/位址/MAC 位址
sudo roamswitch-sensor status
# Sensor 端
sudo roamswitch-sensor pair <完整公開金鑰> --addr <IP 位址> --confirm
4.4 控制 API(TCP 50543)的安全性:TLS、指紋、鎖定
配對、稽核請求與結果取得都透過 Sensor 的控制 API(TCP 50543)進行。其內建了以下防護。
- TLS 1.3 與憑證固定:設定項
control.tls(重新啟動常駐程式後生效)可選off(僅明文)/optional(預設。在同一連接埠上同時接受 TLS 1.3 與舊的明文,每次接受明文都會發出警告)/required(僅 TLS 1.3)。憑證為自簽(ECDSA P-256),信任不取決於有效期限或名稱,而取決於 SHA-256 指紋的固定。固定值不會透過網路取得,而由維運人員把 Sensor 畫面上顯示的值輸入到端點端。 - 配對請求的指紋綁定:端點會用自己的私密金鑰對所固定憑證的指紋簽章,並包含在配對請求中。經由持有其他憑證的中間人轉送的請求會因
fingerprint_mismatch而失敗,且配對碼不會被消耗。 - 具備防重送能力的簽章(v2):稽核請求與結果取得的簽章採用包含時間(±300 秒)與 nonce 的 v2 格式,會拒絕重送。不含時間與 nonce 的舊 v1 簽章可被重送,因此可透過
control.allow_legacy_signatures(預設true=供遷移期使用。每次接受都會發出棄用警告)設定是否接受。當所有端點都升級到 v2 後,請將其設為false。 - 鎖定:對配對碼的暴力破解,同一來源 IP 在 10 分鐘內失敗 5 次將鎖定 60 秒(重複觸發時以指數方式延長,最長 1 小時),所有來源合計失敗 20 次將觸發全域鎖定。簽章失敗的處理略為寬鬆(每個來源 IP 10 次,全域 100 次)。鎖定時會透過通知
control_api_lockout告知。 - 監聽 IP:將
control.bind_addr(預設0.0.0.0,重新啟動後生效)限定為 Sensor 的區域網路端位址,可以減少暴露面。在使用萬用字元期間,常駐程式會發出警告。 - 憑證重新產生(輪替):
roamswitch-sensor tls rotate(TUI 中在T畫面按R)會重新產生憑證。舊指紋的所有固定都會失效,需要在端點端重新輸入新值(sudo roamswitch sensor repin <公開金鑰> --fingerprint <值>)。配對本身會保持。
sudo roamswitch-sensor pairing show # mode, fingerprint, warnings
sudo roamswitch-sensor tls rotate # regenerate the certificate
sudo roamswitch sensor repin <PUBLIC_KEY> --fingerprint <NEW_FINGERPRINT> # on each endpoint
control.tls 設為 required 的步驟roamswitch-sensor status 不再出現明文連線警告 → (3) sudo roamswitch-sensor config set control.tls required → 重新啟動常駐程式。off 會導致要求 TLS 的 Linux 版端點無法連線,因此通常不使用。5. 主動弱點稽核
Sensor 會對已配對的端點執行非破壞性的實證型弱點診斷,絕不執行任何破壞性操作(寫入/刪除資料、停止服務)。
sudo roamswitch-sensor scan <公開金鑰或其開頭部分>
稽核由四個階段構成。
- 全連接埠掃描:全面偵測目標主機上開放的所有 TCP 連接埠。
- 已知特徵診斷:針對已知弱點模式執行非破壞性的實證確認,例如 Redis / dockerd / Memcached / MongoDB / Elasticsearch / CouchDB / Jenkins / VNC 的無驗證暴露檢查、SMTP 開放轉發診斷(僅傳送
MAIL FROM/RCPT TO、不傳送DATA的安全方式),以及開發伺服器的 CORS 設定錯誤、路徑穿越、開放重新導向診斷等。 - 通用 Banner 擷取:對於未被上述特徵涵蓋的開放連接埠,僅透過連線取得 Banner 字串(不傳送任何資料)。
- nmap NSE 補充診斷:透過
nmap --script safe提供涵蓋廣泛通訊協定的補充診斷。只要主機上安裝了nmap就會自動執行(未安裝時不會執行任何動作)。
每次稽核結果都會記錄到 /var/lib/roamswitch-sensor/scan_history.json(無論是否偵測到問題,因為在該時間點結果乾淨同樣具有記錄價值),可透過 CLI 或 TUI 查看。
roamswitch-sensor history
sudo roamswitch-sensor report <公開金鑰或其開頭部分> --out /tmp/report.md
5.1 從用戶端發起稽核請求(拉取模式)
已配對的端點也可以主動向 Sensor 發起稽核請求。Mac 版可使用選單列中的「向 Sensor 請求稽核」,Linux 版則使用以下指令。
sudo roamswitch sensor request-audit
Sensor 執行稽核後,端點會從請求發出 5 分鐘後開始、每隔 5 分鐘去取得一次結果,最多嘗試 5 次(即最長 25 分鐘後)。取得的結果也會在端點本機儲存。
roamswitch sensor results
在 Mac 版中,結果也會出現在設定視窗的「稽核結果」清單中,或可透過 MCP 工具 get_sensor_audit_results 讀取,作為 AI 代理擬定因應計畫時的輸入。若 Sensor 端已解除該端點的配對,結果取得也可能被明確拒絕(參見 §10 Q6)。
6. 被動 ARP 監控與區域網路可視化
Sensor 透過兩種方式掌握區域網路中的設備。(1) ARP 表監控:約每 10 秒讀取一次 Sensor 自身的 ARP 表(/proc/net/arp),偵測「從未見過的新 IP/MAC 出現」與「已知 IP 的 MAC 位址變化(閘道偽冒等跡象)」。(2) 主動 ARP 掃描:透過 nmap -sn -PR 找出直連子網路(最大 /22),並將 IP、MAC、主機名稱、廠商、線上狀態、首次/最後發現時間、IP 歷程儲存到設備清冊。掃描會每小時執行一次,也會在手動觸發(refresh / TUI 的 r)與 TUI 啟動時執行;未安裝 nmap 時則退回為僅 (1) 的被動模式。還會根據 MAC 的 OUI 推測廠商與設備類別(是否為 IoT 設備等)。
roamswitch-sensor arp-events
偵測到的事件可透過 roamswitch-sensor arp-events 或 TUI 的「ARP 事件」分頁(按 Enter 檢視詳細資料)檢視。每個事件都附有發生時間、嚴重程度(嚴重~資訊;閘道 IP 的 MAC 變化為「嚴重」)、判斷依據、相關設備的來歷,以及具體的後續步驟。
6.1 被動區域網路可視化擴充(選擇性啟用)
上述 ARP 監控僅涵蓋「Sensor 自身曾通訊過的裝置」,但透過 ROAMSWITCH_SENSOR_PASSIVE_CAPTURE_IFACE 環境變數指定目標介面後,會觀測該介面上的 Ethernet/IPv4 標頭(不檢查負載),偵測以下內容。
- 被動觀測新裝置:ARP 監控無法涵蓋的、Sensor 自身未直接通訊過的裝置的出現。透過廣播/多播流量學習。
- 偵測與已知惡意 IP 的通訊:標記目標 IP 與本機威脅情報(與 RoamSwitch 本體的 Egress Guard 格式相同)相符的通訊(僅偵測,不進行封鎖)。
sudo systemctl edit roamswitch-sensor.service
# [Service]
# Environment=ROAMSWITCH_SENSOR_PASSIVE_CAPTURE_IFACE=eth0
sudo systemctl restart roamswitch-sensor.service
roamswitch-sensor passive-events
6.2 設備清冊與設備備註
清冊可透過 roamswitch-sensor device-inventory(TUI 的「網路架構」分頁)檢視。透過 device-note(TUI 中為 n)登錄名稱、用途、位置等備註後,該設備即為「已掌握」,未登錄備註的設備則顯示為「需確認」(用於與設備清冊對照)。
sudo roamswitch-sensor refresh
roamswitch-sensor device-inventory
sudo roamswitch-sensor device-note aa:bb:cc:dd:ee:ff "3F copier"
6.3 可疑行為參考資訊(全部僅為偵測)
啟用被動擷取(§6.1,需主動開啟)後,會提供以下參考資訊。全部僅做偵測與顯示,Sensor 不會阻斷通訊。
- IoT 設備行為(
iot-events):已分類設備對已知惡意 IP 或管理連接埠(SSH/RDP/SMB 等)的連線。同時結合 mDNS/SSDP/DHCP 的自我宣告來辨識機型。 - 可疑通訊(
network-threats):30 秒視窗內對大量目的地的連線(疑似掃描或跳板)、對同一目的地的大量連線(參與 DDoS 的跡象)、DNS 通道/C2 跡象(僅使用查詢名稱的結構特徵進行判斷,不儲存網域名稱)。 - 弱點資訊(
iot-advisories):與已知 IoT 廠商產品相關的公開 CVE 參考資訊(靜態內建,不會透過網路更新)。
7. CLI 指令速查表
| 指令 | 功能說明 |
|---|---|
roamswitch-sensor status |
顯示 Sensor 自身的公開金鑰、IP 位址、MAC 位址,配對數、ARP 事件數、待處理稽核請求數,以及控制 API 的 TLS 狀態 |
roamswitch-sensor issue-code |
發放一次性配對碼(10 分鐘內有效)。同時顯示 Sensor 的憑證指紋 |
roamswitch-sensor list |
顯示已配對端點的清單 |
roamswitch-sensor pair <public-key> [--addr <IP>] [--name <name>] --confirm |
直接指定公鑰與位址,手動配對某個端點(通常建議使用 issue-code,讓端點自行完成配對,較為簡便) |
roamswitch-sensor unpair <public-key> |
解除配對 |
roamswitch-sensor scan <public-key> |
對已配對端點執行主動弱點稽核 |
roamswitch-sensor history [public-key] |
顯示稽核歷史(省略公鑰則顯示所有端點) |
roamswitch-sensor report <public-key> [--out <file>] |
將最近一次稽核結果匯出為 Markdown 報告 |
roamswitch-sensor arp-events |
顯示偵測到的 ARP 事件(新裝置、疑似偽裝) |
roamswitch-sensor pairing show / tls show |
顯示控制 API 的 TLS 狀態(模式、指紋、明文連線警告、監聽 IP、是否接受舊 v1 簽章)(pairing show 與 tls show 內容相同) |
roamswitch-sensor tls rotate |
重新產生 TLS 憑證(舊指紋的所有固定都會失效,需要在端點端重新固定) |
roamswitch-sensor refresh |
立即重新掃描區域網路設備(ARP 掃描)並更新設備清冊 |
roamswitch-sensor device-inventory |
顯示設備清冊(在區域網路中觀測到的所有設備、線上狀態、備註) |
roamswitch-sensor device-note <MAC> [note] |
為設備登錄備註(省略備註則刪除) |
roamswitch-sensor passive-events / iot-events / network-threats / iot-advisories |
顯示來自被動擷取的各類事件(新設備、連線惡意 IP / IoT 設備行為 / 可疑通訊 / IoT 弱點資訊) |
roamswitch-sensor config [show | set <鍵> <值>] |
顯示與修改設定(定期稽核、通知、保留期限、收集器、控制 API、偵測資料取得、語言)。control.bind_addr 與 control.tls 需重新啟動常駐程式後生效,其餘無須重新啟動(§11.8) |
roamswitch-sensor diff [公開金鑰] |
顯示與上一次稽核相比的變化(新增發現、已解決項目、新開放連接埠、疑似無法連線) |
roamswitch-sensor export <scans|inventory|audit-log|unmanaged|all> … |
以 CSV / JSON / 可列印 HTML 匯出稽核證據 |
roamswitch-sensor audit-log [verify] |
顯示操作與核准紀錄;verify 可偵測雜湊鏈是否遭竄改 |
roamswitch-sensor notify-test |
對已設定的通知目的地(Webhook / syslog)傳送測試通知以確認連線 |
roamswitch-sensor audit-unmanaged <IP|MAC> --confirmroamswitch-sensor unmanaged-audits |
對未部署 RoamSwitch 的裝置做輕量稽核(僅連線檢查)。audit-unmanaged <IP 或 MAC> --confirm 手動執行,unmanaged-audits [--detail] 列出結果(§13) |
roamswitch-sensor lockdown [status | on | off] |
顯示是否處於鎖定狀態(status)、鎖定(on --reason 原因)、解除(off)。鎖定後會停止配對、稽核、上傳和通知(§14) |
roamswitch-sensor decommission --confirm |
清除此 Sensor 的金鑰和儲存資料並鎖定(無法復原)。僅保留稽核日誌,並顯示曾與其配對的裝置清單和解除配對的方法(§14) |
CLI 僅支援日語和英語(遵循 LANG 環境變數)。
8. TUI 操作指南
互動式 TUI(roamswitch-sensor-tui)支援 10 種語言,可操作 CLI 的所有子指令、常駐程式 IPC、所有設定鍵以及收集器維運(按 m 檢視功能清單)。使用 Tab 鍵(反向為 Shift+Tab)切換 6 個主要分頁:已配對(各端點最新的稽核狀態)/網路架構(區域網路內所有設備與備註登錄)/ARP 事件/稽核歷程/差異(與上次稽核相比的變化。新發現為紅色,已解決為綠色,疑似無法連線為黃色)/操作日誌(誰在何時核准、執行了什麼。頂部顯示雜湊鏈的驗證結果)。80 欄放不下的畫面(被動監控、IoT 行為、可疑通訊、IoT 弱點資訊)請從 m 選單開啟。
| 按鍵 | 操作 |
|---|---|
Tab | 切換分頁 |
↑↓ / j k | 選擇項目 |
c | 發放配對碼(10 分鐘內有效)。畫面會顯示需要在端點上執行的指令 sudo roamswitch sensor pair --addr <此 Sensor 的 IP> --code <配對碼> --fingerprint <指紋>,並已填入實際值 |
u | 解除配對 |
s | 對選取端點執行主動弱點稽核 |
a | (網路裝置分頁)對所選裝置做輕量稽核(有確認畫面,§13)。結果在選單的「未部署裝置稽核」分頁 |
K | 停用/解除此 Sensor(有確認畫面,鎖定期間畫面底部顯示紅色提示)。報廢請從選單進入(§14) |
n | (網路構成分頁)為所選裝置新增備註(名稱、用途、位置等);已有備註的裝置視為「已掌握」 |
r | 立即重新掃描區域網路裝置(ARP 掃描;預設每小時自動執行一次) |
e | 匯出稽核證據(稽核結果、設備清冊、操作日誌的 CSV,HTML 報告,JSON)。可在表單中指定內容、格式、端點、起始日期與儲存位置,並以顯示語言(10 種語言)產生。預設儲存位置為 ~/.local/state/roamswitch-sensor/,以僅擁有者可讀的新檔案方式建立(不會覆寫既有檔案),匯出這項行為本身也會記錄到操作日誌 |
p | 手動配對(輸入公開金鑰與位址 → 確認畫面 → 執行)。表單中會顯示需要在端點端固定的 Sensor TLS 指紋 |
T | TLS 與配對狀態(模式、指紋、明文連線警告、監聽 IP、是否接受舊 v1 簽章)。按 R 重新產生憑證(附有說明影響的確認畫面) |
C | 設定編輯器(顯示並修改所有設定鍵。Webhook URL 一律以遮罩顯示。需要重新啟動的鍵會明確標示) |
N | 通知測試(顯示各傳送目的地的成敗。URL 以遮罩顯示) |
m | 功能清單選單(被動監控、IoT 行為、可疑通訊、IoT 弱點資訊、狀態 i、收集器管理等) |
O | 收集器管理(僅限存在收集器資料目錄的主機)。Sensor 的登錄、撤銷、清單、讀取權杖、解除稽核日誌異常 |
f / l / v | (稽核歷程分頁)依端點篩選。(操作日誌分頁)按 l 變更顯示筆數,按 v 重新驗證雜湊鏈 |
Enter | 顯示所選列的詳情(稽核歷程、變化、ARP 事件、裝置、操作紀錄) |
w | (詳細資料顯示中)指定儲存位置,將報告匯出為檔案(以顯示語言產生) |
L | 選擇顯示語言(儲存到 language 設定,同時也會反映到常駐程式發出的通知與日誌的語言) |
q | 退出 |
9. 信任模型與安全設計
- 頻外確認(不是 TOFU):維運人員透過口頭、聊天等方式,把 Sensor 畫面上顯示的憑證指紋與配對碼告知端點端。端點不會透過網路取得固定值(不是無條件信任首次連線的 TOFU),只會與持有和所輸入值一致的憑證的 Sensor 通訊與配對。配對成立時交換的公開金鑰,會用於驗證此後探測與請求的合法性。
- 即便不執行任何破壞性操作,也能發現允許破壞性操作的漏洞:所有主動弱點稽核均為非破壞性(絕不寫入或刪除資料,也不會停止服務)。但會偵測出諸如「無需驗證即可寫入」「充當開放轉發」等一旦被利用便會導致破壞性操作的設定缺陷本身。
- 誤判對策(自我稽核排除):內建了基於來源 IP 比對的排除機制,以防止已配對 Sensor 自身執行的全連接埠稽核被入站連接埠掃描偵測防護(RoamSwitch 本體端功能)誤判為偵察行為(IP 僅用於此比對以避免自動封鎖,不用於信任判定本身)。此外,僅在本端點向 Sensor 要求稽核後、收到報告之前(若一直沒有報告,最長約 25 分鐘),Mac 版會把來自 Sensor 位址的偵測以及沒有來源位址的「SYN 大量接收」警告,Linux 版會把「SYN 大量接收」警告,改用「多半是稽核引起」的平和措辭通知。未要求稽核的時段仍維持原本的強警告,Sensor 自行發起的稽核不在此範圍內。
- 對外傳送有限,預設不傳送設備資訊:發現的設備資訊、稽核結果與 ARP 事件預設僅儲存在 Sensor 自身的本機儲存空間中,不會傳送到 Lafine 或第三方的伺服器。對外通訊只有取得偵測用資料(CVE 對照表與 nmap NSE 資料庫,可透過
updates.fetch_cve_map停止。不含設備與稽核資料),以及 §11 的通知(Webhook、syslog)和向中央收集器的傳送(僅在維運人員設定了傳送目的地時,才會傳送到自己組織的目的地)。
10. 疑難排解與常見問題
Q1. 輸入配對碼卻被拒絕。
可能的原因有以下 4 種:(1) 配對碼發放後已超過 10 分鐘而失效(請讓 Sensor 端操作員透過 issue-code 重新發放);(2) 配對碼輸入有誤(容易誤讀的 0/O/1/I/L 在發放時已被排除,因此配對碼中不會包含這些字元);(3) --addr 指定的 IP 位址與 Sensor 目前的固定 IP 位址不一致;(4) --fingerprint 與 Sensor 的憑證不一致(pin_mismatch / fingerprint_mismatch。請確認 roamswitch-sensor pairing show 的值。錯誤持續出現會被鎖定並回傳 rate_limited)。
Q2. NSE 補充診斷結果為空。
原因可能是以下兩者之一:(1) 容器中未安裝 nmap;(2) 已執行,但目標連接埠對應的安全指令碼確實沒有產生輸出。只要主機上安裝了 nmap,nmap NSE 補充診斷就會自動執行。
Q3. 稽核完成大約需要多長時間?
僅全連接埠掃描本身大約需要數十秒,但只要主機上安裝了 nmap,就會自動加入 NSE 補充診斷,根據目標開放連接埠的數量,最長可能需要約 2 分鐘。TUI 會持續顯示已耗用的秒數,您可以一邊查看進度一邊等待。
Q4. 明明已經配對了,卻無法執行稽核。
可能的原因如下:(1) 端點端未設定 sensor_pairing_enabled: true(預設關閉);(2) 配對後 Sensor 的固定 IP 位址發生了變化,端點無法再連線到其保存的舊位址(需要重新配對);(3) Sensor 端透過 unpair 解除了配對;(4) Sensor 重新產生了憑證(tls rotate),端點端的固定值已過期(透過 roamswitch sensor repin 輸入新的指紋)。請在 roamswitch sensor list(端點端)與 roamswitch-sensor list(Sensor 端)兩邊都確認對方已登錄。
Q5. Sensor 本身可以與 RoamSwitch 本體(Client/Server Edition)並用嗎?
可以。由於 Sensor 在設計上不具備自我防護功能,建議在同一台機器上同時部署 RoamSwitch for Linux Server Edition。兩者以完全獨立的行程和資料儲存運作,互不衝突。
Q6. roamswitch sensor results 顯示「配對已被解除」。
此端點的配對已在 Sensor 端透過 unpair 解除。請 Sensor 操作者重新發放一組配對碼,然後使用 roamswitch sensor pair --addr <IP> --code <配對碼> --fingerprint <SHA-256> 重新完成配對。
11. 面向組織的稽核營運功能(可選擇啟用)
供大型組織的資安人員留存稽核證據、掌握變化的功能集合。全部預設關閉,不會向 Lafine 或任何第三方傳送任何內容;通知與彙總的目的地均由維運人員設定,屬於貴組織自身。使用 sudo roamswitch-sensor config set <鍵> <值> 變更設定(無需重新啟動常駐程式,每次變更都會記錄到操作紀錄),config show 可檢視目前的值。
11.1 定期稽核與差異比對
將 schedule.enabled 設為 true,即可自動定期稽核所有已配對的端點(預設每 24 小時:schedule.interval_hours;允許開始的本地時間帶:schedule.window_start_hour / window_end_hour,可跨越午夜;並行數:schedule.max_parallel)。每次稽核都會與上一次比較,可用 roamswitch-sensor diff 檢視新增發現(迴歸)、已解決項目以及新開放的連接埠。若先前開放的連接埠全部看不到了,會視為疑似無法連線,而不是「已解決」(關機的裝置與關閉所有連接埠的裝置,從外部無法區分)。
無人值守的稽核同樣不會破壞「只稽核已同意的端點」這項保證。端點的 IP 可能被 DHCP 分配給其他裝置,因此系統會儲存端點最近一次完成認證(配對或帶簽章的稽核請求)時的 MAC 位址,並在每次定期稽核前後以 nmap 的即時 ARP 請求確認該 IP 上回應的仍是同一個 MAC。若不一致,則不進行稽核(或捨棄結果)並發出通知。當有證據顯示該位址已屬於其他裝置時,手動 scan 也會被拒絕。此檢查需要 nmap;在本功能導入之前完成配對的端點,須重新配對或傳送帶簽章的稽核請求後才會納入定期稽核;僅涵蓋同一第二層網段內的端點。
11.2 通知(Webhook 與 syslog)
迴歸、新裝置、ARP 欺騙、可疑通訊等會傳送到 notify.webhook_urls(Slack、Discord、Teams 等的 Incoming Webhook,或任何通用 JSON 接收端點)以及 notify.syslog.host / port / protocol(RFC 5424,UDP 或 TCP)。可透過 notify.min_severity(info / medium / high / critical)與 notify.cooldown_minutes(同一事件的最短重送間隔)進行篩選。roamswitch-sensor notify-test 可逐一檢查目的地的連線狀況。
11.3 匯出稽核證據
roamswitch-sensor export <scans|inventory|audit-log|all> --format csv|json|html [--out 檔案] [--endpoint 公開金鑰開頭部分] [--since 日期]。html 是單一檔案,在瀏覽器中開啟並「另存為 PDF」即可得到用於提交的 PDF。CSV 已針對試算表公式注入做了防護。設備清冊(inventory)帶有一欄,標明各設備是否處於 RoamSwitch 管理之下(已配對)。輸出檔案僅擁有者可讀(0600),匯出這項行為本身也會記錄到操作日誌。在 TUI 中按 e 鍵可透過表單進行同樣的指定,報告與匯出以顯示語言(10 種語言)產生(CLI 為日文與英文)。
11.4 操作與核准紀錄(防竄改)
配對、解除配對、稽核的開始與完成、設定變更以及被拒絕的存取,都會連同執行者(UID/端點公開金鑰/來源 IP)一併記錄。每一行都包含上一行的 SHA-256(雜湊鏈),因此任何編輯或刪除都能以 roamswitch-sensor audit-log verify 偵測(異常時結束碼為 2)。檢視清單使用 roamswitch-sensor audit-log [--limit N]。Webhook URL 往往帶有權杖,因此設定變更紀錄不會記錄其值。僅靠雜湊鏈無法發現尾端項目被截斷,所以鏈頭(序號與雜湊)也會傳送給收集器(§11.6)。
11.5 保留期限
為 retention.scan_history_days、retention.audit_log_days、retention.inventory_stale_days 設定天數後,將自動刪除過期的稽核歷程、操作紀錄以及長期未出現的裝置(0 = 不依期限刪除,預設值)。已填寫備註的裝置不會從清單中刪除。
11.6 彙總多個 Sensor(中央收集器,選用)
在多個據點執行多個 Sensor 時,可在另一台主機上執行 roamswitch-sensor-collector(隨套件提供,預設不啟用),收集各 Sensor 帶簽章的摘要。
# On the collector host (a separate host from the Sensor is recommended)
sudo systemctl enable --now roamswitch-sensor-collector # listens on 127.0.0.1:8443 by default
sudo roamswitch-sensor-collector token # read token for the dashboard
sudo roamswitch-sensor-collector enroll <Sensor public key> --name Tokyo --site Tokyo
# On each Sensor
sudo roamswitch-sensor config set collector.url https://collector.example.org:8443
sudo roamswitch-sensor config set collector.enabled true
- 僅接受已登錄(
enroll)的 Sensor 所傳送、帶 Ed25519 簽章的請求,並透過時間戳記拒絕重放。 - 凡可從 LAN 之外存取,都必須啟用 TLS。請在
/etc/default/roamswitch-sensor-collector的COLLECTOR_ARGS中指定--bind 0.0.0.0:8443 --tls-cert … --tls-key …,或在終結 TLS 的反向代理之後使用--allow-plain-http。若未啟用 TLS 卻要監聽 127.0.0.1 以外的位址,啟動將被拒絕。 - 儀表板受權杖保護,提供依據點篩選、依嚴重程度檢視事件以及 CSV 匯出。會醒目標示失去回應的 Sensor,以及稽核紀錄疑似被截斷、倒轉或分岔的 Sensor(調查後以
clear-anomaly <公開金鑰>解除)。 - 啟用
collector.send_unmanaged_devices(預設true)後,Sensor 會把未配對的設備(非受管設備)納入摘要。各設備會被分類為「未配對的 RoamSwitch 主機」(mDNS/SSDP 的自我宣告中出現 RoamSwitch 時。啟用collector.probe_control_port後,還會檢查到控制連接埠 50543 的 TCP 連線。預設停用)或「未知設備」,僅傳送 MAC、廠商、設備類別與首次發現時間(不含通訊內容)。在 TUI 中按O可開啟收集器管理畫面。
11.7 偵測資料的取得(updates.fetch_cve_map)
Sensor 每天從更新服務取得帶簽章的 CVE 對照表(主動診斷所使用的已知弱點資料)與 nmap NSE 資料庫。此通訊不包含設備與稽核資料。若要完全離線運作,請執行 sudo roamswitch-sensor config set updates.fetch_cve_map false(變更無須重新啟動,自下一個週期起生效,此後僅使用內建資料)。
11.8 設定鍵一覽
使用 roamswitch-sensor config show 檢視目前值,使用 config set <鍵> <值> [<鍵> <值> …] 修改(多個鍵會以原子方式儲存,在 TUI 中也可透過 C 的設定編輯器修改)。只有「重新啟動」欄為「需要」的鍵,才需要重新啟動常駐程式(sudo systemctl restart roamswitch-sensor)後生效。
| 鍵 | 型別 / 可用值 | 預設 | 重新啟動 |
|---|---|---|---|
site | string | (empty) | 不需要 |
language | ja | en | ko | zh-Hans | zh-Hant | de | fr | es | it | pt-PT | (empty = system locale) | 不需要 |
schedule.enabled | bool | false | 不需要 |
schedule.interval_hours | int | 24 | 不需要 |
schedule.window_start_hour | int 0–23 | (unset = always) | 不需要 |
schedule.window_end_hour | int 0–23 | (unset = always) | 不需要 |
schedule.max_parallel | int 1–8 | 1 | 不需要 |
notify.webhook_urls | URL list | (empty) | 不需要 |
notify.min_severity | info | medium | high | critical | medium | 不需要 |
notify.cooldown_minutes | int | 30 | 不需要 |
notify.syslog.host | string | (empty = off) | 不需要 |
notify.syslog.port | int | 514 | 不需要 |
notify.syslog.protocol | udp | tcp | udp | 不需要 |
retention.scan_history_days | int (0 = never prune) | 0 | 不需要 |
retention.audit_log_days | int (0 = never prune) | 0 | 不需要 |
retention.inventory_stale_days | int (0 = never prune) | 0 | 不需要 |
collector.enabled | bool | false | 不需要 |
collector.url | URL | (empty) | 不需要 |
collector.push_interval_minutes | int | 15 | 不需要 |
collector.send_unmanaged_devices | bool | true | 不需要 |
collector.probe_control_port | bool | false | 不需要 |
control.bind_addr | IP address | 0.0.0.0 | 需要 |
control.tls | off | optional | required | optional | 需要 |
control.allow_legacy_signatures | bool | true | 不需要 |
updates.fetch_cve_map | bool | true | 不需要 |
control.listen_ipv6 | bool | false | 需要 |
dhcp.active_probe | bool | true | 不需要 |
dhcp.allowed_servers | MAC / IP list | (empty = learn the first) | 不需要 |
ipv6.enabled | bool | true | 不需要 |
ipv6.active_probe | bool | true | 不需要 |
ipv6.allowed_routers | MAC / IP list | (empty = trust the IPv4 gateway) | 不需要 |
unmanaged_audit.enabled | bool (needs authorization + allowed_cidrs first) | false | 不需要 |
unmanaged_audit.authorization | string | (empty) | 不需要 |
unmanaged_audit.allowed_cidrs | CIDR list (IPv4 ≤ /16 and IPv6 ≤ /48 refused) | (empty) | 不需要 |
unmanaged_audit.exclude | IP / CIDR / MAC list | (empty) | 不需要 |
unmanaged_audit.interval_hours | int | 168 | 不需要 |
unmanaged_audit.max_parallel | int 1–4 | 2 | 不需要 |
unmanaged_audit.product_check | bool (needs unmanaged_audit.enabled) | false | 不需要 |
security.on_revoked | lockdown | wipe | none | lockdown | 不需要 |
security.lockdown_after_offline_days | int (0 = off) | 0 | 不需要 |
12. 非法 DHCP 與 IPv6 偵測
發現被帶入網路的其他路由器或攻擊者的裝置假冒合法裝置、劫持裝置通訊去向的攻擊。僅做偵測和通知,Sensor 不會封鎖流量。預設啟用,無需設定被動擷取。結果會出現在 roamswitch-sensor network-threats、TUI 的「可疑通訊」分頁(從 m 進入)、通知(dhcp_rogue_server ipv6_rogue_router ndp_spoof ipv6_unknown_device)、操作與核准日誌以及匯出中。
12.1 非法 DHCP 伺服器(IPv4 與 DHCPv6)
每小時(以及每次執行 roamswitch-sensor refresh 時),Sensor 會用隨機 MAC 位址傳送一個 DHCP 探測封包(DHCPv6 為 SOLICIT),並統計所有回應的伺服器。它不傳送請求(REQUEST),因此不會租用 IP 位址。被動擷取看到的 DHCP 回應也會走同樣的判定。最先發現的伺服器被學習為合法伺服器,之後出現的其他伺服器會被通知。發放與合法伺服器不同的閘道或 DNS 的伺服器,會劫持接受其租約的裝置的通訊去向,因此屬於最嚴重的 critical。若第一次探測時有多台伺服器同時回應,Sensor 無法判斷哪台合法,因此一台也不學習,而是全部回報。
12.2 IPv6(非法路由器通告、NDP 欺騙、僅 IPv6 可見的裝置)
非法路由器通告:區域網路內任何裝置都能自稱 IPv6 路由器。Sensor 會綜合核心的鄰居表和預設路由、被動擷取看到的路由器通告以及對路由器請求的回應,當 IPv4 預設閘道以外的裝置表現為路由器時發出通知(登錄到 ipv6.allowed_routers 即視為合法;IPv6 路由器與 IPv4 閘道是不同裝置的網路屬於正常情況,此時請登錄)。跳數限制不是 255 的通告是偽造或經路由轉入的,會被忽略。NDP 欺騙:某個 IPv6 位址的持有者 MAC 變成另一個 MAC 時發出通知(若是路由器位址則為 high)。僅 IPv6 可見的裝置:在 ARP 中看不到、只出現在鄰居表中的裝置,會在經過一次 ARP 掃描後才回報。裝置清冊(CSV 的 ipv6 欄、JSON 的 ipv6_addrs)也會記錄 IPv6 位址。
12.3 誰算合法,以及相關設定
設定 dhcp.allowed_servers 和 ipv6.allowed_routers(MAC 或 IP)後,其餘所有回應者都會被回報;留空則學習第一個發現的。可用 dhcp.active_probe 和 ipv6.active_probe(預設 true)關閉主動檢測,用 ipv6.enabled 關閉全部 IPv6 監控。控制 API(50543)的 IPv6 監聽透過 control.listen_ipv6 新增(預設 false,重新啟動後生效);路由器沒有 IPv6 防火牆時,全域 IPv6 位址可能從網際網路直達,所以預設不啟用。連線數與鎖定依 /64 統計 IPv6。從連結本地位址連線的裝置因無法在沒有範圍 ID 的情況下回連,不會被記為稽核目標。
13. 未部署 RoamSwitch 裝置的輕量稽核(可選擇啟用)
§5 的主動弱點稽核只針對已配對並同意的裝置。對於未配對的印表機、攝影機、NAS 等裝置,若仍想知道「有哪些服務對外開放」,還有一種範圍小得多的獨立檢查。OpenVAS 之類的深度診斷、登入嘗試、弱點利用、nmap NSE 和全連接埠掃描,只對已同意的裝置進行。
13.1 檢查內容
僅對固定的 54 個連接埠(Telnet、FTP、RDP、VNC、SMB、Redis、MongoDB、Docker API、MQTT、RTSP 等)做 TCP 連線檢查,讀取開放連接埠上服務主動發出的資訊(banner)(對 Web 連接埠傳送一次 HEAD /),並在廠商已公開弱點時(IoT 弱點通告表)加註。結果表述為「區域網路可存取該服務」,而不是「存在弱點」(每條檢出都會註明未檢查驗證是否啟用)。
13.2 啟用方法
要啟用 unmanaged_audit.enabled,需先設定 unmanaged_audit.authorization(誰核准的:姓名、工單號或制度名稱等)和 unmanaged_audit.allowed_cidrs(允許稽核的範圍;比 IPv4 的 /16、IPv6 的 /48 更寬的範圍會被拒絕)。定期執行每隔 interval_hours(預設 168 小時)一次,並遵循 schedule 的時段。手動執行需要 --confirm 作為第二次確認。
sudo roamswitch-sensor config set unmanaged_audit.authorization "IT policy 2026-07, approved by A. Suzuki"
sudo roamswitch-sensor config set unmanaged_audit.allowed_cidrs 192.168.10.0/24
sudo roamswitch-sensor config set unmanaged_audit.exclude 192.168.10.1
sudo roamswitch-sensor config set unmanaged_audit.enabled true
sudo roamswitch-sensor audit-unmanaged 192.168.10.40 --confirm
roamswitch-sensor unmanaged-audits --detail
13.3 保障措施
allowed_cidrs 之外、unmanaged_audit.exclude(IP、範圍、MAC)中的裝置、已配對的裝置以及 Sensor 自身,無論如何都不會被檢查。執行前後,會透過即時查詢(IPv4 用 ARP,需要 nmap;IPv6 用鄰居請求)確認該位址上裝置的 MAC,若已變為其他裝置,則中止或捨棄結果並發出通知。authorization 的文字每次執行都會寫入操作與核准日誌,也會出現在匯出(export unmanaged、JSON、HTML 報告)中,因此可以證明「是誰核准並進行的稽核」。
13.4 產品確認(是否為 CISA KEV 收錄漏洞的產品。需主動開啟)
開啟 unmanaged_audit.product_check(預設關閉)後,輕量稽核會從裝置正常回傳的網頁中讀取產品名稱,並告知該產品是否有 CISA KEV 收錄的漏洞。傳送的內容僅限:對可連線的 Web 連接埠(80、8080、8181、443、8443、10443)發出的 GET /、裝置自己指向同一位址的重新導向(最多兩次),以及讀取 HTTPS 憑證的簽發者與主體名稱。不會傳送登入、密碼嘗試、猜測的路徑,或任何利用漏洞的輸入。每台裝置最多 12 個請求,間隔 150 毫秒。同意條件(enabled、authorization、allowed_cidrs、exclude、排除已配對裝置、MAC 複核)與 §13.2~13.3 完全相同;輕量稽核關閉時,即使 product_check 為開啟也不會傳送任何內容。
只有當某產品畫面上的標誌在同一個回應中全部出現時,才會指名該產品。只有讀到裝置自己顯示的版本、且有 CVE 的 NVD 影響範圍包含該版本時,才判為「受影響」(high)。讀不到版本時,僅給出提示(medium):該產品有 KEV 收錄的漏洞,但沒讀到版本,是否受影響未確認;絕不斷言裝置存在漏洞。目前只有 MikroTik RouterOS 會在畫面上顯示版本,其他產品通常只會得到「未確認」提示。支援 Fortinet FortiGate、Ivanti Connect Secure、Citrix NetScaler、Cisco(ASA 的 SSL VPN 和 IOS XE 的 Web UI)、UniFi OS、GeoVision、TerraMaster、Check Point 的 Security Gateway、MikroTik RouterOS(Aruba 裝置在 KEV 中沒有項目,不在範圍內)。產品標誌基於公開的偵測特徵,尚未在實機上驗證;不相符的標誌會傾向於不偵測。KEV 副本隨產品附帶,僅當 product_check 與 updates.fetch_cve_map 都開啟時,才每 24 小時取得一個 CISA 公開訂閱檔案來更新(不會傳送任何區域網路資訊)。
14. 遺失、被竊或報廢時
Sensor 中保存著各裝置的弱點清單、已配對裝置的位址和簽章金鑰。此外,已配對的裝置會把這台 Sensor 視為「獲准掃描連接埠的對象」,因此被竊的 Sensor 接入同一區域網路後就能冒充該對象。可透過以下機制阻止。
14.1 在收集器中撤銷與鎖定
執行 roamswitch-sensor-collector revoke <公鑰> --reason 原因 後,該 Sensor 之後的上傳會被以 403 sensor_revoked 拒絕(只對簽章正確的請求回傳,因此只有持有金鑰的一方才會知道)。被撤銷的 Sensor 會在下次上傳時得知此事,並自行停止(鎖定)。鎖定期間,控制 API 只回答 sensor_locked_down,並停止配對、稽核(定期與手動)、向收集器上傳、通知以及對網路的探測。停止狀態儲存在檔案中,重新啟動後依然有效,狀態檔案無法讀取時也會保持鎖定。資料會保留,因此只有在確認裝置已回到可信人員手中時,才用 roamswitch-sensor lockdown off(TUI 中為 K)解除;若在收集器中仍處於撤銷狀態,下次上傳時會再次鎖定。revoke 還會顯示曾與該 Sensor 配對的裝置清單以及各裝置上的解除方法。
14.2 清除、報廢與離線偵測
將 security.on_revoked 設為 wipe 後,被撤銷時會用 0 覆寫並刪除金鑰、TLS 金鑰、設定(包括 Webhook URL)、已配對裝置清單、稽核結果和裝置清冊。只保留操作與核准日誌作為證據。lockdown(預設)停止並保留資料,none 僅發出通知。要手動報廢手邊的 Sensor,請使用 roamswitch-sensor decommission --confirm(鎖定並清除,無法復原)。把 security.lockdown_after_offline_days 設為天數,則長期無法向收集器上傳的 Sensor 會自行停止(用於防範被竊後在其他網路中使用;僅在啟用了收集器上傳且曾成功過一次時生效,預設 0=不啟用)。
14.3 此機制做不到的事
已與其配對的裝置在各自解除配對之前,會一直信任這台 Sensor。由於 Sensor 無法通知裝置,請在 revoke 和 decommission 顯示的清單中的每台裝置上操作:Linux 執行 roamswitch sensor unpair <該 Sensor 的公開金鑰>,Mac 進入 設定 > Sensor > 解除配對。在關機狀態下或未接入網路時被帶走的 Sensor,收不到停止指令,磁碟加密(LUKS 等)才是真正的防護。覆寫式清除在快閃儲存或寫入時複製的檔案系統上不能保證完全清除。