
Linux向け次世代GUIベースのWiFiおよびBluetoothアナライザ
Sparrow-WiFi は、Linux 向けの 2.4 GHz および 5 GHz の WiFi および Bluetooth スペクトル認識ツールです。これは、WiFi スキャン、Bluetooth Low Energy および Classic の発見、ソフトウェア定義無線スペクトル分析 (HackRF, Ubertooth)、GPS 追跡、FAA RemoteID ドローン検出、ドローン/ローバー搭載のリモート操作、および Elasticsearch または OpenSearch への ECS 8.17 インデックス作成を単一のプラットフォームに統合します。完全に Python 3 で書かれています。
このプロジェクトには、単独または連携して動作する 4 つのコンポーネントが含まれています:
| コンポーネント | インターフェース | 目的 |
|---|---|---|
| Sparrow-WiFi | PyQt5 デスクトップ GUI | WiFi/BT スキャン、スペクトル分析、ソース追跡、ワードライビング |
| Sparrow Agent | ヘッドレス HTTP サーバー | リモートスキャン、ドローン/ローバー展開、サードパーティ統合 |
| Sparrow DroneID | Web ベース (ブラウザ) | WiFi および Bluetooth LE を介した FAA RemoteID ドローン検出 |
| Sparrow Elastic Bridge | ヘッドレス CLI サービス | WiFi/BT 観測の Elasticsearch / OpenSearch への ECS 8.17 インデックス作成 |
Sparrow Agent と Sparrow DroneID は、他のアプリケーションがスキャン結果を照会し、スキャンをトリガーし、ドローン検出を取得し、ワイヤレス/ドローン認識を独自のワークフローに統合できるようにする JSON REST API を公開します。Elastic Bridge はエージェントの REST API を利用し、バンドルされた Kibana ダッシュボードとともに ECS 8.17 ドキュメントを転送します。
このリリースは、以前のバージョンからの 3 つの重要な改善点をカバーしています:
/wireless/networks/<iface> にアクセスすると、エージェントは以前、インターフェースごとのロックで直列化される N 個の冗長な iw scan 呼び出しを開始し、スキャン待ち時間をクライアント数倍にしていました。最初のリクエストが実際にスキャンを行う「リーダー」になり、同時リクエストは threading.Event で待機し、リーダーの結果を共有します。また、ロック作成の TOCTOU 修正とインターフェースごとのロックの例外安全性も含まれています。droneid.* 名前空間)、およびマルチデバイス対応のレスポンシブ Web 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) ブロードキャストをデコードするスタンドアロンの Web ベースのドローン検出および追跡システム。ネットワーク上の任意のデバイスからアクセス可能なブラウザベースの UI を備えた Python HTTP サーバーとして実行されます。
Web UI は起動後に http://localhost:8097 で実行されます。セットアップについては以下のインストールを、プログラムによるアクセスについてはAPI リファレンスを参照してください。
Slack webhook に加えて、Sparrow DroneID は発火された各アラートを汎用外部アラート取り込みエンドポイントに POST できます。このチャンネルはデフォルトで無効になっています。設定 → アラート → API ベースのアラート通知で設定します:
http://MY_API_HOST:PORT/API_ROOTAuthorization: Bearer ... ヘッダーで送信。保存されると UI でマスクrule.category: "test", serial TEST-0000) を POST して、実際のドローンを待たずに受信側をエンドツーエンドでテストSparrow DroneID は設定されたルート URL に対して 2 つの呼び出しを行います:
両方の呼び出しは 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`を使用するため、受信機はこれらを認識して運用ダッシュボードから除外できます。
---
## システム要件
| 要件 | Sparrow-WiFi (GUI) | Sparrow DroneID (Web) |
|-------------|-------------------|----------------------|
| **OS** | Ubuntu 20.04+、Kali 2020.3+、Debian 11+ | Ubuntu 20.04+、Kali、Debian 11+、Raspberry Pi OS |
| **Python** | 3.8+ | 3.8+ |
| **Root** | 必須(iw scan) | 必須(モニターモード、BLE) |
| **WiFiアダプタ** | `iw`対応の任意のもの | モニターモード対応(例:rtl8812au、Intel AX200) |
| **Bluetooth** | オプション(hciアダプタ、Ubertooth) | オプション(RemoteID用の任意のBLE対応アダプタ) |
| **GPS** | オプション(gpsd) | オプション(gpsdまたは静的座標) |
| **ディスプレイ** | X11/Waylandデスクトップ | ヘッドレスOK(任意のデバイスのWebブラウザ) |
---
## インストール
### Sparrow-WiFi (デスクトップGUI)```bash
git clone https://github.com/ghostop14/sparrow-wifi
cd sparrow-wifi
システムパッケージ (Ubuntu 22.04+ / Debian 12+ / Kali rolling):```bash
sudo apt install python3-pip python3-pyqt5 python3-pyqt5.qtchart
gpsd gpsd-clients python3-tk python3-setuptools
> **Kaliユーザーの場合:** PyQt5、PyQtChart、aircrack-ng(Falconプラグイン用)は通常プリインストールされています。基本的に必要なのは `gpsd`、`gpsd-clients`、および以下のPython依存関係だけです。
Python依存関係 — いずれかの方法を選択してください:
**オプションA: `--break-system-packages`を使用したシステム全体へのインストール** — 最も簡単で、GUI/エージェントが起動される方法(root所有のスクリプト)に適しています:```bash
# Modern systems (Ubuntu 24.04+, Kali rolling 2023+, Debian 12+) require this
# flag because Python is marked externally-managed (PEP 668). Sparrow runs as
# root anyway, so system-wide install is consistent with how it executes.
sudo pip3 install --break-system-packages -r requirements.txt
Option B: 仮想環境 — 分離されており、システムpipの警告がなく、一部のオペレーターに好まれています:```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
sudo venv/bin/python3 ./sparrow-wifi.py
どちらにせよ、run:```bash
sudo ./sparrow-wifi.py
cd sparrow-droneid
sudo apt install tcpdump bluez
sudo pip3 install --break-system-packages -r sparrow_droneid/requirements.txt
python3 -m venv venv && source venv/bin/activate && pip install -r sparrow_droneid/requirements.txt
sudo python3 sparrow_droneid/app.py
ブラウザで `http://localhost:8097` を開いてください。設定でモニターインターフェースとGPSを設定し、Startをクリックします。
### Elasticsearch / OpenSearch Bridge (オプション)```bash
sudo pip3 install --break-system-packages -r requirements-elastic.txt
# or via venv as above
以下の Elasticsearch / OpenSearch 統合 を参照してください。
ほとんどのWiFiアダプタは基本的なスキャンで動作します。Sparrow-WiFiは複数のインターフェース列挙バックエンド(iw、iwconfig、nmcli)をサポートしているため、iwがインストールされていないシステム(例:NetworkManagerのみを使用するRHEL/Fedora)でも動作します。
モニターモード(Sparrow DroneIDとFalconプラグインで必要)の場合、アダプタとドライバのサポートは異なります。
iw phy <phy> info | grep monitor または iwconfig <iface> で機能を確認してください。特にSparrow DroneIDの場合、アダプタはモニターモードで生の802.11フレームを配信する必要があります。一部のIntelアダプタはモニターモードをサポートしていると報告しますが、ファームウェアレベルでフレームを静かにドロップします。アプリケーションはこれを検出して警告します。
Sparrow-WiFiはいくつかのBluetoothスキャンモードをサポートしています。
標準の内蔵またはUSB Bluetoothアダプタは、BLEアドバタイズメントスキャンとRemoteIDドローン検出に十分です。bluetoothctl scan onでアダプタをテストしてください。
ClassicデバイスとBLEデバイスの両方を完全なプロミスキャスモードで発見するには、Ubertooth One と、/opt/bluetooth/blue_hydraにインストールされた Blue Hydra が必要です。これはオプションであり、基本的なBLEまたはRemoteIDスキャンには必要ありません。
WiFiチャンネルビュー上でのリアルタイムスペクトラムオーバーレイ。
ubertooth-specan-uihackrf_sweep
両方のアプリケーションはGPSにgpsdを使用します。クイックセットアップ:```bash
sudo apt install gpsd gpsd-clients
sudo gpsd -D 2 -N /dev/ttyUSB0
xgps # or: cgps -s
本番環境では、`/etc/default/gpsd` をデバイスパスに設定し、サービスを再起動してください。
Sparrow DroneID は、GPSレシーバーを使用しない固定サイト設置のために、静的座標(設定で構成)もサポートしています。
---
## リモートエージェントとAPI統合
Sparrow エージェント (`sparrowwifiagent.py`) は、Sparrow の WiFi および Bluetooth スキャン機能のすべてを JSONベースの REST API として公開するヘッドレスHTTPサーバーです。これは Sparrow-WiFi GUI がリモートセンサーと通信する方法ですが、API は任意のアプリケーションが使用できるように公開されています。
**使用例:**
- リモート/モバイルスキャン用にRaspberry Pi、ドローン、またはローバーにデプロイ
- WiFi および Bluetooth の状況認識を独自のアプリケーションに統合
- スキャンデータをSIEM、ダッシュボード、またはアラートパイプラインにフィード
- スクリプトでスキャンを自動化 (スキャンのトリガー、curl/Pythonなどを介した結果の取得)
Sparrow DroneID にも独自のREST APIがあります ([APIリファレンス](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md))。ドローン検出、アラート管理、ジオゾーン、システム設定へのプログラムによるアクセスを提供します。
### エージェントの実行```bash
sudo ./sparrowwifiagent.py
デフォルトではポート8020でリッスンします。主なオプション:
完全なリストは--helpを参照してください。
curl http://sensor:8020/wireless/interfaces
curl http://sensor:8020/wireless/networks/wlan0
curl "http://sensor:8020/wireless/networks/wlan0?frequencies=2412,2437,2462"
curl http://sensor:8020/gps/status
curl http://sensor:8020/bluetooth/discoverystarta
curl http://sensor:8020/bluetooth/discoverystatus
Sparrow DroneIDについては、専用の[APIリファレンス](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow-droneid/sparrow_drone_id_api.md)を参照してください。
> **実稼働上の注意:** デフォルトではエージェントはすべてのインターフェースで待ち受ける。信頼できないネットワークの外部にデプロイする場合は、`--allowedips`を使用して発信元を制限するか、リバースプロキシとTLSの背後で実行するか、プライベートインターフェースのみにバインドすること。
---
## Falcon / Aircrack-ng プラグイン
高度なワイヤレス侵入テスト統合。以下の機能にポイントアンドクリックでアクセスできます:
- airodump-ng による隠しSSIDの発見
- クライアントステーションの列挙(接続先AP、プローブされたSSID)
- 標的型およびブロードキャストの非認証化
- WEP IVのキャプチャ
- WPAハンドシェイクのキャプチャと自動ハッシュ抽出(JTR `wpapcap2john`が必要)
### 前提条件```bash
# Kali users: aircrack-ng + JTR are usually pre-installed.
# Ubuntu / Debian / Raspberry Pi OS:
sudo apt install aircrack-ng john
Verify airmon-ng、airodump-ng、wpapcap2john がインストール後に PATH に含まれていることを確認してください。
アクティブなペネトレーションテストは法的規制の対象となります。これらのツールを使用する前に適切な許可を得るのはあなたの責任です。
sparrow_elastic パッケージは ECS 8.17 ブリッジを提供し、Sparrow WiFi エージェントをポーリングして WiFi と Bluetooth の観測データを Elasticsearch 8.x または OpenSearch 2.x に一括インデックスします。構成可能なインデックステンプレート、ILM/ISM ライフサイクルポリシー、ロールオーバー書き込みエイリアスを自動的にブートストラップし、OUI ベンダーエンリッチメントとルールベースのデバイス分類(オプションで Fingerbank フィンガープリンティング)を実行し、プリビルドの Kibana ダッシュボードを提供します。
sudo ./sparrowwifiagent.py
sudo pip3 install --break-system-packages -r requirements-elastic.txt
./sparrow-elastic.py --elasticserver http://user:pass@host:9200 --wifiinterface wlan1
python3 install_dashboards.py --kibana-url http://kibana:5601
--username elastic --password ''
> **認証情報の衛生:** `--elasticserver` に `user:pass@` を埋め込むと便利ですが、URL が `ps`、`journalctl`、シェル履歴に表示されます。本番環境では、`--username`/`--password` フラグ、環境変数 (`SPARROW_ES_USERNAME`、`SPARROW_ES_PASSWORD`)、または同梱の systemd ユニット例にある `EnvironmentFile=` パターンを使用してください。
### ブリッジに同梱されるもの
- **5つのKibanaダッシュボード** — 状況認識、生活パターン、新規デバイス検出、スペクトラム計画(SSID × チャンネルの信号強度ヒートマップ付き)、Bluetooth状況認識(完全新規デバイスVegaパネルと推定距離近接テーブル付き)
- **6つのレガシー保存ビジュアライゼーション** — 元の `Sparrow*` ビジュアライゼーションのフィールド名変更クローンで、古い筋肉記憶がそのまま使えます
- **デバイスクラシファイア** — ドローンコントローラー(DJI/Autel/Skydio/Parrot/Yuneec)、BT Class of Device、GAP Appearance、Apple Continuityサブタイプ、OUIベンダーヒューリスティックをカバーする64ルールのシードテーブル
- **参照データリフレッシュ** — バンドルされたWireshark `manuf`、BT SIG company IDs、service UUIDs、GAP appearance values、Apple Continuity subtype tables、および30/90日ごとの自己リフレッシュバックグラウンドスレッド
- **プリフライト互換性チェック** — レガシーECS 1.5インデックスへの書き込みを拒否し、データを静かに破損する代わりに明確な修復手順を出力します
完全なオペレータードキュメント(エンジン選択、認証モード、ダッシュボードインポート、参照データ、完全なCLIリファレンス)については、[sparrow_elastic/README.md](https://github.com/ghostop14/sparrow-wifi/blob/HEAD/sparrow_elastic/README.md) を参照してください。
サンプル設定ファイルはリポジトリルートと `init.d_scripts/` にあります:
- `sparrow-elastic.conf.example` — サポートされているすべてのキーを含むINIスタイル設定
- `sparrow-elastic.env.example` — systemdデプロイメント用のシェル形式envファイル
- `init.d_scripts/sparrow-elastic.service.example` — systemdユニットテンプレート
### レガシーECS 1.5ブリッジからの移行
2026年以前のブリッジは、`--wifiindex` / `--btindex` を介してオペレーターが指定した名前のインデックスにECS 1.5ドキュメントを書き込んでいました。新しいブリッジは、ロールオーバー管理された書き込みエイリアス(デフォルト `sparrow-wifi` / `sparrow-bt`)にECS 8.17ドキュメントを書き込みます。
**レガシースクリプトは `legacy/sparrow-elastic.py` に保存されており**、その `.txt` テンプレートとILMポリシーファイルが同梱されています。このスクリプトを実行するには、依然としてレガシー環境(手動テンプレート+ILM設定)が必要です。
**フラグの変更(後方互換性あり):**
| Legacy flag | New flag | Notes |
|---------------------|--------------------|--------------------------------------------------------|
| `--wifiindex NAME` | `--wifi-alias NAME`| レガシースペルは非推奨エイリアスとして引き続き受け入れられます。|
| `--btindex NAME` | `--bt-alias NAME` | レガシースペルは非推奨エイリアスとして引き続き受け入れられます。|
| `--dont-create-indices` | unchanged | ブートストラップをスキップします。|
| `--elasticserver`, `--sparrowagent`, `--sparrowport`, `--wifiinterface`, `--scandelay` | unchanged | |
例えば、以下のようなレガシー呼び出し:```bash
./sparrow-elastic.py --elasticserver=http://user:pass@host:9200 \
--wifiinterface=wlan1 \
--wifiindex=sparrowwifi-home \
--btindex=sparrowbt-home
still parses and runs — but the bridge now refuses to write into a pre-existing index whose mapping doesn't carry the ECS 8.17 schema marker, exiting with three remediation options (use a different alias, wipe and re-bootstrap, or run the legacy bridge). For a clean install, just drop --wifiindex / --btindex and accept the new defaults.
リモートエージェントは、ドローンやローバーに搭載されたRaspberry Piにデプロイすることで、モバイル無線調査が可能です。MAVLinkを介したGPS統合を備えたSolo 3DRドローンでテスト済みです。
sudo python3 ./sparrowwifiagent.py --userpileds --sendannounce --mavlinkgps 3dr --recordinterface wlan0
LEDインジケータ(Raspberry Pi):
1. 両方オフ — 初期化中
2. 赤色の点滅 — GPS存在、未同期
3. 赤色常時点灯 — GPS同期
4. 緑色常時点灯 — エージェント準備完了、リクエスト提供中
録音データはSparrow-WiFi GUIのエージェント管理インターフェースから取得できます。
### Piのセットアップに関する注意
- Raspberry Pi OS(Bookworm以降)をPython 3.8+と共に使用
- オンボードWiFiを無効にしてUSBアダプターで5 GHzスキャンを有効にする:Bookworm以降では`dtoverlay=disable-wifi`を`/boot/firmware/config.txt`に追加、古いリリースでは`/boot/config.txt`に追加
- 前提条件をインストール:`sudo pip3 install --break-system-packages -r requirements.txt`(または[インストール](#installation)セクションのvenvを使用)
---
## プロジェクト構成```
sparrow-wifi/
sparrow-wifi.py # Desktop GUI entry point
sparrowwifiagent.py # Headless remote agent
sparrow-elastic.py # Elasticsearch / OpenSearch bridge (ECS 8.17)
install_dashboards.py # One-shot Kibana dashboard installer
requirements.txt # Python dependencies (GUI)
requirements-elastic.txt # Python dependencies (Elasticsearch bridge)
wirelessengine.py # WiFi scan engine (iw)
sparrowbluetooth.py # Bluetooth scan engine
sparrowhackrf.py # HackRF spectrum engine
sparrowmap.py # Map generation
plugins/ # Falcon and other plugins
sparrow_elastic/ # ES/OS bridge package
*.py # Client abstraction, document builder, classifier...
templates/ # Composable index templates (ES + OS variants)
policies/ # ILM (ES) and ISM (OS) lifecycle policy JSON
dashboards/ # Kibana NDJSON: 5 dashboards + legacy-preserved
data/ # Bundled reference data (manuf, BT SIG, classifier rules)
README.md # Full bridge operator documentation
legacy/ # Pre-2026 ECS 1.5 bridge, frozen for reference
sparrow-elastic.py # Legacy bridge (still runnable)
sparrow_elastic_*.txt # Legacy index templates and ILM policy
sparrow-droneid/ # DroneID web application
sparrow_droneid/
app.py # Entry point (sudo python3 app.py)
__main__.py # Allows: sudo python3 -m sparrow_droneid
requirements.txt # Python dependencies (DroneID)
backend/ # API server, capture engine, database
frontend/ # HTML, JS, CSS (served by backend)
sparrow_drone_id_api.md # REST API reference
このプロジェクトは、リポジトリに含まれる条件に基づいてライセンスされています。詳細についてはLICENSEファイルを参照してください。
| 動詞 | パス | 目的 |
|---|
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"} はドメインが上流で無効であることを示します。 |
| モード | ハードウェア | 表示内容 |
|---|
| BLEアドバタイズメントスキャン | 標準BTアダプタ | アクティブにアドバタイズしているLEデバイス |
| プロミスキャススキャン | Ubertooth One + Blue Hydra | 範囲内のすべてのBLEおよびクラシックBTデバイス |
| iBeaconアドバタイジング | 標準BTアダプタ | 自分自身のiBeaconをアドバタイズ |
| RemoteIDスキャン | 標準BTアダプタ | FAA準拠のドローン識別(Sparrow DroneIDのみ) |
| フラグ | 目的 |
|---|
--port PORT | HTTPリッスンポート |
--allowedips IP1,IP2 | クライアント接続を制限 |
--staticcoord LAT,LON,ALT | 固定のGPS座標を使用 |
--mavlinkgps 3dr | Solo 3DRドローンからGPSを取得 |
--recordinterface IFACE | 起動時に自動録画(ヘッドレス) |
--userpileds | Raspberry PiのLEDをステータス表示に使用 |
--sendannounce | エージェント発見用のUDPブロードキャスト |