
手元にあるログ(Zeek、Pi-hole、syslogやsystemdジャーナル、CloudTrail)を使ったローカルファーストの脅威ハンティング。実行のたびに、各検出器の背後にある手法を明示します。エージェントもデーモンもブラックボックスも不要 - grepとSIEMの間に位置します。

grepとSIEMの間
sigwood は、セルフホスター向けのローカルファーストなコマンドライン脅威ハンティングツールです。すでに手元にあるログ - Zeek、Pi-hole/dnsmasq、syslog、CloudTrail - を指定すると、その内容をプロファイリングし、いくつかの検出器を実行します。検出対象は、ビーコニング、不審なDNS、ポートスキャン、大量の外向き転送、普段と異なるTLS設定、認証構造、まれなsyslogイベント、異常なCloudTrailアクティビティ、そしてPi-holeがすでにブロックした名前における行動パターンです。
SIEMではありません。エージェントでもありません。魔法でもありません。 デプロイするものは何もありません - データベースも、デーモンも、ネットワークも、アカウントも不要です。インストールし、ログのディレクトリを指定し、出力を読むだけです。自分のマシン上で、保存されたログに対して動作し、ログがマシンの外に出ることはありません。
ステータス: 安定版(
1.2.0)。 10個の検出器は動作し、テストでカバーされています。 1.0の意味では、どのインターフェースが固定され、どれがそうでないかを説明しています。 人間によるレビューの下、AIの多大な支援を受けて構築されています。 FAQにその方法が、 エビデンス台帳には 何が測定され、何が測定されていないかが記録されています。フィードバックを歓迎します。
インストール · マニュアル · FAQ · コントラクト · ロードマップ · 既知の問題 · スキーマ · 先行研究 · セキュリティ
pipx install sigwood # or: pip install sigwood in a venv - see Installation
sigwood /var/log/ # point it at a directory
sigwood /opt/zeek/dns.log # or a single file
以上です。設定は不要です。実行時に表面化する内容の例を以下に示します(説明用の出力であり、実際のネットワークデータではありません)。
dns - 1 finding · 1 high
domain names that stand apart from the rest, including machine-generated-looking
names of the sort malware uses for disposable command domains, and large batches
of related lookups
────────────────────────────────────────────────────────────────────────────────
groups (1)
names entropy score queries clients
high 16 2.10-1.85 418 1 k7x2p9qz3f.example
beacon - 2 findings · 2 medium
outbound connections that keep a regular rhythm
────────────────────────────────────────────────────────────────────────────────
medium 192.168.1.37 → 198.51.100.20:443/tcp period=3.0m rhythm=0.624 480 conns
medium 192.168.1.37 → 203.0.113.50:8443/tcp period=10.0m rhythm=0.606 144 conns
syslog - 1 finding · 1 medium
rare log patterns, and recorded reboots or administrative runs, so changes on a
machine do not disappear into routine logs
────────────────────────────────────────────────────────────────────────────────
privileged (1)
medium Accepted password for root from 198.51.100.20 port 51900 ssh2
-v explains why each finding surfaced
上から下へ読むと、それは一つのストーリーです。内部ホストが使い捨ての単一ドメインの下で高エントロピーなルックアップを行い、固定スケジュールで2つの外部IPへ通信し、それと同じIPの一つからroot SSHログインが発生している。検出結果は「あなたのネットワークにとって異常」を意味するのであって、「既知の悪性」ではありません。それは調査すべき手がかりであり、判定ではありません。各スコアの根拠と、それを追跡するための次のステップを表示するには -v を追加してください。
Pi-holeしか持っていませんか? それだけでも完全なセットアップです:
sigwood digest /var/log/pihole/pihole.log # orient: what's in the log
sigwood /var/log/pihole/ # hunt: DNS clustering over your queries
sigwood dnsblock /var/log/pihole/ # bonus: behavior in names Pi-hole blocked
よくある呼び出し方法:
sigwood digest /var/log/messages # orient first - a fast, factual profile of a file
sigwood graph /opt/zeek # replay the flows as a self-contained HTML artifact
sigwood syslog /var/log # run a single detector
sigwood init # detection-driven setup, writes a config
sigwood hunt # run the curated default hunt
ログが手元にない場合 リポジトリには小さな合成コーパスジェネレーターが含まれています。侵害されたホストが1台だけで、実際のネットワークデータは含まれていないため、まずその動作を確認できます。
git clone https://github.com/helixmap/sigwood
cd sigwood
python3 demo/gen_corpus.py # writes a synthetic corpus; no network calls
sigwood hunt --config=demo/sigwood.toml # beacons, a DGA burst, a bulk transfer out, and the syslog trail
生成されたログは demo/corpus/ 配下にあります(gitignore 対象)。完全なウォークスルーは
demo/README.md にあります。以下はそのコーパスに対する
完全な実行結果で、続いて同じ検出結果を HTML 形式で示します:
...そして同じフローを sigwood graph で再生した、単一の自己完結型 HTML ファイル:
すべての名前が一つ:PyPI ディストリビューション、コマンド、インポートパッケージ、そして設定
セクションはすべて sigwood です。Python 3.11 から 3.14 が必要です。3.15 は依存関係スタックが
対応する wheel を提供するまで、インストール時に拒否されます。
推奨されるインストール方法は pipx です。これにより sigwood は独自の
分離された環境に保たれ、PATH に追加されます(また、最近のディストリビューションで素の
pip install が遭遇する externally-managed-environment の拒否を回避できます):
# Debian / Raspberry Pi OS / Ubuntu: sudo apt install pipx
# Fedora: sudo dnf install pipx
# macOS: brew install pipx
pipx ensurepath # once - then reopen your shell
pipx install sigwood
sigwood --help
uv をお使いですか?uv tool install sigwood でも同じことができ、通常の virtualenv でも動作します。オプションの追加機能、アップグレード、sudo pip からの復旧、ディスク上のフットプリントについては、すべてマニュアルに記載されています。