RoamSwitch Sensor 운영 매뉴얼
LAN에 설치하는 것만으로 동일 세그먼트의 신규 기기 출현·스푸핑을 탐지하고, RoamSwitch가 설치된 단말(Mac / Linux Client / Server Edition)에 대해서는 능동적인 취약점 감사를 수행하는 네트워크 센서의 도입·운영 가이드입니다. apt / dnf 패키지로 배포 중입니다.
1. 개요 & 포지셔닝
RoamSwitch(Mac / Linux Client / Server Edition)는 모두 호스트에 상주하는 에이전트 형태입니다. 여기에는 구조적인 사각지대가 두 가지 있습니다.
- 단일 호스트의 자가 진단에는 원리적인 사각지대가 있습니다: "외부에서는 닫혀 있지만 같은 LAN 상의 다른 단말에서는 훤히 보이는" 횡적 이동(lateral movement) 위험은, 호스트 스스로가 자신만을 보고 있어서는 탐지할 수 없습니다.
- RoamSwitch를 설치할 수 없는 기기가 있습니다: IoT 기기(네트워크 카메라, 스마트 플러그, 복합기), 방문자·BYOD 단말, 네트워크 장비 자체, 임베디드 기기 등.
RoamSwitch Sensor는 LAN에 설치하는 전용 노드로서 이 두 가지 사각지대를 메우는 것을 목표로 하는 제품입니다. 구현·동작 확인이 끝난 것은 동일 LAN 상의 RoamSwitch 설치 단말에 대한 능동적인 취약점 감사, ARP 스윕과 ARP 테이블 모니터링을 통한 LAN 상 기기의 대장화 및 신규 기기 출현·스푸핑 탐지, 그리고 옵트인 수동 캡처를 통한 의심스러운 동작(악성 IP 연결·봇넷화·DNS 터널링의 징후 등)의 참고 정보 제시입니다(§6 참조). Sensor는 탐지와 보고만 수행하며 통신을 차단하지 않습니다. EDR이 아니라 경량 NDR(Network Detection & Response)과 자체 개발한 실증형 취약점 스캐너를 결합한 제품으로 설계하고 있습니다.
updates.fetch_cve_map, 기본값 true. false로 하면 완전 오프라인 운용이 되며 기본 제공 데이터만 사용합니다). 이 통신에는 기기·감사 데이터가 포함되지 않습니다. (2) 운영자가 설정한 대상으로의 알림·집계: 웹훅·syslog·중앙 컬렉터에는 운영자가 설정한 경우에만 자사 조직의 대상으로 전송합니다(기본값에서는 아무것도 전송하지 않습니다). 페어링은 로컬에서 완결되며 클라우드 등록이나 계정 생성이 필요하지 않습니다.자기 방어 기능은 구현하지 않습니다(의도적인 설계 결정). Sensor 자체에 대한 공격 대책이 필요한 경우, 동일 머신에 RoamSwitch for Linux의 Server Edition을 별도로 설치할 것을 권장합니다. 두 프로세스는 완전히 독립적으로 공존할 수 있습니다.
2. 현재 동작 확인 환경
- 지원 OS: Debian 12 (bookworm) 이상 / Ubuntu 22.04 이상(apt), Fedora / RHEL 계열(dnf).
x86_64(amd64)만 지원하며,arm64는 아직 지원하지 않습니다. - 예상 하드웨어(향후 계획): 실제 운용 시에는 팬리스 N100/N150 계열 미니PC 등, 상시 가동에 적합한 저전력 기기를 상정하고 있지만, 현시점에서는 이를 전제로 한 전용 빌드·제공은 하지 않습니다.
- 네트워크 배치: 감시 대상 LAN 세그먼트에 물리적 또는 논리적으로 연결되어 있어야 합니다(
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 운영자가 발급하는 1회용 페어링 코드를 사용해 이루어집니다. 「Sensor가 이 단말에 대해 능동적인 취약점 감사를 실행해도 된다」는 신뢰 관계는, 단 한 번의 페어링 조작으로 양방향에 동시에 성립합니다(한쪽 방향만의 신뢰라는 상태는 존재하지 않습니다).
전제 조건: Sensor는 고정 IP 주소(정적 할당 또는 DHCP 서버 측 주소 예약)로 운용해 주십시오. 단말은 페어링 시점에 확인한 Sensor의 IP 주소로 이후에도 직접 접속하므로(mDNS 등을 통한 자동 탐색은 수행하지 않습니다), Sensor 측 IP가 바뀌면 재페어링이 필요합니다. 엔드포인트 측은 동적 IP를 유지해도 무방합니다.
4.1 페어링 코드 발급(Sensor 측)
# Sensor 측에서 실행(TUI에서는 c 키)
sudo roamswitch-sensor issue-code
8자리(대문자 영숫자. 오독하기 쉬운 0/O/1/I/L은 제외)의 1회용 코드가 발급됩니다. 발급 후 10분이 지나면 만료되는 1회 한정 코드이므로, 구두나 채팅 등 임의의 아웃오브밴드 수단으로 단말 측 운영자에게 신속히 전달해 주십시오. 함께 이 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 주소·페어링 코드·인증서 핑거프린트를 입력해 GUI로 동일한 작업을 수행할 수 있습니다.
페어링이 성립하면 이후의 능동적 취약점 감사와 감사 결과 취득은 모두 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의 LAN 측 주소로 좁히면 노출을 줄일 수 있습니다. 와일드카드인 동안에는 데몬이 경고를 출력합니다. - 인증서 재생성(로테이션):
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 <공개 키 또는 그 앞부분>
감사는 4단계로 구성되어 있습니다.
- 전체 포트 스캔: 대상 호스트에서 열려 있는 TCP 포트를 남김없이 탐지합니다.
- 기존 시그니처 진단: Redis / dockerd / Memcached / MongoDB / Elasticsearch / CouchDB / Jenkins / VNC의 인증 없는 노출 확인, SMTP 오픈 릴레이 진단(
MAIL FROM/RCPT TO만 전송하고DATA는 전송하지 않는 안전한 방식), 개발 서버의 CORS 설정 오류·경로 순회·오픈 리다이렉트 진단 등, 알려진 취약점 패턴에 대한 비파괴적인 실증 확인을 수행합니다. - 범용 배너 취득: 위 시그니처로 커버되지 않는 열린 포트에 대해, 연결만으로 배너 문자열을 취득합니다(데이터 전송은 하지 않습니다).
- 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 클라이언트 측에서의 감사 요청(pull 방식)
페어링된 단말 측에서 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 모니터링 & LAN 가시화
Sensor는 두 가지 방법으로 LAN 상의 기기를 파악합니다. (1) ARP 테이블 모니터링: Sensor 자신의 ARP 테이블(/proc/net/arp)을 약 10초마다 읽고, 「지금까지 본 적 없는 신규 IP/MAC의 출현」과 「기존 IP에 대한 MAC 주소 변경(게이트웨이 스푸핑 등의 징후)」을 탐지합니다. (2) 능동 ARP 스윕: nmap -sn -PR로 직접 연결된 서브넷(최대 /22)을 조사하여 IP·MAC·호스트 이름·벤더·온라인 상태·최초/최종 검출·IP 이력을 기기 대장에 저장합니다. 스윕은 1시간마다·수동(refresh / TUI의 r)·TUI 시작 시에 실행되며, nmap이 설치되어 있지 않으면 (1)만의 수동 동작으로 돌아갑니다. MAC의 OUI로 벤더와 기기 분류(IoT 기기 여부 등)도 추정합니다.
roamswitch-sensor arp-events
탐지한 이벤트는 roamswitch-sensor arp-events나 TUI의 「ARP 이벤트」 탭(Enter로 상세)에서 확인할 수 있습니다. 각 이벤트에는 발생 시각·심각도(치명적~정보. 게이트웨이 IP의 MAC 변경은 「치명적」)·판단 근거·관련 기기의 정체·구체적인 다음 절차가 함께 표시됩니다.
6.1 수동적 LAN 가시화 확장(옵트인)
위의 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 |
1회용 페어링 코드를 발급(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 |
LAN 상의 기기를 지금 즉시 재스캔(ARP 스윕)하여 기기 대장을 갱신 |
roamswitch-sensor device-inventory |
기기 대장(LAN 상에서 관측한 모든 기기·온라인 상태·메모)을 표시 |
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으로 기능 목록). 주요 6개 탭을 Tab 키(역순은 Shift+Tab)로 전환합니다: 페어링됨(각 단말의 최신 감사 상태) / 네트워크 구성(LAN 상의 모든 기기와 메모 등록) / 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 | 지금 LAN 기기를 다시 스캔(ARP 스윕, 기본적으로 1시간마다 자동 실행) |
e | 감사 증적을 내보내기(감사 결과·기기 대장·작업 로그의 CSV, HTML 보고서, JSON). 양식에서 내용·형식·단말·시작일·저장 위치를 지정할 수 있으며 표시 언어(10개 언어)로 생성됩니다. 기본 저장 위치는 ~/.local/state/roamswitch-sensor/이고, 소유자만 읽을 수 있는 새 파일(기존 파일은 덮어쓰지 않습니다)로 생성되며, 내보냈다는 사실 자체도 작업 로그에 기록됩니다 |
p | 수동 페어링(공개 키와 주소를 입력 → 확인 화면 → 실행). 양식에 단말 측에서 핀 고정할 Sensor의 TLS 핑거프린트가 표시됩니다 |
T | TLS·페어링 상태(모드·핑거프린트·평문 연결 경고·수신 대기 IP·구 v1 서명 허용 여부). R로 인증서를 재생성(영향을 설명하는 확인 화면 포함) |
C | 설정 편집기(모든 설정 키를 표시·변경. 웹훅 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와만 통신·페어링합니다. 페어링 성립 시에 교환된 공개 키로 이후의 프로브·요청의 정당성을 검증합니다.
- 파괴적인 조작 없이도, 파괴적인 조작을 허용하는 구멍은 발견할 수 있는 설계: 능동적 취약점 감사는 모두 비파괴적입니다(데이터 쓰기·삭제, 서비스 중지를 일절 수행하지 않습니다). 다만 「인증 없이 쓰기 가능」「오픈 릴레이로 동작」과 같이, 악용될 경우 파괴적인 조작을 허용해 버리는 설정 결함 자체는 탐지합니다.
- 오탐 대책(자체 감사 제외): 페어링된 Sensor 자신에 의한 전체 포트 감사를, 착신 포트 스캔 탐지 가드(RoamSwitch 본체 측 기능)가 정찰 행위로 오인하지 않도록, 송신 IP 대조에 의한 제외 처리가 내장되어 있습니다(IP는 어디까지나 자동 차단을 회피하기 위한 대조에만 사용하며, 신뢰 판정 자체에는 사용하지 않습니다). 또한 이 단말이 Sensor에 감사를 요청한 뒤 보고서를 받을 때까지(보고서가 오지 않으면 최대 약 25분) 동안에 한해, Mac 판은 Sensor 주소로부터의 탐지와 발신지가 없는 'SYN 대량 수신' 경고를, Linux 판은 'SYN 대량 수신' 경고를, 감사로 인한 것으로 보인다는 차분한 문구로 알립니다. 요청하지 않은 시간대는 기존처럼 강한 경고 그대로이며, Sensor가 자발적으로 시작한 감사는 대상이 아닙니다.
- 외부 전송은 한정적이며 기기 정보는 기본값에서 전송하지 않음: 발견한 기기 정보, 감사 결과, ARP 이벤트는 기본값에서는 Sensor 자신의 로컬 스토리지에만 저장되며 Lafine이나 제3자의 서버로는 전송되지 않습니다. 외부와의 통신은 탐지용 데이터(CVE 맵·nmap NSE 데이터베이스)의 취득(
updates.fetch_cve_map으로 중지 가능. 기기·감사 데이터는 포함되지 않음)과, §11의 알림(웹훅·syslog) 및 중앙 컬렉터로의 전송(운영자가 전송 대상을 설정한 경우에만 자사 조직의 대상으로)뿐입니다.
10. 문제 해결 & FAQ
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 NSE 보완 진단은 호스트에 nmap이 설치되어 있으면 자동으로 실행됩니다.
Q3. 감사가 완료될 때까지 얼마나 걸립니까?
전체 포트 스캔만이라면 수십 초 정도지만, 호스트에 nmap이 설치되어 있으면 NSE 보완 진단이 자동으로 더해지므로 대상의 열린 포트 수에 따라 최대 2분 정도 걸릴 수 있습니다. TUI에서는 실행 중인 경과 초가 계속 표시되므로 진행 상황을 확인하며 기다리실 수 있습니다.
Q4. 페어링했는데도 감사를 실행할 수 없습니다.
생각할 수 있는 원인은 다음과 같습니다: (1) 엔드포인트 측에서 sensor_pairing_enabled: true가 설정되어 있지 않다(기본값 OFF), (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이나 제3자에게는 아무것도 전송되지 않습니다. 알림·집계 대상은 모두 운영자가 설정한 자사 조직의 것입니다. 설정은 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 주소를 저장하고, 정기 감사 전후에 같은 MAC이 그 IP에서 응답하는지 nmap의 실제 ARP 요청으로 확인합니다. 일치하지 않으면 감사하지 않고(또는 결과를 폐기하고) 알립니다. 수동 scan도 다른 기기로 넘어갔다는 증거가 있으면 거부합니다. 이 확인에는 nmap이 필요하며, 이 기능이 도입되기 전에 페어링한 단말은 다시 페어링하거나 서명된 감사 요청을 보낼 때까지 정기 감사 대상이 되지 않습니다. 같은 L2 세그먼트의 단말만 대상입니다.
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)
1시간마다(그리고 roamswitch-sensor refresh를 실행할 때마다) 임의의 MAC 주소로 DHCP 탐색 패킷(DHCPv6는 SOLICIT)을 하나만 보내 응답한 모든 서버를 셉니다. 요청(REQUEST)은 보내지 않으므로 IP 주소 임대는 받지 않습니다. 수동 캡처가 본 DHCP 응답도 같은 판정에 걸립니다. 처음 발견한 서버를 정상으로 학습하고, 나중에 나타난 다른 서버를 알려 줍니다. 정상 서버와 다른 게이트웨이나 DNS를 배포하는 서버는 그 임대를 받은 단말의 통신 경로를 가로채므로 가장 높은 critical입니다. 첫 탐색에서 여러 서버가 동시에 응답하면 어느 쪽이 정상인지 판단할 수 없으므로 아무것도 학습하지 않고 전부 보고합니다.
12.2 IPv6(불법 라우터 광고·NDP 스푸핑·IPv6에서만 보이는 기기)
불법 라우터 광고: IPv6 라우터는 LAN의 누구나 자칭할 수 있습니다. 커널의 이웃 테이블·기본 경로, 수동 캡처가 본 라우터 광고, 라우터 요청에 대한 응답을 맞춰 보고, 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 방화벽이 없으면 인터넷에서 닿을 수 있으므로 기본으로는 켜지 않습니다. 연결 수와 잠금은 IPv6를 /64 단위로 셉니다. 링크 로컬 주소로 접속한 단말은 스코프 ID 없이는 다시 접속할 수 없으므로 감사 대상으로 기억하지 않습니다.
13. RoamSwitch 미도입 기기의 경량 감사(옵트인)
§5의 능동적 취약점 점검은 페어링하여 동의한 단말만 대상입니다. 페어링하지 않은 프린터·카메라·NAS 등에 대해서도 '무엇이 밖으로 열려 있는지'를 확인하고 싶을 때를 위해, 훨씬 더 제한된 별도의 검사가 있습니다. OpenVAS 같은 깊은 진단, 로그인 시도, 취약점 악용, nmap NSE, 전체 포트 스캔은 동의한 단말에만 합니다.
13.1 하는 일
정해진 54개 포트(Telnet·FTP·RDP·VNC·SMB·Redis·MongoDB·Docker API·MQTT·RTSP 등)로의 TCP 연결 확인, 열려 있던 포트에서 서비스가 스스로 보내는 표시(배너) 읽기(웹용 포트에는 HEAD / 한 번), 벤더가 공개한 취약점(IoT 취약점 정보 표)의 주석만 합니다. 결과는 'LAN에서 이 서비스에 닿는다'이지 '취약하다'가 아닙니다(인증이 켜져 있는지는 확인하지 않았다고 각 검출에 명시됩니다).
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 자신은 어떤 경우에도 점검하지 않습니다. 실행 전후에 그 주소에 있는 기기의 MAC을 직접 질의(IPv4는 ARP=nmap 필요, IPv6는 이웃 요청)로 확인하고, 다른 기기로 바뀌었으면 중단하거나 결과를 폐기하고 알립니다. authorization 문구는 실행할 때마다 작업·승인 로그에 기록되고 내보내기(export unmanaged, JSON, HTML 보고서)에도 실리므로 '누가 허가하여 점검했는지'를 보여 줄 수 있습니다.
13.4 제품 확인(CISA KEV에 오른 취약점이 있는 제품인가. 옵트인)
unmanaged_audit.product_check(기본값 꺼짐)을 켜면, 가벼운 점검 안에서 기기가 평소 돌려주는 웹 화면에서 제품명을 읽고, 그 제품에 CISA KEV에 오른 취약점이 있는지 알려 줍니다. 보내는 것은 연결된 웹 포트(80·8080·8181·443·8443·10443)로의 GET /, 기기가 스스로 가리키는 같은 주소로의 리다이렉트(최대 2회), HTTPS 인증서의 발급자·주체 이름 읽기뿐입니다. 로그인, 비밀번호 시도, 추측한 경로, 취약점을 노리는 입력은 보내지 않습니다. 기기 1대당 최대 12건, 150밀리초 간격입니다. 동의 조건(enabled·authorization·allowed_cidrs·exclude·페어링된 기기 제외·MAC 재확인)은 §13.2~13.3 그대로이며, 가벼운 점검이 꺼져 있으면 product_check가 켜져 있어도 아무것도 보내지 않습니다.
제품을 지목하는 것은 그 제품 화면의 표지가 같은 응답에서 모두 갖춰졌을 때뿐입니다. 기기가 스스로 표시한 버전을 읽을 수 있고 NVD 영향 범위에 들어가는 CVE가 있을 때만 '해당'(high)으로 봅니다. 버전을 읽을 수 없으면 '이 제품에는 KEV에 오른 취약점이 있다. 버전을 읽지 못해 해당 여부는 미확인'이라는 알림(medium)에 그치며, 취약하다고 단정하지 않습니다. 화면에 버전을 표시하는 제품은 현재 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의 공개 피드 파일 1개를 받아 갱신합니다(LAN 정보는 일절 보내지 않습니다).
14. 분실·도난·폐기 시
Sensor에는 단말별 취약점 목록, 페어링된 단말의 주소, 서명 키가 들어 있습니다. 또한 페어링한 단말은 이 Sensor를 '포트 스캔을 허용한 상대'로 취급하므로, 도난당한 Sensor가 같은 LAN에 연결되면 그 상대로 행세할 수 있습니다. 다음 장치로 막습니다.
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로 하면 폐기될 때 키·TLS 키·설정(Webhook URL 포함)·페어링된 단말 목록·감사 결과·기기 대장을 0으로 덮어쓰고 삭제합니다. 작업·승인 로그만은 증적으로 남깁니다. 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 등)가 실제 방어입니다. 덮어쓰기 삭제는 플래시 저장 장치나 CoW 파일 시스템에서는 완전한 삭제를 보장하지 않습니다.