
パッシブDNSキャプチャ・モニタリングツールキット
dnsmonsterのマネージドSaaSソリューションを検討しています! パッシブDNS監視の未来を形作るために、フィードバックと要件を共有してください:簡単なアンケートにご協力ください
目次
Golangで構築されたパッシブDNS監視フレームワーク。
dnsmonsterはDNSトラフィック用のパケットスニファを実装しています。pcapファイル、ライブインターフェース、またはdnstapソケットからトラフィックを受け入れることができ、
一般的なコンピュータ上で毎秒20万件以上のDNSクエリをインデックス化できることが実証されており、毎秒数十万件のDNSクエリをインデックス化・保存するために使用できます。スケーラブルでシンプル、かつ使いやすく、セキュリティチームが企業のDNSトラフィックの詳細を理解するのに役立つことを目的としています。dnsmonsterはDNSの会話を追跡するものではなく、むしろDNSパケットが到着次第インデックス化することを目的としています。また、エンドユーザーのプライバシーを侵害するものではなく、レイヤ3のIP(IPv4およびIPv6)をマスクする機能があり、チームが集計データに対してトレンド分析を行えるようにしつつ、個々のユーザーにクエリを追跡できないようにします。ブログ記事
バージョン1.xより前のコードはベータ品質とみなされ、破壊的変更が発生する可能性があります。各リリース間の破壊的シナリオのリストと、潜在的なデータ損失を軽減する方法については、各タグのリリースノートを参照してください。```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end
subgraph "Process"
C1["Sampling based of ratio"]
C2["Packet Process"]
C3["Dispatcher"]
O11["Output1"]
O12["Domain Skip (optional)"]
O13["Domain Allow (optional)"]
O21["Output2"]
O22["Domain Skip (optional)"]
O23["Domain Allow (optional)"]
O31["Output3"]
O32["Domain Skip (optional)"]
O33["Domain Allow (optional)"]
end
B1 --> Process
B2 --> Process
B3 --> Process
C1 --> C2
C2 --> C3
C3 --> O11
C3 --> O21
C3 --> O31
O11 --> O12 --> O13
O21 --> O22 --> O23
O31 --> O32 --> O33
subgraph Output
Splunk
Syslog
H["ClickHouse"]
Postgres
Kafka
I["JSON File"]
Influx
Elastic
J["stdout"]
Parquet
Sentinel
end
O13 --> H
O23 --> I
O33 --> J
# 主な機能
- Linuxの`afpacket`とゼロコピーパケットキャプチャを使用可能。
- BPFに対応
- プライバシー強化のためIPアドレスをマスク可能
- 前処理サンプリング比率を設定可能
- ストレージへの書き込みを回避するための"スキップ"`fqdn`のリストを保持可能
- 特定のドメインへのアクセスをログに記録するための"許可"ドメインのリストを保持可能
- スキップおよび許可ドメインファイル/URLのホットリロード
- 出力ストリームごとに設定可能なロジックを持つモジュラー出力。
- ClickHouseのTTL属性を使用した自動データ保持ポリシー
- ClickHouse出力用の組み込みGrafanaダッシュボード。
- 単一の静的リンクされたバイナリとして配布可能
- 環境変数、コマンドラインオプション、設定ファイルで設定可能
- ClickHouseのSAMPLE機能を使用した出力のサンプリングが可能
- `prometheus`および`statstd`を使用したメトリクス送信が可能
- ClickHouseの組み込みLZ4ストレージによる高い圧縮率
- DNS Over TCP、フラグメント化DNS(udp/tcp)、IPv6に対応
- UnixソケットまたはTCP経由の[dnstap](https://github.com/dnstap/golang-dnstap)をサポート
- SplunkおよびMicrosoft Sentinelとの組み込みSIEM統合
# インストール
## Linux
`dnsmonster`を使い始める最善の方法は、リリースセクションからバイナリをダウンロードすることです。バイナリは`musl`に対して静的にビルドされているため、多くのディストリビューションでそのまま動作するはずです。`afpacket`をサポートするには、カーネル3.x+を使用する必要があります。最近のLinuxディストリビューション(CentOS/RHEL 7+、Ubuntu 14.0.4.2+、Debian 7+)は3.x+バージョンを搭載しているため、そのまま動作するはずです。ディストリビューションがプリコンパイル版で動作しない場合は、詳細を添えてIssueを送信し、このセクション[手動でビルド](#build-manually)に従って手動でビルドしてください。
### コンテナ
`dnsmonster`はrawパケットキャプチャ機能を使用するため、Docker/Podmanデーモンはコンテナにその機能を付与する必要があります```
sudo docker run --rm -it --net=host --cap-add NET_RAW --cap-add NET_ADMIN --name dnsmonster ghcr.io/mosajjal/dnsmonster:latest --devName lo --stdoutOutputType=1
libpcap を使用する場合:
go、libpcap-devel、linux-headers パッケージがインストールされていることを確認してください。パッケージ名はディストリビューションによって異なる場合があります。その後、リポジトリをクローンして go build ./cmd/dnsmonster を実行するだけです。```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster- `libpcap`なしの場合:
`dnsmonster`は`libpcap`から1つの機能のみを使用します。それは`tcpdump`形式のフィルターをBPFバイトコードに変換することです。BPFサポートなしでも問題ない場合、`libpcap`なしで`dnsmonster`をビルドできます。ただし、他のプラットフォームでは、パケットキャプチャは`libpcap`にフォールバックするため、ハードな依存関係になります(*BSD、Windows、Darwin)```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster -tags nolibpcap ./cmd/dnsmonster
上記のビルドはARMv7(RPi4)およびAArch64でも動作します。
libpcap.aのコピーがあれば、それをdnsmonsterに静的にリンクして、完全に静的なビルドを行うことができます。以下のコードでは、/root/libpcap-1.9.1/libpcap.aをお使いのコピーの場所に変更してください。```
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster/
go get
go build --ldflags "-L /root/libpcap-1.9.1/libpcap.a -linkmode external -extldflags "-I/usr/include/libnl3 -lnl-genl-3 -lnl-3 -static"" -a -o dnsmonster ./cmd/dnsmonster
静的にリンクされたバイナリの作成方法の詳細については、[この](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile) Dockerfile を参照してください。
## Windows
Windows でのビルドは Linux とほぼ同じです。`npcap` がインストールされていることを確認してください。リポジトリをクローンし(`--history 1` が機能します)、`go get` と `go build ./cmd/dnsmonster` を実行します。
前述のとおり、Windows 版のバイナリは [npcap](https://nmap.org/npcap/#download) のインストールに依存しています。インストール後、バイナリはすぐに動作するはずです。Windows 10 環境でテストされ、問題なく実行されました。`--devName` パラメータに指定するインターフェース名を見つけてスニッフィングを開始するには、次の手順を実行する必要があります。
- 管理者として cmd.exe を開き、次のコマンドを実行します: `getmac.exe`。各インターフェースの MAC アドレスと Transport Name 列が表示され、次のような内容になります: `\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
- 次のように `cmd.exe` で `dnsmonster.exe` を実行します:```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
注意点: getmac.exe の \Tcpip を \NPF に変更し、それを dnsmonster.exe に渡す必要があります。
Linux や Windows とほぼ同じです。git、libpcap、go がインストールされていることを確認してから、同じ手順に従ってください:```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster
# アーキテクチャ
## Dockerを使用したオールインワンインストール

このダイアグラムの例では、DNSサーバートラフィックの出口/入口をキャプチャし、その後、オプションのパケット集約レイヤーを追加してからDNSMonsterサーバーに到達します。DNSサーバーから送信されるデータは、DNSフリートのキャッシュおよびパフォーマンス分析に非常に有用です。アグリゲーターが利用できない場合は、両方のTAPを直接DNSMonsterに接続し、2つのDNSMonsterエージェントでトラフィックを監視することもできます。
`./autobuild.sh` を実行すると、複数のコンテナが作成されます:
* 任意のインターフェース上のトラフィックを監視する `dnsmonster` の複数インスタンス。インターフェースリストは `autobuild.sh` の一部としてプロンプト表示されます。
* `dnsmonster` の出力を収集し、すべてのログ/データをデータおよびログディレクトリに保存する `clickhouse` の1インスタンス。両方とも `autobuild.sh` の一部としてプロンプト表示されます。
* プリビルドのダッシュボードで `clickhouse` データを参照する `grafana` の1インスタンス。
### オールインワンデモ
[](static/aio_demo.svg)
## エンタープライズデプロイメント

# 設定