ROAMSWITCH SENSOR ・ 최종 업데이트: 2026-09-21

RoamSwitch Sensor 운영 매뉴얼

LAN에 설치하는 것만으로 동일 세그먼트의 신규 기기 출현·스푸핑을 탐지하고, RoamSwitch가 설치된 단말(Mac / Linux Client / Server Edition)에 대해서는 능동적인 취약점 감사를 수행하는 네트워크 센서의 도입·운영 가이드입니다. apt / dnf 패키지로 배포 중입니다.

1. 개요 & 포지셔닝

RoamSwitch(Mac / Linux Client / Server Edition)는 모두 호스트에 상주하는 에이전트 형태입니다. 여기에는 구조적인 사각지대가 두 가지 있습니다.

RoamSwitch Sensor는 LAN에 설치하는 전용 노드로서 이 두 가지 사각지대를 메우는 것을 목표로 하는 제품입니다. 구현·동작 확인이 끝난 것은 동일 LAN 상의 RoamSwitch 설치 단말에 대한 능동적인 취약점 감사, ARP 스윕과 ARP 테이블 모니터링을 통한 LAN 상 기기의 대장화 및 신규 기기 출현·스푸핑 탐지, 그리고 옵트인 수동 캡처를 통한 의심스러운 동작(악성 IP 연결·봇넷화·DNS 터널링의 징후 등)의 참고 정보 제시입니다(§6 참조). Sensor는 탐지와 보고만 수행하며 통신을 차단하지 않습니다. EDR이 아니라 경량 NDR(Network Detection & Response)과 자체 개발한 실증형 취약점 스캐너를 결합한 제품으로 설계하고 있습니다.

외부 전송 방침(기본값에서는 기기 정보·감사 결과를 전송하지 않음)
RoamSwitch Sensor는 「Zero Telemetry」가 아닙니다. 다른 기기를 관측하여 보고하는 것이 목적인 제품이며, 다음과 같은 통신을 수행합니다. (1) 탐지용 데이터 취득: CVE 맵과 nmap NSE 데이터베이스를 업데이트 서비스에서 매일 가져옵니다(updates.fetch_cve_map, 기본값 true. false로 하면 완전 오프라인 운용이 되며 기본 제공 데이터만 사용합니다). 이 통신에는 기기·감사 데이터가 포함되지 않습니다. (2) 운영자가 설정한 대상으로의 알림·집계: 웹훅·syslog·중앙 컬렉터에는 운영자가 설정한 경우에만 자사 조직의 대상으로 전송합니다(기본값에서는 아무것도 전송하지 않습니다). 페어링은 로컬에서 완결되며 클라우드 등록이나 계정 생성이 필요하지 않습니다.

자기 방어 기능은 구현하지 않습니다(의도적인 설계 결정). Sensor 자체에 대한 공격 대책이 필요한 경우, 동일 머신에 RoamSwitch for Linux의 Server Edition을 별도로 설치할 것을 권장합니다. 두 프로세스는 완전히 독립적으로 공존할 수 있습니다.

2. 현재 동작 확인 환경

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
옵트인: 수동적 LAN 가시화 확장
스위치의 미러 포트(SPAN) 수신이나 인라인 투명 브리지 환경에서 사용할 경우, 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 측 양쪽이 이 시점에서 서로를 신뢰 완료 상태로 취급합니다.

페어링 코드가 실효된 경우
페어링 코드는 발급 후 10분이 지나면 자동으로 실효되며, 재사용도 불가능한 1회 한정 코드입니다. 실효 후 페어링을 시도하면 거부됩니다. 이 경우 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)에서 이루어집니다. 다음과 같은 방어 기능이 내장되어 있습니다.

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로 설정하는 절차
(1) 모든 단말을 TLS 지원 버전으로 업데이트하고 각 단말에서 TLS 페어링(또는 재핀 고정)을 마칩니다 → (2) roamswitch-sensor status에 평문 연결 경고가 더 이상 나타나지 않는 것을 확인합니다 → (3) sudo roamswitch-sensor config set control.tls required → 데몬을 재시작합니다. off는 TLS가 필수인 Linux판 단말이 연결할 수 없게 되므로 보통은 사용하지 않습니다.

5. 능동적 취약점 감사

페어링된 엔드포인트에 대해, Sensor가 비파괴적인 실증형 취약점 진단을 실행합니다. 파괴적인 작업(데이터 쓰기·삭제, 서비스 중지)은 일절 수행하지 않습니다.

sudo roamswitch-sensor scan <공개 키 또는 그 앞부분>

