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

RoamSwitch Sensor 운영 매뉴얼

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

1. 개요 & 포지셔닝

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

RoamSwitch Sensor는 LAN에 설치하는 전용 노드로서 이 두 가지 사각지대를 메우는 것을 목표로 하는 제품입니다. 현재 실제로 구현·동작 확인이 된 것은 동일 LAN 상의 RoamSwitch 설치 단말에 대한 능동적인 취약점 감사와, Sensor 자신의 ARP 테이블을 기점으로 한 신규 기기 출현·스푸핑의 수동적 탐지의 2가지뿐입니다(§6에서 설명하는 대로, LAN상의 모든 기기를 능동적으로 스캔하여 가시화하는 기능이 아닙니다). EDR이 아니라 경량 NDR(Network Detection & Response)과 자체 개발한 실증형 취약점 스캐너를 결합한 제품으로 설계하고 있습니다.

Zero Telemetry 원칙 (완전 로컬 완결)
RoamSwitch Sensor는 발견한 기기 정보, 감사 결과, ARP 이벤트를 외부로 일절 전송하지 않습니다. 페어링 또한 Sensor 운영자가 발급하는 1회용 페어링 코드를 통해 로컬에서 완결되며, 클라우드 등록이나 계정 생성이 필요하지 않습니다.

자기 방어 기능은 구현하지 않습니다(의도적인 설계 결정). 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회 한정 코드이므로, 구두나 채팅 등 임의의 아웃오브밴드 수단으로 단말 측 운영자에게 신속히 전달해 주십시오.

4.2 코드를 사용한 페어링(엔드포인트 측)

# 엔드포인트 측 (roamswitch-linux)
sudo roamswitch sensor pair --addr <Sensor 고정 IP 주소> --code <페어링 코드>

Mac판에서는 메뉴 바의 「🔍 RoamSwitch Sensor 페어링…」에서 Sensor의 IP 주소와 페어링 코드를 입력해 GUI로 동일한 작업을 수행할 수 있습니다.

페어링이 성립하면 이후의 능동적 취약점 감사・감사 결과 취득은 모두 Ed25519 서명으로 인증됩니다. 코드를 알고 있는 단말 측과, 그 코드를 발급한 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

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 자신이 보유한 ARP 테이블(/proc/net/arp에 해당)을 정기적으로 스냅샷하여, 이전과의 차이에서 「지금까지 본 적 없는 신규 IP/MAC의 출현」과 「기존 IP에 대한 MAC 주소 변경(게이트웨이 스푸핑 등의 징후)」 2가지 이벤트를 탐지합니다. 능동적인 패킷 송신은 하지 않으며, Sensor가 과거에 어떤 형태로든 통신한 기기만이 대상이 됩니다(LAN상의 모든 기기를 능동적으로 발견·열거하는 기능이 아닙니다). 기기의 종류(IoT 기기 여부 등)를 판별하는 기능은 없으며, 단순히 IP/MAC 변화만을 탐지합니다.

roamswitch-sensor arp-events

탐지된 이벤트는 TUI의 「ARP Events」 탭에서도 목록으로 확인할 수 있습니다. 「신규 기기 출현」과 「기존 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를 인라인 투명 브리지로 설치하는 구성이 필요합니다.

7. CLI 명령어 빠른 참조

명령어 기능 개요
roamswitch-sensor status Sensor 자신의 공개 키·IP 주소·MAC 주소, 페어링 수·ARP 이벤트 수·보류 중인 감사 요청 수를 표시
roamswitch-sensor issue-code 1회용 페어링 코드를 발급(10분간 유효)
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 config [show | set <키> <값>] 설정 표시·변경(정기 감사·알림·보존 기간·컬렉터, 데몬 재시작 불필요)
roamswitch-sensor diff [공개 키] 이전 감사와의 차이 표시(신규 발견·해소·새로 열린 포트·도달 불가 의심)
roamswitch-sensor export <scans|inventory|audit-log|all> … 감사 증적을 CSV / JSON / 인쇄용 HTML로 내보내기
roamswitch-sensor audit-log [verify] 작업·승인 로그 표시. verify로 해시 체인 변조 감지
roamswitch-sensor notify-test 설정한 알림 대상(Webhook / syslog)에 테스트 알림을 보내 연결 확인

