検索構文について
このガイドは、SIEM 検索ページのクエリエディタで検索式(データ値、エスケープ、演算子など)を構成するセキュリティ アナリストを対象としています。
Google Security Operations クエリエディタで YARA-L 2.0 または SQL 検索式を作成する場合は、ターゲット UDM フィールドの正確なデータ型に従って、データ値、演算子、文字列エスケープ シーケンスの形式を設定する必要があります。検索条件は、UDM フィールド名、比較演算子(=、!=、>、<、<=、>=)、書式設定されたデータ値で構成されます。
データ型でデータ値を書式設定する
このセクションでは、次のことについて説明します。
列挙値(列挙型)
列挙型は、有効な UDM 辞書定義と完全に一致する大文字のテキスト文字列として記述し、次の例のように二重引用符(")で囲む必要があります。
metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"
ブール値
ブール値フィールドでは、次の例のように true または false を指定できます(大文字と小文字は区別されず、引用符は不要です)。
network.dns.response = true target.user.is_admin = false
整数と数値
整数とポート番号は、次の例のように、二重引用符なしのリテラル数字として記述します。
target.port = 443 network.sent_bytes > 10485760
浮動小数点値と 10 進数値
float 型または double 型の UDM フィールドの場合は、次の例のように、二重引用符で囲まずに 10 進数または整数を入力します。
security_result.about.asset.vulnerabilities.cvss_base_score = 9.8
テキスト文字列
標準のテキスト値は、次の例のように二重引用符(")で囲む必要があります。
metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"
大文字と小文字を区別しないマッチング(nocase)
デフォルトでは、YARA-L 2.0 の文字列比較では大文字と小文字が区別されます。大文字と小文字の任意の組み合わせに一致させるには、次の例のように、条件の末尾に nocase 演算子を直接追加します。
principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase
文字列のエスケープ(\ と ")
文字列リテラルにバックスラッシュまたは二重引用符が含まれている場合は、次の例のように、先頭にバックスラッシュ(\\)を使用してこれらの文字をエスケープする必要があります。
- リテラル バックスラッシュ(
\\)を照合するには、\\を使用します。 リテラル二重引用符(
")に一致させるには、\"を使用します。エスケープされたバックスラッシュを使用して Windows ファイルパスを検索します。
principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"二重引用符が埋め込まれたコマンドラインを検索します。
target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
正規表現(RE2 構文)
正規表現を使用して検索するには、正規表現パターンを二重引用符ではなくスラッシュ(/ /)で囲みます。Google SecOps は標準の RE2 正規表現エンジンを使用します。
次のように、10.x.x.x 範囲内の任意のプリンシパル IP に一致します。
principal.ip = /10\..*/次の例のように、大文字と小文字を区別せずに、オプションの
.exe拡張子を使用して PsExec の実行を検索します。target.process.command_line = /\bpsexec(\.exe)?\b/ nocase次の例のように、番号付きパターンに従って動的 DNS ホスト名を照合します。
principal.hostname = /dns-server-[0-9]+/ nocase
ブール論理と演算子の優先順位
AND、OR、NOT 演算子を使用して、複数の検索条件を組み合わせます。次の例に示すように、かっこ () を使用して式を明示的にグループ化し、評価の優先順位を制御できます。
次の例のように、機密性の高いホストで特定のユーザー ログイン イベントを検索します。
metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"次の例のように、かっこを使用して OR 条件を AND チェーンから分離します。
metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
additional フィールドと labels フィールドで Key-Value ペアを検索する
additional フィールドと labels フィールドは、標準の UDM フィールドにマッピングされないカスタム イベントデータとサードパーティ ベンダー属性の柔軟なコンテナとして機能します。各エントリには Key-Value ペアが格納されます。
additionalfields: イベント(additional.fields["key"] = "value")ごとに複数の Key-Value ペアを含めることができます。labelsfields: イベント(labels["key"] = "value")ごとに 1 つの Key-Value ペアのみを含めることができます。
完全一致の Key-Value(field["key"] = "value")
次の例のように、ブラケット構文を使用して、特定のキーとその対応する文字列値を直接クエリします。
additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"
additional フィールドでの高度な正規表現と文字列以外の値の一致
additional フィールド内の数値/ブール値をクエリする必要がある場合や、正規表現を使用してキーと値を照合する場合は、完全修飾された protobuf フィールドパスを使用します。
正規表現で追加コンテナ内の任意の値文字列を照合します。
additional.fields.value.string_value = /suspicious_payload_.*/ nocaseカスタム フィールド内のブール値または数値と一致させる:
additional.fields.value.bool_value = true additional.fields.value.number_value > 500正規表現接頭辞に一致する複数の動的キーを検索します。
additional.fields.key = /^myKeyNumber_.*/値に関係なくキーが存在するかどうかを確認します。
additional.fields["pod_name"] != ""正規表現と
nocaseを角かっこ構文で直接使用します。additional.fields["pod_name"] = /br/ additional.fields["pod_name"] = bar nocaseANDを使用して複数のadditional.fieldsKey-Value ペアを結合します。additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
グループ化されたフィールドを検索する
グループ化されたフィールドは、関連する UDM フィールドのグループのエイリアスです。グループ化されたフィールドを使用すると、各フィールドを個別に入力することなく、複数の UDM フィールドを同時にクエリできます。
次の例は、指定した IP アドレスを含む可能性がある共通の UDM フィールドを照合するクエリを入力する方法を示しています。
ip = "1.2.3.4"
正規表現と nocase 演算子を使用して、グループ化されたフィールドを照合できます。参照リストもサポートされています。グループ化したフィールドは、次の例で示すように、通常の UDM フィールドと組み合わせて使用することもできます。
ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"
グループ化された UDM フィールドのタイプ
次のグループ化された UDM フィールドをすべて検索できます。
| グループ化されたフィールド名 | 関連付けられている UDM フィールド |
|---|---|
domain |
about.administrative_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.user.windows_sid |
クエリにコメントを追加する
検索エディタ内にコメントを追加して、複雑なハンティング ロジックを文書化したり、テスト中に条件を一時的に無効にしたりできます。
- 単一行コメント: コメント テキストの前に 2 つのスラッシュ(
//)を付けます。その行のスラッシュ以降のすべてのテキストは無視されます。 - 複数行のブロック コメント: コメント テキストを
/*と*/で囲みます。ブロック コメントは複数行にまたがることができます。
例:
metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。