無駄のない脅威インテリジェンス第4部 : バッチアラート
_これは「無駄のない脅威インテリジェンス」シリーズの第4部です。[第1部](https://www.fastly.com/blog/lean-threat-intelligence-part-1-plan)、[第2部](https://www.fastly.com/blog/lean-threat-intelligence-part-2-foundation)、[第3部](https://www.fastly.com/blog/lean-threat-intelligence-part-3-battling-log-absurdity-kafka)はこちら。_
[「無駄のない脅威インテリジェンス」シリーズの第3部](https://www.fastly.com/blog/lean-threat-intelligence-part-3-battling-log-absurdity-kafka)では、Kafka を使用してトピックとの間でメッセージをルーティングするテクノロジーを紹介しました。この設定により、異なるストリームに簡単に接続してテレメトリとログを変更し、Graylog で解析および表示できるようになります。
システム図では、Graylog はログが保存されるエンドポイントにあたります。ログは Kafka クラスターに送信され、ストリームプロセッサーに送信されてから Kafka に戻されるか、または Graylog に直接送信されます。このようにデータが流れている状態でモニタリングとセキュリティイベントへの対応を開始するにはどうすればよいでしょうか。この記事では、Graylog と Kafka で使用できるバッチアラート生成の手法について説明します。
Fastly では、セキュリティイベントへの対応をシステム図の2つの異なるポイント (Graylog の前後) に分割します。「事前」と「事後」のアラートでは、ストリームの処理とバッチアラート生成をそれぞれ行うことができます。バッチ検索はデータベースで CPU を消費します。このデータベースは書き込みを非同期に実行しようとし、ストリーミングがそのコストを継続的に払うことになります。しかし、ストリーム処理では、比較用に状態のスライディングウィンドウを保存するためのオーバーヘッドが必要になる場合があります。
事後アラートの例としては、Graylog における多数の検索の集計が挙げられます。これらは、検索の相関関係内で特定のものを探すためにグループ化および分析されます。事前アラートの例としては、すぐに対処が必要なきわめて特殊なイベントの検索が挙げられます。
詳細については、Graylog のアラートに関するドキュメントを参照してください。1
### カスタムアラーターの作成
インフラストラクチャに Graylog を導入するメリットの1つは、Web サーバーが大量の API エンドポイントに対する軽量なフロントエンドであることです。2 この設計により、ユーザーは Graylog へのカスタム統合を作成し、それらを使用してデータをクエリし、GUI と同じ機能をプログラムから実行できます。いくつかの言語バインディングが存在しますが3, 4、幸いインターフェイスは Swagger 形式であり、エンドポイントのクエリや統合の作成は比較的簡単です。以下に示すように、API ブラウザへのアクセスは Nodes ウィンドウで行われます。2
![1 API ブラウザ](//images.contentful.com/6pk8mg3yh2ee/12AbkDwpo4e0KoW6886c2w/dbecf9056661be0a54b218491af5707d/1_API_Browser.png) ![graylog-endpoints](//images.contentful.com/6pk8mg3yh2ee/14qHucDXe6Y2IQiCA2IKEW/87fe069d42390208bb66e82881f05930/graylog-endpoints.png)
_エンドポイントのリスト_
![search-endpoints-graylog](//images.contentful.com/6pk8mg3yh2ee/7aezhMmqTmW0YwIKkqQs8C/7276f8bf3876ccee2c3db9b5df328dda/search-endpoints-graylog.png)
_search/absolute/end エンドポイントと必須フィールド、HTTP メソッド_
**/search/universal/absolute/terms** からわかるように、Swagger では、想定されるクエリ、データ型、レスポンスで想定される内容が通知されます。これは、クエリとフィールドに基づいてログでカウントを計算するための優れたエンドポイントです。たとえば、フリートに対するすべての SSH エラーをカウントし、ファイアウォールによってブロックされるべきマシンに対するアクセスが行われたかどうかを示すホスト名フィールドをそのエラーから返すクエリを構築できます。別の例としては、直近の5分間におけるすべての DNS トラフィックのクエリを実行し、送信先のホスト名を返すよう Graylog に要求し、いずれかのドメインが脅威インテリジェンスエンドポイントまたは分類子に対する既知の DGA であるかどうかを確認するためにそのリストを反復処理することが挙げられます。
### アラーターの記述
これでログの絶対クエリを実行し、特定のフィールドのカウントを示す用語などを返すことのできるエンドポイントが確保されたため、一連のクエリを構築して Graylog に送信できます。レスポンスをスクリプトに保存して、さらに複雑な分析を行うコードを記述できます。
ここに示す事例には、悪意のあるドメインのルックアップの実行が含まれます。ここでは、Python、「pygraylog」ライブラリ、Bambanek の DGA リストを使用してルックアップを実行します。
ネットワーク全体の DNS トラフィックを記録する Graylog インスタンスがあり、Graylog が認識できる形式 (JSON) で各ルックアップが記録および送信されると仮定します。アクティブな DGA ドメインのグラウンドトゥルースのリストについては、Bambenek の DGA のリスト5 をダウンロードしてください。
wget [http://osint.bambenekconsulting.com/feeds/dga-feed.txt](http://osint.bambenekconsulting.com/feeds/dga-feed.txt)
┌─[zallen@Zacks-MBP]─(~/git/lti4)
└─[15:59]$ ls -lah
total 215864
drwxr-xr-x 3 zallen staff 102B Sep 20 15:59 ./
drwxr-xr-x 98 zallen staff 3.3K Sep 20 15:59 ../
-rw-r--r-- 1 zallen staff 105M Sep 19 20:15 dga-feed.txt
「pygraylog」を「requirements.txt」に追加し、「virtualenv」にドロップしてインストールします。
echo "pygraylog" >> requirements.txt;virtualenv env; .env/bin/activate; pip install -r requirements.txt
次に、Graylog の HTTP GELF 入力6 を開始し、POST 経由で Graylog サーバーにアラートを送信できます。すべての準備が整うと、Python ライブラリがインストールされ、仮想環境が稼働し、HTTP 入力によってアラートが Graylog に送信されます。次に Python gist は、直近の5分間に DNS によって照会されたホスト名のクエリを Graylog サーバーに対して実行します。続いて、これらの用語をレスポンスからプルし、Bambanek の DGA リストと比較します。一致するものが見つかった場合は、アラートオブジェクトが作成され、Graylog の POST 入力に対するアラートが実行されます。
ここでは、[gist:b5ca9ca75fc788dbd340384c1ac8e022] という gist にあるソースコードを使用します。
「lines 5-6」の先頭にユーザーのクレデンシャルと Graylog のクレデンシャルを入力します。
次に、「python logger.py」を使用してスクリプトを実行します。これにより、「build_data_dict」関数を使用して DGA リストがダウンロードされ、Graylog の時間クエリに基づいて直近5分のウィンドウが計算され、「search_graylog()」を呼び出して Graylog が検索されます。もちろん、DGA リストをキャッシュしてダウンロードを1日1回にすることで、この処理を改善できます。
サンプルのフィクスチャが必要な場合は、「lines 32-38」からフィクスチャをコメントアウトします。これにより、サーバーに対してクエリを実行せずにアラートが作成されます。
次に、「Lines 79-81」で「results」、時間の文字列、以前に作成した「data_dict」への参照を含むアラート作成関数が呼び出されます。46行目では、DGA「data_dict」内に「term」(別名「hostname」) が見つかった場合、一部のメタデータを含むアラートフィクスチャが作成され、リストに追加されます。そのリストが返されると、使用可能なアラートがあるかどうかを示すロジックが含まれています。その場合は、「send_to_graylog」が呼び出され、Graylog の POST 入力にメッセージが表示されます。このようなメッセージはアラート可能なイベントであることが分かっているため、その入力に追加されるメッセージに関するアラートを生成するように Graylog を設定できます。キーをチェックするルールを作成すると、ストリーム処理の際に CPU の電力を節約できます。また、経時的なアラートの追跡に役立つダッシュボードを作成することもできます。
### まとめ
Fastly では、上記のような Python スクリプトを採用しています。パイプラインにはアラート作成のシナリオが2つあります。上記は、データを集計する検索に対してお客様のチームでアラートを作成しなければならないシナリオを示しています。Graylog には、集計型のアラート作成を支援するプラグイン7 が用意されていますが、データをグループ化する複数の検索を実行しなければならない場合、このプラグインは役立ちません。上記のシナリオは Python を使用しているため、複雑なアラート作成のシナリオを Web インターフェイスではなくコードで表すことができます。また、テスト、リビジョン管理、アラート作成パイプラインとの継続的インテグレーションを行うこともできます。
_セキュリティイベントの処理の詳細については、11月1日にニューヨークで開催された O’Reilly のセキュリティカンファレンスにおける Fastly の Maarten Van Horenbeeck、Lisa Phillips、Tom Daly の講演「[Incident command: the far side of the edge](http://conferences.oreilly.com/security/network-data-security-ny/public/schedule/detail/53214)」をご覧ください。_
* * *
参照リンク
1 http://docs.graylog.org/en/2.1/pages/getting_started/stream_alerts.html
2 https://www.graylog.org/blog/8-tips-tricks-2-using-the-graylog-rest-api
3 https://www.npmjs.com/package/graylog-api
4 https://pypi.python.org/pypi/bonfire/0.0.6
5 http://osint.bambenekconsulting.com/feeds/dga-feed.txt
6 http://docs.graylog.org/en/2.1/pages/sending_data.html#gelf-via-http
7 https://github.com/cvtienhoven/graylog-plugin-aggregates