CLI는 일본어 / 영어에만 대응합니다(LANG 환경 변수를 따릅니다).

8. TUI 조작 가이드

대화형 TUI(roamswitch-sensor-tui)는 10개 언어를 지원합니다. Tab 키(역방향은 Shift+Tab)로 6개 탭을 전환합니다: 신뢰됨(각 단말의 최신 감사 상태) / 네트워크 장치(LAN의 모든 기기와 메모) / ARP 이벤트 / 감사 기록 / 변경(이전 감사 이후의 변화 — 신규 발견은 빨강, 해소는 초록, 도달 불가 의심은 노랑) / 작업 로그(누가 언제 무엇을 승인·실행했는지, 상단에 해시 체인 검증 결과 표시).

동작
Tab탭 전환
↑↓ / j k항목 선택
c페어링 코드 발급(10분간 유효). 화면에는 엔드포인트에서 실행할 명령 sudo roamswitch sensor pair --addr <이 Sensor의 IP> --code <코드>가 실제 값이 채워진 상태로 표시됩니다
u페어링 해제
s선택 중인 단말에 능동적 취약점 감사를 실행
n(네트워크 구성 탭) 선택한 기기에 이름·용도·위치 등의 메모를 등록(메모가 있는 기기는 '파악됨'으로 취급)
r지금 LAN 기기를 다시 스캔(ARP 스윕, 기본적으로 1시간마다 자동 실행)
e감사 증적 내보내기(감사 결과·기기 대장·작업 로그의 CSV, HTML 보고서, JSON). 소유자만 읽을 수 있는 새 파일로 /tmp에 생성되며, 내보낸 사실도 작업 로그에 기록됩니다
Enter선택한 행의 상세 표시(감사 이력·변경·ARP 이벤트·기기·작업 로그)
w(상세 표시 중) 내용을 파일로 내보내기
L표시 언어 선택
q종료

9. 신뢰 모델 & 보안 설계

10. 문제 해결 & FAQ

Q1. 페어링 코드를 입력해도 거부됩니다.

다음 3가지 원인을 생각할 수 있습니다: (1) 발급 후 10분이 지나 실효됨(Sensor 측 운영자에게 issue-code로 재발급을 요청하십시오), (2) 코드 입력 실수(오독하기 쉬운 0/O/1/I/L은 발급 시점에 제외되므로 코드에 포함될 수 없습니다), (3) --addr에 지정한 IP 주소가 Sensor의 현재 고정 IP 주소와 일치하지 않음.

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로 페어링이 해제됨. 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 <코드>로 다시 페어링해 주십시오.

11. 조직 규모 감사 운영 기능 (옵트인)

대규모 조직의 보안 담당자가 감사 증적과 변화 파악을 위해 사용하는 기능 모음입니다. 모두 초기 상태에서는 꺼져 있으며, Lafine이나 제3자에게는 아무것도 전송되지 않습니다. 알림·집계 대상은 모두 운영자가 설정한 자사 조직의 것입니다. 설정은 sudo roamswitch-sensor config set <키> <값>으로 하며(데몬 재시작 불필요, 변경 내용은 작업 로그에 기록됨) config show로 현재 값을 확인할 수 있습니다.

11.1 정기 감사와 이전 감사와의 차이

schedule.enabledtrue로 설정하면 페어링된 모든 단말을 자동으로 정기 감사합니다(기본 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), 내보낸 사실 자체도 작업 로그에 기록됩니다.

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
← Server Edition 운영 매뉴얼 Linux판 도입 페이지로 →