
차세대 GUI 기반 WiFi 및 Bluetooth 분석기 (Linux용)
Sparrow-WiFi는 Linux용 2.4GHz 및 5GHz WiFi 및 Bluetooth 스펙트럼 인식 도구입니다. WiFi 스캐닝, Bluetooth Low Energy 및 Classic 탐지, 소프트웨어 정의 무선 스펙트럼 분석(HackRF, Ubertooth), GPS 추적, FAA RemoteID 드론 탐지, 드론/로버 탑재 원격 운영, 그리고 ECS 8.17 인덱싱을 Elasticsearch 또는 OpenSearch에 통합하는 단일 플랫폼입니다. 전체가 Python 3로 작성되었습니다.
이 프로젝트는 독립적으로 또는 함께 작동하는 네 가지 구성 요소를 포함합니다:
| 구성 요소 | 인터페이스 | 목적 |
|---|---|---|
| Sparrow-WiFi | PyQt5 데스크톱 GUI | WiFi/BT 스캐닝, 스펙트럼 분석, 소스 추적, 워드라이빙 |
| Sparrow Agent | 헤드리스 HTTP 서버 | 원격 스캐닝, 드론/로버 배포, 타사 통합 |
| Sparrow DroneID | 웹 기반 (브라우저) | WiFi 및 Bluetooth LE를 통한 FAA RemoteID 드론 탐지 |
| Sparrow Elastic Bridge | 헤드리스 CLI 서비스 | WiFi/BT 관측 데이터의 ECS 8.17 인덱싱 → Elasticsearch / OpenSearch |
Sparrow Agent와 Sparrow DroneID는 JSON REST API를 노출하여 다른 애플리케이션이 스캔 결과를 조회하고, 스캔을 트리거하고, 드론 탐지 정보를 가져오고, 무선/드론 인식을 자체 워크플로에 통합할 수 있도록 합니다. Elastic Bridge는 에이전트의 REST API를 사용하고 ECS 8.17 문서를 번들 Kibana 대시보드와 함께 전송합니다.
이번 릴리스는 이전 버전에 비해 세 가지 중요한 개선 사항을 포함합니다:
/wireless/networks/<iface>에 접근할 때, 에이전트는 이전에 중복된 N개의 iw scan 호출을 시작하여 인터페이스별 잠금에서 직렬화되어 스캔 지연 시간이 클라이언트 수만큼 곱해졌습니다. 이제 첫 번째 요청이 실제로 스캔하는 "리더"가 되며, 동시 요청은 threading.Event에서 대기하고 리더의 결과를 공유합니다. 또한 잠금 생성 TOCTOU 수정 및 인터페이스별 잠금에 대한 예외 안전성을 포함합니다.droneid.* 네임스페이스 포함) 및 다중 장치 반응형 웹 UI를 포함합니다. 아래 Sparrow DroneID 섹션을 참조하십시오.sparrow-elastic.py 브리지가 ECS 8.17 문서를 생성하도록 재작성되었으며(이전 ECS 1.5), 이제 Elasticsearch 8.x 및 OpenSearch 2.x를 모두 지원하고, ILM/ISM 수명 주기 정책 및 롤오버 쓰기 별칭이 포함된 컴포저블 인덱스 템플릿을 자동으로 부트스트랩하며, OUI 공급업체 보강 및 규칙 기반 장치 분류(선택적 Fingerbank 핑거프린팅 포함)를 수행하고, 4개의 번들 Kibana 대시보드와 6개의 레거시 보존 시각화를 제공합니다. 레거시 ECS 1.5 브리지는 legacy/sparrow-elastic.py에 보존되어 있습니다. Elasticsearch / OpenSearch 통합을 참조하십시오.원래 Sparrow 애플리케이션은 inSSIDer 및 LinSSID와 같은 도구를 대체하는 포괄적인 GUI 기반 솔루션을 제공하며, 기본 스캐닝을 훨씬 넘어서는 기능을 갖추고 있습니다:
sparrowwifiagent.py)iw scan 출력
FAA 의무 원격 식별(RemoteID) 브로드캐스트를 디코딩하는 독립형 웹 기반 드론 탐지 및 추적 시스템입니다. Python HTTP 서버로 실행되며 네트워크상의 모든 장치에서 접근 가능한 브라우저 기반 UI를 제공합니다.
웹 UI는 시작되면 http://localhost:8097에서 실행됩니다. 설정은 아래 설치를 참조하고, 프로그래밍 방식 액세스는 API 참조를 참조하십시오.
Slack 웹훅 외에도 Sparrow DroneID는 각 트리거된 알림을 일반 외부 알림 수집 엔드포인트에 POST할 수 있습니다. 이 채널은 기본적으로 비활성화되어 있습니다. 설정 → 알림 → API 기반 알림에서 구성하십시오:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ... 헤더로 전송됨, 저장되면 UI에서 마스킹됨rule.category: "test", 일련번호 TEST-0000)을 POST하여 실제 드론을 기다리지 않고 수신자를 종단간 테스트할 수 있음Sparrow DroneID는 구성된 루트 URL에 대해 두 가지 호출을 수행합니다:
| 동사 | 경로 | 목적 |
|---|---|---|
POST | {root}/v1/alerts/verify | 자격 증명 확인 — 본문 {"domain": "<configured>"}. 수신자는 성공 시 200 {"status":"ok"}를, 잘못된 토큰 시 401을 응답해야 합니다. |
POST | {root}/v1/alerts | 알림 발생 — 본문은 아래 JSON입니다. 수신자는 성공 시 201 {"alert_id":"..."}를 응답해야 합니다. 503 응답은 지수 백오프(3회 재시도)로 재시도됩니다. 4xx는 재시도 없이 중단됩니다. 200 {"status":"dropped"}는 도메인이 업스트림에서 비활성화되었음을 나타냅니다. |
두 호출 모두 Authorization: Bearer <token> 및 Content-Type: application/json 헤더를 전송합니다.
{ "domain": "", "alert": { "message": "", "observer": { "name": "<operator_name or 'Sparrow DroneID'>", "type": "drone-sensor", "geo": {"location": {"lat": 0.0, "lon": 0.0}} }, "rule": {"name": "", "category": "drone_detection"}, "event": { "severity": 40, "category": "network", "action": "new_drone" }, "labels": { "serial": "", "vendor": "", "ua_type": "", "alert_type": "new_drone | altitude_max | speed_max | signal_lost" }, "source": {"geo": {"location": {"lat": 0.0, "lon": 0.0}}}, "details": { "operator_id": "...", "registration_id": "...", "self_id_text": "...", "mac_address": "...", "protocol": "...", "rssi": -68, "range_m": 1234.5, "bearing_deg": 215.0, "bearing_cardinal": "SW", "speed_mps": 5.2, "direction_deg": 240.0, "altitude_m_agl": 42.0, "detail": "..." } } }
`observer.geo.location`는 수신기에 GPS 고정이 있을 때 포함되며, `source.geo.location`는 드론이 위치를 브로드캐스트할 때 포함됩니다. 심각도는 ECS 규칙을 따릅니다(낮을수록 더 긴급함): 경고(`new_drone`, `altitude_max`, `speed_max`)는 `40`, 정보성 이벤트(`signal_lost`)는 `70`입니다. 친구 태그가 지정된 드론은 운영자 측의 "친구 드론에 대한 알림" 토글이 꺼져 있을 때 알림을 발생시키지 않으므로 이 엔드포인트에도 도달하지 않습니다.
**테스트 메시지 보내기** 버튼으로 전송되는 합성 테스트 경보는 `rule.category: "test"`, `event.action: "test"`, `event.severity: 70`, 직렬 `TEST-0000`을 사용하여 수신기가 이를 인식하고 운영 대시보드에서 제외할 수 있도록 합니다.
---
## 시스템 요구 사항