スタートガイド: SecOps での YARA-L 2.0
YARA-L 2.0 は、Google Security Operations の検索、ダッシュボード、ルールベースの脅威検出を強化する、独自の高度に構造化されたクエリ言語です。このドキュメントでは、YARA-L のコア構造について説明し、脅威を調査するセキュリティ アナリストや、堅牢な新しいロジックを構築する検出エンジニアが YARA-L を使用するための実践的な手順を紹介します。
このドキュメントでは、YARA-L とその構文について説明し、基本的なフィルタ クエリから複雑なパターンを検索するルールまで、あらゆるものを表現する方法を示します。YARA-L クエリのセクションを使用して、集計関数、条件ロジックをサポートし、結合やパターン マッチングなどでコンテキストを追加します。
始める前に
- Google SecOps プラットフォームにアクセスできることを確認します。
- テストルールを使用してデータの取り込みを検証します。
- セキュリティのコンセプトとログデータに関する基本的な知識が必要です。
- このドキュメントでは、データが Google SecOps インスタンスに取り込まれ、統合データモデル(UDM)に正規化されていることを前提としています。
- クエリの移行を迅速に行うには、SPL から YARA-L 2.0 への移行ガイドをご覧ください。このガイドでは、
stats、eval、lookupなどの一般的な SPL コマンドを YARA-L のoutcomes条件とmatch条件に変換しています。
YARA-L の構造を理解する
すべての YARA-L クエリは、クエリの動作を決定する、名前付きの個別の セクションに分割されます。
この構造により、多段階の分析と相関関係の分析が可能になります。
| 注文 | セクション | ルール | 検索/ダッシュボード | 説明 |
|---|---|---|---|---|
| 1 | meta |
必須 | 省略可 | 作成者、説明、重大度など、ルールの説明メタデータを設定します。例: 作成者(security team)、説明(Detects multiple failed user logins within 10-minute windows)、重大度(High)。meta セクションの構文をご覧ください。 |
| 2 | events |
必須 | 必須 | 追跡する必要があるイベント(ユーザー ログイン、ユーザー ログインの失敗(イベント変数))、ユーザー マッチ変数(プレースホルダ変数)へのリンクを定義してフィルタします。考慮するすべてのデータソース(主にイベント)を宣言し、UDM フィールドを使用してフィルタします。events セクションの構文をご覧ください。 |
| 3 | match |
必須 | 省略可 | イベントでグループ化し、サポートされている時間枠(by 5m など)を指定できます。集計が行われる統計検索では、場合によっては必須です。マルチイベント相関クエリに必要です。ルールの match では時間の指定が必要ですが、検索とダッシュボードでは省略可能です。match セクションの構文をご覧ください。注: match セクションを除外すると、ルールは単一のイベントと照合できます。 |
| 4 | outcome |
省略可 | 省略可 | 重要な指標を計算し、分析情報(count()、avg() など)を取得します。outcome セクションの構文をご覧ください。 |
| 5 | condition |
必須 | 省略可 | 結果を返す(検索)か、アラートをトリガーする(ルール)ために満たす必要があるロジックを定義します。クエリ変数の条件を評価して、結果が適用されるかどうかを判断します($event >5 など)。condition セクションの構文をご覧ください。 |
| 6 | options |
省略可 | 省略可 | 特定のルールの動作を有効または無効にできます。options セクションの構文をご覧ください。 |
| 7 | dedup |
なし | 省略可 | キー変数またはイベントパス(target.user.userid、target.ip、principal.hostname など)または変数($host、$user など)に基づいてイベントをグループ化して、重複するイベントを削除します。イベント変数と、検索とダッシュボードで重複排除を使用する方法について詳しくは、こちらをご覧ください。 |
| 8 | order |
なし | 省略可 | 特定のフィールド(asc など)で定義された結果を並べ替えます。イベント変数の詳細をご覧ください。省略可(match が使用されている場合にのみ適用されます)。 |
| 9 | limit |
なし | 省略可 | クエリから返されるイベントの最大数を制限します。 |
| 10 | select |
なし | 省略可 | クエリ結果に含める UDM フィールドのリストを指定します。 |
| 11 | unselect |
なし | 省略可 | クエリ結果から除外する UDM フィールドのリストを指定します。 |
YARA-L データソースの可用性
YARA-L は、プラットフォームの場所に応じて、さまざまなデータソースにアクセスできます。イベント、エンティティ(ECG)、データテーブルは、検索、ダッシュボード、ルールで完全に利用できます。サンプルクエリの詳細については、サポートされているデータソースをご覧ください。
次の表に、YARA-L で使用できる機能を示します。
| 機能 | 利用可能 |
|---|---|
| ケースとケース履歴 | ダッシュボード |
| データテーブル | 検索、ダッシュボード、ルール |
| エンティティ(ECG) | 検索、ダッシュボード、ルール |
| 取り込み指標 | ダッシュボード |
| IoC の一致 | ダッシュボード |
| ルールの検出 | ダッシュボード、ルール |
| ルールセット | ダッシュボード |
| イベント | 検索、ダッシュボード、ルール |
| UEBA 指標 | 検索、ダッシュボード |
最初の YARA-L 検索を作成する
Google SecOps のすべてのデータは、目標に応じて、フィルタ検索と統計検索(集計)の 2 つの主要な方法で検索されます。
フィルタ検索(イベント フィルタリング)
フィルタ検索 メソッドを使用すると、統計集計のオーバーヘッドなしで、広範なテレメトリー ストリームから特定のイベントを分離できます。このメソッドでは、条件を使用して、ログやネットワーク トラフィックなどの大量のセキュリティ データを絞り込み、ターゲットとする結果セットに絞り込みます。ロジックでは、events セクションでイベントを指定するだけで済みます。
最初の YARA-L フィルタ検索を作成するには、次の手順でログインに失敗したユーザーを検索します。
- Google SecOps で、[検索] ページに移動します。
-
ログイン イベントをフィルタします。
metadata.event_type = "USER_LOGIN"
ヒント: 検索で
events:セクション ヘッダーを省略できます。デフォルトでは、検索構文はこのセクションを意味します。 - 空の
useridを持たないユーザーからのログイン失敗のeventアクションを追加します。metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" - この検索を実行して結果を確認します。
プレースホルダ変数を使用する
プレースホルダ変数 を使用して、ユーザー名や IP アドレスなど、イベントから特定の値を抽出します。これらの変数は一時的なアンカーとして機能し、さまざまなイベント間でデータを比較したり、最終出力にこれらの値を表示したりできます。
プレースホルダ変数を適用して、次の操作を行います。
- データのブリッジ:
$useridや$ipなどのプレースホルダを使用して、さまざまなイベント変数間の一致を検索します(たとえば、$useridを使用して、ログイン イベントとログアウト イベント間でユーザー ID をリンクできます)。 - 結果をグループ化する:
matchセクションで、プレースホルダ変数を使用して、クエリ出力のウィンドウ(match: $userid over 1hなど)を定義します。 - 結果を作成する: プレースホルダを使用して、クエリ出力で特定のデータポイントをキャプチャして表示します。
たとえば、$user = principal.user.userid を割り当てると、$user 変数にはイベントから抽出された特定の値が格納されます。次に、match セクションで $user を使用して、その特定のユーザーに関連するすべてのアクティビティをグループ化します。
統計検索(集計)
統計検索 メソッドを使用すると、イベントのセット全体で計算を実行して、分析情報、傾向、異常を取得できます。 個々のログのリストを返すのではなく、データの集計された概要を提供します。このロジックでは、match セクション(グループ化用)と outcome セクション(計算用)を使用します。outcome セクションでは、集計関数がサポートされています。たとえば、count()、sum()、avg()、max()、min()、stddev() などです。
次の例では、次のクエリ ロジックを使用します。
events: ログイン試行の失敗に関する未加工データをフィルタします。match: グループ化イベント(userid別)を定義します。outcome: 統計集計 (ユーザーあたりのイベント数)を実行します。
例: outcome 関数を使用してログイン失敗アクティビティを集計する
次の例では、outcome セクションの集計関数(count() や sum() など)を使用して、ログイン失敗アクティビティを要約します。
matchセクションを使用して、ログイン失敗イベントをuseridでグループ化します。metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.useridoutcome変数で定義された、ユーザーごとのログイン失敗数($failed_login_count)のcountを使用します。metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.$user.userid outcome: $failed_login_count = count(metadata.id)この検索を実行して結果を確認します。
省略可:
matchセクションに時間の要素(この場合はday)を追加します。次に、outcome変数をより明示的に更新します($daily_failed_login_count)。metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" $user = principal.user.userid match: $user by day outcome: $daily_failed_login_count = count(metadata.id)
検索からダッシュボード ウィジェットを作成する
最初の検索を作成するの例に示すように、集計された検索からダッシュボード ウィジェットを作成できます。
検索が検証されたら、次の手順でウィジェットとして保存してダッシュボードに追加できます。
- 結果が表示されたら、[可視化] タブ > [ダッシュボードに追加] をクリックします。
- ウィジェットを構成します。
- ウィジェットに名前を付けます(例:
"Daily Failed Login")。 - 期間を選択します。
- 既存のダッシュボード に追加するか、新しいダッシュボード に追加するかを選択します。
- [追加] をクリックします。
- ウィジェットに名前を付けます(例:
- 省略可: ダッシュボードに直接クエリを作成します。または、キュレーションされたダッシュボードをコピーし、その中のクエリを編集して開始することもできます。
- 省略可: カスタム ダッシュボードを作成し、YARA-L を使用してウィジェットを追加できます。詳細については、カスタム ダッシュボードを作成するをご覧ください。
ダッシュボードを構成する
新しいダッシュボードを作成する場合、events セクションは必須の開始点です。そこから、match(結果のグループ化)または outcome(出力と集計の計算)を柔軟に使用できます。
たとえば、events セクションと match セクションを含むダッシュボードを作成できます。このダッシュボードでは、by hour バケットにグループ化された検出の重大度($severity)が表示されます。
例: 重大度で時系列を集計する
eventsセクションとmatchセクションを使用してダッシュボードを作成し、hourバケットにグループ化された検出の重大度($severity)を表示できます。detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour
例: 重大な影響の合計を集計する
同様に、
eventsセクションとoutcomeセクションを使用してダッシュボードを作成し、重大度の高い検出を追跡できます。detection.detection.severity = "CRITICAL" $severity = detection.detection.severity outcome: $detection_count = count_distinct($severity)
例: 重大度別の検出量を経時的に可視化する
次の例では、重大な検出数をカウントし、コンソールで期間を指定できます。多くの場合、ダッシュボードで可視化を作成する場合は、
matchセクションとoutcomeセクションの両方を使用します。detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour outcome: $detection_count = count_distinct(detection.id)
例: ユーザー ログイン頻度を計算する
次の例では、
matchセクションとoutcomeセクションを使用して、特定のユーザーのlogin_countを計算することに重点を置いています。events: metadata.event_type = "USER_LOGIN" match: target.user.userid outcome: $login_count = count(metadata.id)
ルールを作成する
ルールには次のセクションが必要です。
meta: ルール名と説明の詳細が含まれます。events: イベント変数を使用してデータソースとフィルタを定義します。condition: ルールをトリガーするために存在する必要があるイベント変数を指定します。
イベント変数を定義して使用する
イベント変数は論理コンテナとして機能し、フィルタをグループ化して、検索、ルール、ダッシュボード全体でその特定のアクティビティを参照できるようにします。
events セクションでロジックを定義する場合は、イベント変数($e など)を使用して、条件に一致する特定のイベント(またはイベントのグループ)を表すことができます。
例: イベント変数を定義してフィルタする
イベント変数(
$eなど)を定義するには、クエリのeventsセクションで接頭辞を使用します。これにより、これらのイベントが変数で表されることが宣言されます。たとえば、式$e.principal.hostname = "dev"は、ホスト名が完全に一致するかどうかを判断するために各イベントを評価します。$e.principal.hostname = "dev" $e.metadata.event_type = "USER_LOGIN"
次に、クエリの他のセクションでその変数を使用して、特定のイベント グループ(match、outcome、condition セクション)とそのデータフィールドを参照できます。
ルールの構造と構文を整理する
次のルールの構造と構文を使用して、変数、グループ化ロジック、トリガーのしきい値を定義します。
| 要素 | 説明 | 例 |
|---|---|---|
| ルールの構造 | クエリを rule ブロックでラップし、検出を識別するための一意の名前を割り当てます。 |
rule DailyFailedLoginAttempts { } |
meta セクション |
必須。ルールの管理を改善し、チームにコンテキストを提供するために、説明メタデータ(`author`、`description`、`severity` など)を含めます。ルールの管理のベスト プラクティスとして推奨されます。 | author = "Alex"severity = "Medium" |
| イベント変数 | ルールクエリでは、events セクションの各フィールドにイベント変数($e など)が接頭辞として付加され、条件に一致する特定のイベント(またはイベントのグループ)を表します。これらはフィルタの論理グループ として機能します。「検索を YARA-L ルールに変換する」の例では、 $e はユーザーのログイン失敗をすべて表します。 |
$e.metadata.event_type = "USER_LOGIN" |
| プレースホルダ変数 | クエリで後から参照できる共通名にイベントを割り当てます。詳細については、プレースホルダ変数を使用するをご覧ください。 | $userid = $e.principal.user.userid |
match セクション |
グループ化を定義し、サポートされている時間枠を指定します。検索を YARA-L ルールに変換するの例では、match: $userid over day グループ化により、24 時間(1d)以内のユーザー ID 別にイベントが正しくグループ化されます。ルールを作成する場合は、サポートされている時間枠を指定して、ルックバック期間を定義する必要があります。ロジックの要件に応じて、ホップ ウィンドウ、スライディング ウィンドウ、または タンブリング ウィンドウを実装できます。 over 演算子を明示的に使用すると、ホップ ウィンドウが作成されます。 |
$userid over 1d |
outcome セクション |
統計集計を実行するか、特定の変数をキャプチャして、結果のアラートをより有益なものにします。$e.metadata.id で count() 関数を使用して、各 match グループ内のイベントを集計します。$userid などの変数を割り当てて、特定の UDM フィールドをキャプチャし、検出出力の結果にコンテキストを追加することもできます。 |
$failed_count = count($e.metadata.id) |
condition セクション |
ルールで検出 を生成するために必要です。condition セクションで検出のしきい値を定義します。たとえば、#e > 5 を使用すると、アラートをトリガーするにはイベント数が 5 を超える必要があります。5計算を実行しない場合でも、condition セクションが必要で、イベント変数の存在(#e など)を指定する必要があります。環境のベースラインを分析して、誤検出を最小限に抑えながら不審なアクティビティを検出するしきい値を設定します。計算を実行しない場合でも、 condition セクションが必要で、イベント変数の存在(#e など)を指定する必要があります。 |
#e > 5 または $e |
この構造の仕組みについては、次の例をご覧ください。
例: ブルート フォース(ログイン失敗の繰り返し)を検出する
次の例では、24 時間以内に 1 人のユーザーによるログイン試行が複数回失敗した場合に検出します。
rule DailyFailedLoginAttempts { meta: author = "Alex" description = "Detects multiple failed login attempts for a single user within a day." severity = "Medium" events: $e.metadata.event_type = "USER_LOGIN" $e.security_result.action = "FAIL" $e.principal.user.userid != "" $userid = $e.principal.user.userid match: $userid over 1d outcome: $daily_failed_login_count = count($e.metadata.id) condition: $daily_failed_login_count > 5 }
検索を YARA-L ルールに変換する
完了した検索クエリを検出を生成するための信頼性の高いルールに変換するには、通常、次の手順を行います。
- Google SecOps で、ルールエディタ に移動します。
- 新しいルールを開始します。
- 検索クエリを貼り付けて、ルールの構造に合わせて変更します。
metaセクション: ルール名、作成者、重大度レベルなど、メタデータ ルールを定義します。eventセクション: 必須。検索とは異なり、名前付きのeventセクション ヘッダーが必要です。- イベント変数: ロジック内で特定のイベント(またはイベントのグループ)を宣言して参照します。
matchセクションと サポートされている時間枠: グループ化キーを指定し、時間パラメータ(5mや1dなど)を定義します。注: ルールでmatchセクションを使用する場合は、時間枠を追加する必要があります。conditionセクション: ルールをトリガーするために満たす必要がある最終的なロジックまたはしきい値を定義します。
上級: マルチイベント ルールを作成する
マルチイベント ルールを使用して、特定の対象の期間内に発生するさまざまなタイプのアクティビティを関連付けます。単一のイベントを確認するのではなく、ユーザーがログインしてすぐに異常なファイルをダウンロードするなど、複数のイベントを接続して複雑な脅威を特定します。
マルチイベント ルールには次のセクションが必要です。
meta: ルール名と説明の詳細が含まれます。events: イベント変数を使用してデータソースとフィルタを定義します。match: 時間枠と、イベントのブリッジに使用するプレースホルダ変数を設定します。outcome: アラートの追加コンテキストをキャプチャします。マルチイベント ルールには集計関数が必要です。condition: ルールをトリガーするために存在する必要があるイベント変数を指定します。
マルチイベント ルールを作成する手順は次のとおりです。
- イベント変数を定義する: events セクションで、
$e1を定義して"PROCESS_LAUNCH"イベントをキャプチャし、$e2を定義して特定の悪意のあるファイル ハッシュをキャプチャします。 - プレースホルダと関連付ける:
$userプレースホルダ変数を使用して、共通のプリンシパル ユーザー ID でこれら 2 つの異なるイベント ストリームを接続します(例:$user = $e1.principal.user.userid and $user = $e2.principal.user.userid)。 - 一致をグループ化する:
matchセクションで、これらのイベントが同じ$userに対して、設定された時間枠(5 分(5m)など)内に発生する必要があることを指定します。
例: マルチイベント ルールを作成する
次の例では、
$e1はPROCESS_LAUNCHイベントを表し、$e2は特定の悪意のあるハッシュを持つイベントを表します。$userプレースホルダ変数は、同じプリンシパル ユーザー ID でこれらのイベントを関連付けます。rule MultiEventExample { meta: author = "Alex" description = "Detects a bad hash execution or a process launch from a specific IP for the same user." events: $e1.principal.ip = "1.1.1.1" $e1.metadata.event_type = "PROCESS_LAUNCH" $e2.target.file.sha256 = "badhash..." $user = $e1.principal.user.userid $user = $e2.principal.user.userid match: $user over 5m condition: $e1 or $e2 }
次のルール コンポーネントは、この例で使用されているロジックを示しています。
- イベント変数: 2 つのイベント変数
$e1と$e2を定義しました。プレースホルダ変数$userを使用して、共通のuseridフィールドでこれらのイベントを結合しました。 matchセクション: このマルチイベント ルールにmatchセクションを含めて、ユーザーでグループ化し、イベントを関連付けるために ホップ時間枠を 5 分(5m)に指定しました。conditionセクション: アラートをトリガーするロジックを定義しました。この例では、最初のイベントまたは 2 番目のイベントが存在する場合にアラートをトリガーします。
他のツールを使用してクエリを作成する
これらのツールは、YARA-L の作成、検証、導入を迅速に行うために不可欠です。
- UDM Lookup ツール: UI 内で UDM フィールド名、定義、データ型をすばやく検索して参照できます。フィールド ID が不明な場合は、このリファレンスを優先的に確認してください。
- 自然言語から YARA-L への検索: 検索バーに説明を入力して、最初のクエリを作成したり、対応する YARA-L の候補を取得または翻訳したりします。
- SPL → YARA-L 変換ツール(Labs ツール): 競合他社のプラットフォームから移行する場合は、このツール([Labs] セクションで利用可能)を使用して、従来の Splunk SPL クエリを YARA-L に変換します。これにより、構造化された開始点が生成され、移行が迅速化され、検出ロジックが改善されます。Labs ツールを使用するには、Google SecOps で yourinstancename.chronicle.security/labs に移動します。
次のステップ
- YARA-L 2.0 の完全な構文を確認する
- YARA-L 2.0 の関数を参照する
- 例については、次のリソースをご覧ください。
- 例: YARA-L 2.0 クエリ
- Google SecOps コミュニティ
- 次の YARA-L リソースの詳細を確認する。
さらにサポートが必要な場合コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。