
ネットワークベースのパッシブDNSロガーで、ライブトラフィックまたはpcapファイルからDNSクエリをキャプチャしてログに記録し、SIEMや脅威インテリジェンスプラットフォームと統合するためにJSONを出力します。
Go によるネットワークベースの DNS ログ収集
ネットワークキャプチャに基づく DNS ロガーであり、https://github.com/gamelinux/passivedns に触発されています。gopacket を使用して libpcap とパケット処理を扱います。JSON ログを出力します。高頻度のクエリキャプチャを、1 台から数百台の DNS リゾルバが存在する環境で処理することを目的としています。
それは良い選択です。私がこれを構築した理由は、大量の信頼できないデータと、文書化されていないコーナーケースが多数あるタスクは、メモリ破損タイプの攻撃を防ぐためにマネージドランタイムで処理すべきだと考えるからです。私はいくつかの組織で PassiveDNS を導入してきましたが、gopassivedns を構築したのは、観測したいくつかの具体的な問題点を解決するためです。多くの場所にインストールする必要があったこと、ストレージ層をスケーリングして大量のルックアップを処理する必要があったこと、そして DNS のエッジケースをカバーする十分なテストスイートが欲しかったことです。
これも良い選択です。Bro のようなシステムは通常、ネットワーク出口に配置されますが、その結果、再帰リゾルバの背後に実際のルックアップ元の IP アドレスが隠れてしまいます。つまり、通常は Bro をデプロイし、リゾルバのクエリログを取得し(可能であれば)、それらのログを集中ログシステムに統合して、クライアントまで遡ってルックアップを追跡する必要があります。gopassivedns は、リゾルバの設定変更を必要とせずにリゾルバ上で動作させるように設計されており、またネットワーク出口にも配置でき、信頼性のあるプロトコルで中央にログを出力し、どのログシステムでも簡単に解析できます。
質問と回答の両方を含むクエリログのサポートは、最善でもまちまちです。最も広くデプロイされている DNS サーバの 1 つである BIND は、まったくサポートしていません。Windows DNS のような他のサーバは、非常に扱いにくいログ形式を持っています。さらに、ネットワークベースのログ記録では、クライアントからリモートサーバ(例:Google DNS)に直接送信されたクエリもキャプチャできます。
設定オプションは、環境変数、.env ファイル、またはコマンドラインで指定できます。優先順位は、コマンドラインフラグ、.env ファイル、最後に既に環境に定義されている変数の順です。設定オプションは以下の通りです。
-dev または -pcap のいずれかを指定する必要があります。
goroutine と標準のデーモン化プロセスには既知の問題があるため(https://github.com/golang/go/issues/227)、http://stackoverflow.com/questions/10067295/how-to-start-a-go-program-as-a-daemon-in-ubuntu で説明されている方法のいずれかを使用して、システムツールでこのプロセスをデーモンとして実行することを強くお勧めします。
syslog ログを選択した場合、golang の "log/syslog" を使用します。これには、syslog と通信するための Unix ソケットが /dev/log、/var/run/log、または /var/run/syslog のいずれかに存在する必要があります。
3 つの選択肢があります: リゾルバに導入する、ゲートウェイに導入する、またはその両方です。リゾルバに導入する利点は、元のリクエストを送信したクライアントの IP アドレスを取得できることです。BPF フィルタで上流のレッグを無視しない限り、リクエストの上流レッグ(リゾルバからチェーン内の次のリゾルバへ)も確認できます。ゲートウェイに導入する場合、クライアントから内部リゾルバへのレッグは見えないため、リクエストを特定のクライアントに結びつけるのが難しくなります。その代わり、内部リゾルバをバイパスするリクエストを確認できます。また、リゾルバが使用する上流のリゾルバへのクエリも確認できます。理想的な世界では、このツールを各内部リゾルバとゲートウェイのタップに導入します。内部リゾルバでは、クエリの上流レッグを無視する BPF フィルタを設定し、ゲートウェイでは何も無視しません。
現時点では、logstash を使用してログを elasticsearch クラスタに転送することをお勧めします。すべてのログは JSON 形式なので、これは非常に簡単です。長期保存やバルク分析には HDFS のようなものを使用することも提案します。DNS クエリは内部データの素晴らしい情報源です!