
検出と対応のためのグラフプラットフォーム
Grapl は、インシデントレスポンスエンジニアが構築したグラフベースのSIEMプラットフォームです。
Grapl は企業としての活動を停止しました。そのため、このコードはもはや積極的に開発されていませんが、アーカイブされた状態で利用可能です。
Grapl は、その中核にグラフデータ構造を活用することで、データを効率的にクエリして接続し、複雑な攻撃者の振る舞いを検出のためにモデル化し、疑わしい振る舞いを容易に調査して進行中の侵入の全容を把握できるようにします。
Grapl の詳細な概要については、こちらをお読みください。
基本的に、Grapl は生のログを受け取り、グラフに変換し、それらのグラフをマスターグラフにマージします。その後、攻撃シグネチャの実行をオーケストレーションし、調査を実施するためのツールを提供します。
BSidesLVでの講演やBSides San Franciscoでの講演をご覧いただけます。
Grapl はネイティブで以下のノードをサポートしています:
Grapl はネイティブで以下の入力形式をサポートしてグラフを生成します:
Grapl はプラグインを考慮して開発されています。オペレーターは新しい入力ログ形式や新しいノードタイプを簡単にサポートできます。
Grapl はまだ安定した 1.0 リリースには達しておらず、急速に開発が進んでいるプロジェクトです。軽微なバグや破壊的な変更が発生する可能性があることをご了承ください。
ご質問は、このリポジトリで issue を開くか、Grapl Slack チャンネル(招待はこちらをクリック)にご参加ください。
識別 (Identity)
Sysmon のようなログソースをご存知なら、プロセスに識別子が与えられることが最大の特徴の一つです。Grapl は同じ概念をすべてのサポートされるログタイプに適用し、プロセス ID のような擬似識別子から正規の識別子を識別します。
Grapl はこの識別子の概念をグラフアプローチと組み合わせることで、エンティティとその振る舞いについて容易に推論できるようにします。さらに、この識別子のプロパティにより、Grapl はログからユニークな情報のみを保存するため、データストレージの増加はログ量に対して劣線形になります。
これにより、ストレージコストが削減され、データが数千のログに分散するのではなく、一元化された場所でデータを表示できます。例えば、プロセスの正規識別子を使用すると、ノードを選択するだけでそのプロセスに関するすべての情報を表示できます。
アナライザー (Analyzers) https://grapl.readthedocs.io/en/latest/analyzers/implementing.html
アナライザーは攻撃者のシグネチャです。Python モジュールとして Grapl の S3 バケットにデプロイされ、Grapl のマスターグラフへの変更に応じて実行がオーケストレーションされます。
アナライザーは攻撃の振る舞いに対して二値の「Good」または「Bad」を判定しようとするのではなく、Grapl はリスクの概念を活用し、自動的にリスクを相関付けて環境内で最もリスクの高い部分を表面化します。
アナライザーはマスターグラフが更新されるとリアルタイムに、定数時間の操作で実行されます。Grapl のアナライザーハーネスは自動的にクエリをバッチ処理、並列化、最適化します。定数時間および劣線形操作を活用することで、組織の成長に伴いデータ量が増加しても、クエリが効率的に実行されることを保証します。
Grapl はアナライザーライブラリを提供しており、純粋な Python で攻撃シグネチャを記述できます。例についてはこちらのリポジトリを参照してください。
以下は、svchost.exe の不審な実行を検出する簡単な例です。
class SuspiciousSvchost(Analyzer):
def get_queries(self) -> OneOrMany[ProcessQuery]:
invalid_parents = [
Not("services.exe"),
Not("smss.exe"),
Not("ngentask.exe"),
Not("userinit.exe"),
Not("GoogleUpdate.exe"),
Not("conhost.exe"),
Not("MpCmdRun.exe"),
]
return (
ProcessQuery()
.with_process_name(eq=invalid_parents)
.with_children(
ProcessQuery().with_process_name(eq="svchost.exe")
)
)
def on_response(self, response: ProcessView, output: Any):
output.send(
ExecutionHit(
analyzer_name="Suspicious svchost",
node_view=response,
risk_score=75,
)
)
アナライザーをコードで管理することで、次のことが可能になります:
Grapl のアナライザーデプロイヤープラグインをチェックして、アナライザーを Git リポジトリに保持し、master へのプッシュで自動的にデプロイする方法を確認してください。
エンゲージメント (Engagements)
Grapl はエンゲージメントと呼ばれる調査ツールを提供します。エンゲージメントは、アナライザーが不審と判断したサブグラフを表す、隔離されたグラフです。
AWS Sagemaker がホストする Jupyter Notebook と Grapl が提供する Python ライブラリを使用して、不審なサブグラフを拡張し、攻撃の全容を把握できます。Jupyter Notebook で攻撃範囲を拡大すると、エンゲージメントグラフが更新され、攻撃範囲が視覚的に表示されます。

イベント駆動型で拡張可能
Grapl は拡張性を考慮して構築されています。どのサービスもすべての組織のニーズを満たすことはできません。Grapl のすべてのネイティブサービスはイベントの送受信によって動作するため、Grapl を拡張するにはメッセージの購読を開始するだけで済みます。
これにより、Grapl を既存のサービスに簡単に拡張したり統合したりできます。
Grapl は現在ベータ版のプラグインシステムも提供しており、カスタムノードやクエリ機能を追加してプラットフォームの機能を拡張できます。