감사는 4단계로 구성되어 있습니다.

  1. 전체 포트 스캔: 대상 호스트에서 열려 있는 TCP 포트를 남김없이 탐지합니다.
  2. 기존 시그니처 진단: Redis / dockerd / Memcached / MongoDB / Elasticsearch / CouchDB / Jenkins / VNC의 인증 없는 노출 확인, SMTP 오픈 릴레이 진단(MAIL FROM/RCPT TO만 전송하고 DATA는 전송하지 않는 안전한 방식), 개발 서버의 CORS 설정 오류·경로 순회·오픈 리다이렉트 진단 등, 알려진 취약점 패턴에 대한 비파괴적인 실증 확인을 수행합니다.
  3. 범용 배너 취득: 위 시그니처로 커버되지 않는 열린 포트에 대해, 연결만으로 배너 문자열을 취득합니다(데이터 전송은 하지 않습니다).
  4. 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 헤더를 관측(페이로드는 보지 않음)하여 다음을 탐지합니다.

sudo systemctl edit roamswitch-sensor.service
# [Service]
# Environment=ROAMSWITCH_SENSOR_PASSIVE_CAPTURE_IFACE=eth0

sudo systemctl restart roamswitch-sensor.service
roamswitch-sensor passive-events
일반 NIC와 미러 포트의 차이
일반적인 단일 NIC로도 ARP·브로드캐스트·멀티캐스트 범위 내에서는 신규 기기 탐지가 동작합니다(실제 물리 LAN에서 검증됨). 다만 LAN상의 다른 2대 간 일반 유니캐스트 통신까지 관측하려면 스위치의 미러 포트(SPAN) 수신, 또는 Sensor를 인라인 투명 브리지로 설치하는 구성이 필요합니다.

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가 통신을 차단하는 일은 없습니다.

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> --confirm
roamswitch-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 핑거프린트가 표시됩니다
TTLS·페어링 상태(모드·핑거프린트·평문 연결 경고·수신 대기 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. 신뢰 모델 & 보안 설계

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

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)으로 반영됩니다.

키 형식 / 가능한 값 기본값 재시작
sitestring(empty)불필요
languageja | en | ko | zh-Hans | zh-Hant | de | fr | es | it | pt-PT(empty = system locale)불필요
schedule.enabledboolfalse불필요
schedule.interval_hoursint24불필요
schedule.window_start_hourint 0–23(unset = always)불필요
schedule.window_end_hourint 0–23(unset = always)불필요
schedule.max_parallelint 1–81불필요
notify.webhook_urlsURL list(empty)불필요
notify.min_severityinfo | medium | high | criticalmedium불필요
notify.cooldown_minutesint30불필요
notify.syslog.hoststring(empty = off)불필요
notify.syslog.portint514불필요
notify.syslog.protocoludp | tcpudp불필요
retention.scan_history_daysint (0 = never prune)0불필요
retention.audit_log_daysint (0 = never prune)0불필요
retention.inventory_stale_daysint (0 = never prune)0불필요
collector.enabledboolfalse불필요
collector.urlURL(empty)불필요
collector.push_interval_minutesint15불필요
collector.send_unmanaged_devicesbooltrue불필요
collector.probe_control_portboolfalse불필요
control.bind_addrIP address0.0.0.0필요
control.tlsoff | optional | requiredoptional필요
control.allow_legacy_signaturesbooltrue불필요
updates.fetch_cve_mapbooltrue불필요
control.listen_ipv6boolfalse필요
dhcp.active_probebooltrue불필요
dhcp.allowed_serversMAC / IP list(empty = learn the first)불필요
ipv6.enabledbooltrue불필요
ipv6.active_probebooltrue불필요
ipv6.allowed_routersMAC / IP list(empty = trust the IPv4 gateway)불필요
unmanaged_audit.enabledbool (needs authorization + allowed_cidrs first)false불필요
unmanaged_audit.authorizationstring(empty)불필요
unmanaged_audit.allowed_cidrsCIDR list (IPv4 ≤ /16 and IPv6 ≤ /48 refused)(empty)불필요
unmanaged_audit.excludeIP / CIDR / MAC list(empty)불필요
unmanaged_audit.interval_hoursint168불필요
unmanaged_audit.max_parallelint 1–42불필요
unmanaged_audit.product_checkbool (needs unmanaged_audit.enabled)false불필요
security.on_revokedlockdown | wipe | nonelockdown불필요
security.lockdown_after_offline_daysint (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 파일 시스템에서는 완전한 삭제를 보장하지 않습니다.

← Server Edition 운영 매뉴얼 Linux판 도입 페이지로 →