データテーブルを使用する
データテーブルは、ユーザーが独自のデータを Google Security Operations に入力できる、複数列のデータ構造です。データテーブルは、定義済みの列と行にあるデータによってルックアップ テーブルとして機能することができます。Google SecOps ウェブ インターフェース、データテーブル API、または YARA-L 2.0 の概要クエリを使用して、Google SecOps アカウントにデータテーブルを作成またはインポートできます。
データ RBAC を使用してデータテーブルにスコープを割り当てる
データテーブルを使用するには、データ ロールベース アクセス制御(データ RBAC)を使用して、データテーブルにスコープを割り当てる必要があります。データテーブルにスコープを割り当てることで、どのユーザーとリソースがデータテーブルにアクセスして利用できるかを制御できます。詳細については、データテーブルのデータ RBAC を構成するをご覧ください。
Google SecOps ウェブ インターフェースを使用してデータテーブルを管理する
以降のセクションでは、ウェブ インターフェースを使用してデータテーブルにアクセスする方法、新しいデータテーブルを追加して内容を編集する方法、行を追加する方法、アカウントからデータテーブルを削除する方法など、データテーブルを管理する方法について説明します。
データテーブルにアクセスする
[データテーブル] ページにアクセスするには、次の操作を行います。
- サイドバーで、[調査] > [データテーブル] を選択します。
特定のデータテーブルを検索するには、[データテーブル] サイドバーの上部にある [検索] フィールドに名前を入力します。
新しいデータテーブルを追加する
新しいデータテーブルを追加する際に、CSV データを手動で入力したり、CSV データを貼り付けたり、CSV ファイルまたは TSV ファイルをデータテーブルにインポートしたりできます。
次の構成は永続的であり、新しいデータテーブルの保存後に変更することはできません。
Google SecOps に新しいデータテーブルを追加する手順は次のとおりです。
サイドバーで、[調査] > [データテーブル] を選択します。
[データテーブル] サイドバーの上部にある [作成] をクリックします。
[新しいデータテーブルを作成] ダイアログで、テーブルに名前を付け、必要に応じて説明を追加します。
次のいずれかを行います。
- CSV データを手動で入力するか、[テキスト](編集モード)領域に CSV データを貼り付けます。
- CSV ファイルまたは TSV ファイルからデータテーブルにデータをインポートするには、次の操作を行います。
- [ファイルのインポート] をクリックします。
- ファイルに移動して [開く] をクリックします。[ファイルをインポート] ダイアログが開きます。
- 前の手順で TSV ファイルを選択した場合は、次の操作を行います。
- [区切り文字の種類] リストから [自動検出] または [タブ] を選択します。
- [次の行でインポートを開始] リストで、データのインポート元となるファイルの行を指定します。
- [データをインポート] をクリックします。
[表] 編集モードを選択し、必要に応じて次のように構成します。
[保存] をクリックします。新しいデータテーブルが [データテーブル] サイドバーに表示され、追加のデータを受け入れる準備が整います。
データ型をデータテーブルの列にマッピングする
新しいデータテーブルを追加するときに、データ型(文字列、正規表現、CIDR、数値)をデータテーブルの列にマッピングできます。
次のとおりウェブ インターフェースまたは API を使用して、単一のデータ フィールドを 1 つのデータ列にマッピングし、同じデータ フィールドを繰り返し 1 つのデータ列にマッピングできます。
ウェブ インターフェースと API の両方で、データフィールドの値をパイプ(
|)で区切ります。ウェブ インターフェースでは、値にパイプ(|)が含まれている場合、デフォルトで繰り返し値として扱われます。API リクエストの場合は、
repeated_valuesをtrueに設定します。
詳細については、繰り返しフィールドをご覧ください。
次の例では、データテーブルの列 Field_value に複数のフィールドの値が含まれています。
| Field_value | Field_name |
| altostrat.com | FQDN |
| 192.0.2.135 | IP |
| charlie | userid |
| example | hostname |
上のテーブルは 4 つの列に分割されており、各列をこのドキュメントで説明するデータテーブルのユースケースで使用するには、1 つのフィールド タイプにのみマッピングします。
| FQDN | IP | Userid | Hostname |
| altostrat.com | 192.0.2.135 | charlie | example |
| … | … | … | … |
キー列を指定する
新しいデータテーブルを追加するときに、特定の列をキー列として指定できます。
列をキー列としてマークすると、その列の値が一意に識別され、データの重複防止や、ルールと検索のためのデータ検出の改善につながります。
繰り返しフィールドに対応する列を指定する
新しいデータテーブルを追加する際に、繰り返しフィールドに対応する特定の列を指定できます。
複数値フィールドまたは繰り返しフィールドを格納する列は、データテーブルの作成時に明示的に repeated として指定する必要があります。
列名をエンティティ フィールドにマッピングする(省略可)
新しいデータテーブルを追加するときに、データテーブルの列名をエンティティ フィールドにマッピングできます。
次のサンプルデータ テーブルでは、Userid 列と Role 列がそれぞれ entity.user.userid と entity.user.attribute.role.name にマッピングされています。
| Userid
(entity.user.userid にマッピング) |
Role
(entity.user.attribute.role.name にマッピング) |
|
| jack | jack123@gmail.com | administrator |
| tony | tony123@gmail.com | engineer |
DataTable リソースの mapped_column_path フィールドを使用して、データテーブルの列をエンティティ proto フィールドにマッピングできます。
この例のテーブルの Email など、エンティティ パスが定義されていない列については、データ型を手動で指定する必要があります。参照リストと同様に、データテーブルで対応しているデータ型は number、string、regex、cidr です。
join 条件を指定することで、マッピングされた列とマッピングされていない列の両方をデータテーブルに含めることができます。
マッピングされていない列は、テーブルの結合先であるエンティティの additional フィールドに保存されます。これらは Key-Value ペアとして追加されます。ここで、key は列名、value は対応する行の値です。
データテーブルに新しい行を追加する
新しい行を追加する手順は次のとおりです。
- [詳細] タブで、[テーブル] 編集モードを選択します。
- 既存の行を右クリックして、[Add row above] を選択します。
- 新しい行のデータを入力します。最初の行はテーブル ヘッダーとして扱われます。各データ項目を適切なデータ列とデータ型に一致させてください。
- [保存] をクリックします。
データテーブルの行を編集する
行を編集する手順は次のとおりです。
- 変更するフィールドをクリックします。フィールドが編集可能になります。
- ファイルを変更すると、
- [保存] をクリックします。
データテーブルの行を検索する
ウェブ インターフェースを使用して、データテーブル内の特定の情報を検索できます。[詳細] タブで、検索フィールドに検索文字列を入力し、[検索] をクリックします。検索文字列を含む行が表示されます。
テーブル行の TTL を管理する
テーブル行の有効期間(TTL)値を管理する手順は次のとおりです。
[TTL を列ごとに表示] をクリックします。TTL 列が表示され、各行が期限切れかどうかを示します。有効期限が切れていない場合は、有効期限までの残り時間が表示されます。
[デフォルトの行の有効期限] をクリックして [デフォルトの行の有効期限を更新する] ダイアログを表示し、テーブル行の TTL を調整します。
[時間] または [日] に新しい TTL 値を入力します。最小値は 24 時間です。最大値は 365 日です。
[保存] をクリックします。
テーブルの行を削除する
行を削除するには、行を右クリックして [行を削除] を選択します。
複数の行を削除するには、削除する各行を選択します。次に、選択した行のいずれかを右クリックして、行を削除] を選択します。
データテーブルを削除する
データテーブルを削除する手順は次のとおりです。
サイドバーの [データテーブル] リストからデータ表を選択します。
[削除] をクリックします。
Chronicle API を使用してデータテーブルを管理する
Chronicle API で使用可能な REST リソースを使用して、Google SecOps のデータテーブルを管理することもできます。この API は、ウェブ インターフェースで使用できるすべての機能を複製できます。また、データテーブルをより高いパフォーマンスとより大きなスケールで管理できる追加機能も含まれています。
データテーブルの REST リソースは次のとおりです。
例: フィルタ構文
次の Chronicle API の例は、filter 構文を使用してデータテーブルの行で google.com を検索する方法を示しています。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://staging-chronicle.sandbox.googleapis.com/v1alpha/projects/{$PROJECT}/locations/${REGION}/instances/${INSTANCE}/dataTables/${DATA_TABLE_NAME}/dataTableRows?filter=google.com"
Google SecOps でデータテーブルを使用する
データテーブルを Google SecOps インスタンスに追加すると、YARA-L クエリを使用してデータテーブルをフィルタリング、強化、拡充できます。このドキュメントには、Google SecOps に組み込むことができる YARA-L 構文の例が多数含まれています。
データテーブルは、検索とルールの両方で YARA-L クエリと組み合わせて使用できます。
データテーブルの使用方法は次のとおりです。
データテーブルを使用して UDM イベントデータまたは UDM エンティティ データをフィルタする
データテーブルのエントリと比較することで、UDM テレメトリー イベントと UDM エンティティをフィルタできます。
-
データテーブルを複数列の参照リストとして使用できます。参照リストは 1 つのディメンションのデータにアクセスできますが、データテーブルでは複数のディメンションのデータにアクセスして、データをフィルタできます。
-
行ベースの比較に等価(
=)演算子を使用すると、UDM イベントをデータテーブルにリンクできます。この比較を使用すると、データをフィルタできます。行ベースの比較は、ステートメント内のすべての条件がデータテーブルの 1 つの行と一致する場合にのみtrueと評価されます。
データテーブルを使用して UDM イベントデータと UDM エンティティ データをフィルタする
データテーブルのエントリと比較して、UDM イベントと UDM エンティティをフィルタできます。行ベースまたは列ベースの比較を使用して、データテーブルを UDM イベントまたは UDM エンティティに結合します。
データテーブルの行ベースと列ベースの比較
| 比較タイプ | キーロジック | 一般的な演算子 | 構文の例 | 使用する状況 |
|---|---|---|---|---|
| 行ベース | すべての条件が同じ行で一致している必要があります | =、!=、>、>=、<、<= |
$e.field = %table.col_a |
同じ行にある複数の列値間の関係が重要である場合。 |
| 列ベース | 値が列内のどこかに存在している必要がある | IN、IN regex、IN cidr |
$e.field IN %table.col_b |
単一の列の値のセット内に値が存在するかどうかを確認する場合。 |
行ベースまたは列ベースの比較方法を使用して、UDM イベントをデータテーブルにリンクします。
UDM イベントをデータテーブルにリンクする行ベースの比較
行ベースの比較を使用して UDM イベントをデータテーブルにリンクするには、等価演算子(
=、!=、>、>=、<、<=)を使用します。例:
$<udm_variable>.<field_path> = %<data_table_name>.<column_name>- 複数の比較ステートメントを使用している場合、すべてのフィールドまたは条件が同じデータテーブルの行と一致する必要があります。
クエリで演算子(
not、!=、>、>=、<、<=など)を使用するには、UDM フィールドとデータテーブルの行との間に条件joinを 1 つ以上含める必要があります。Google SecOps は、データテーブル
joinを含むルールをマルチイベント ルールとして扱います。そのため、ルール定義にmatchセクションが必要です。
UDM イベントの値とデータテーブルの行を照合してデータをフィルタするには、次の結合構文を検討してください。
正しい結合構文:
行ベースの「組み合わせ除外」では、たとえば、
left outer結合とnullsをチェックするwhere句が必要です。結合構文が正しくありません:
複数の行ベースの等価条件を
NOTでラップしないでください。この構文では、「この組み合わせが見つかった場合は除外する」という効果は得られません。たとえば、
NOT (field1 = %table.col1 AND field2 = %table.col2)のような構文は使用しないでください。これは、一致が引き続き行ごとに適用されるためです。いずれかの行が内部の複合条件を満たさない場合、
NOTによってその行の評価がtrueになり、イベントが除外されずに含まれる可能性があります。
行ベースの比較に
CIDR型またはregex型のデータテーブル列を使用するには、次の構文を使用します。net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>) re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
UDM イベントをデータテーブルにリンクする列ベースの比較
列ベースの比較を使用して UDM イベントをデータテーブルにリンクするには、
inキーワードを使用します。例:
$<udm_variable>.<field_path> in %<data_table_name>.<column_name>フィールド値が指定された列(ブロックリストや許可リストなど)に存在するイベントをフィルタで除外するには、
NOT (... IN %table.column)構文を使用します。例:
not ($evt_username in %my_data_table.username)列ベースの比較に
CIDR型またはregex型のデータテーブル列を使用するには、次の構文を使用します。$e.principal.ip in cidr %cidr_data_table.column_name $e.principal.hostname in regex %regex_data_table.column_nameデータ型が CIDR または正規表現であるデータテーブルの列を比較する場合、キーワード
cidrとキーワードregexは省略可能です。演算子
notはデータテーブルでも使用できます。次のクエリの例では、IP アドレス(
$e.principal.ip)がcidr_data_tableのbenign_ip列にリストされている CIDR 範囲のいずれにも一致しないエントリを除外します。not $e.principal.ip in %data_table.benign_ip
データテーブルを複数列の参照リストとして使用する
データテーブルを複数列の参照リストとして使用できます。参照リストは 1 つのディメンション(1 つの列)のデータにアクセスできますが、データテーブルは複数の列に対応しているため、複数のディメンションにわたってデータをフィルタしてアクセスできます。
列ベースの比較にキーワード in を使用して UDM イベントをデータテーブルにリンクすると、特定の UDM フィールドの値をデータテーブルの単一の列の値と照合できます。
次の例では、badApps データテーブルに hostname と ip の 2 つの列が含まれています。クエリは、両方の値(UDM フィールドに基づく値とデータテーブルに基づく値。どちらも文字列データ型)を個別に照合します。
ルールの例:
rule udm_in_data_table { meta: description = "Use data table as multicolumn reference list" events: $e.metadata.event_type = "NETWORK_CONNECTION" $e.security_result.action = "ALLOW" $e.target.asset.asset_id = $assetid // Event hostname matches at least one value in table column hostname. $e.target.hostname in %badApps.hostname // Event IP matches at least one value in table column ip. $e.target.ip in %badApps.ip match: $assetid over 1h condition: $e }検索の例:
events: $e.metadata.event_type = "NETWORK_CONNECTION" $e.security_result.action = "ALLOW" $e.target.asset.asset_id = $assetid // Event hostname matches at least one value in table column hostname. $e.target.hostname in %badApps.hostname // Event IP matches at least one value in table column ip. $e.target.ip in %badApps.ip
データテーブルと UDM イベントまたは UDM エンティティ間の行ベースの結合
等価演算子と比較演算子(=, !=, >, >=,
<, <=)を使用して UDM イベントをデータテーブルにリンクし、行ベースの比較を行うことができます。このアプローチでは、UDM イベントの値とデータテーブルの行を照合して、データをフィルタできます。複数の比較ステートメントを使用している場合、すべてのフィールドまたは条件が同じデータテーブルの行と一致する必要があります。
クエリで演算子(not, !=, >, >=, <, <= など)を使用するには、UDM フィールドとデータテーブルの行との間に条件 join を 1 つ以上含める必要があります。Google SecOps は、データテーブル join を含むルールをマルチイベント ルールとして扱います。そのため、対応する match セクションをルール定義に含める必要があります。
結合が行われると、リンクされたデータテーブルの行が検索に表示されます。詳細については、検索でデータテーブルの行を表示するをご覧ください。
クエリの
eventセクションのデータテーブルではプレースホルダに対応していますが、プレースホルダは UDM イベントまたは UDM エンティティに接続する必要があります。次の例では、
string型のデータテーブル列を使用しています。この YARA-L クエリの例では、ユーザー ログイン イベントが
example_tableの行と一致するかどうかをチェックします。1 つの条件は、
user IDがexample_tableに存在することです。ルールをトリガーするには、両方の条件が
example_tableの同じ行で一致する必要があります。
// Check if a user exists in a data table and that the user is active for all user login events.
ルールの例:
// Check if user exists in a data table and is active in all user login events.
rule udm_join_data_table {
meta:
description = "Join data table with UDM event"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid
// Event must match at least 1 row in the data table
// where the uid in the data table row is the userid on the event
// and the active date in the same data table row is before the event timestamp.
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname
match:
$userid over 1h
condition:
$e
}
検索の例:
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid
// Event must match at least 1 row in the data table
// where the uid in the data table row is the userid on the event
// and the active date in the same data table row is before the event timestamp
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname
次の例は、データテーブルと UDM イベントデータがどのように連携するかを示しています。
上記の YARA-L クエリのロジックに基づき、
user ID 32452を持つユーザーは、システムからのユーザーのhostnameとして検出に表示され、データテーブル内のhostnameと一致します。データテーブル uid title hostname 32452 HR host1 64452 ファイナンス host2 46364 IT host3 UDM イベント テーブル principal metadata security_result principal 32452 USER_LOGIN 許可 host1 64589 USER_LOGIN 許可 host9 87352 USER_LOGIN 許可 host4
YARA-L クエリの結果をデータテーブルに書き込む
YARA-L クエリの結果をデータテーブルに書き込むことができます。この機能を使用すると、Google SecOps データからデータテーブルを作成し、そのテーブルを使用して他のデータをフィルタリングして強化できます。
YARA-L クエリの書き込み構文は、次の目的で使用できます。
データテーブルにクエリ結果を書き込むための YARA-L 構文を定義する。
脅威インテリジェンス、インシデント対応、その他のセキュリティ ユースケースにデータテーブルを使用する。
データは YARA-L の構文と規則に準拠している必要がある。
YARA-L を使用して検出結果とアラートをデータテーブルに書き込む
YARA-L クエリを使用して、検出結果とアラートをデータテーブルに送信できます。
write_row 関数を使用すると、ルールから取得した結果を使用して、データテーブルの行をデータテーブル内の対応するキーで上書きできます。キーがテーブルに見つからない場合は、代わりに新しい行を追加します。
YARA-L クエリの export セクションで write_row 関数を指定します。データテーブルへのデータの書き込みは、クエリの最終アクションである必要があります。これにより、結果変数がデータテーブルに書き込まれます。
export:
%<data_table_name>.write_row(
data_table_column_x_name: <value>,
data_table_column_y_name: <value>,
...,
...,
data_table_column_z_name: <value>
)
// depending on the key column(s), the rows will be updated for existing keys
and appended for new keys
YARA-L を使用してデータテーブルを変更する
次の例は、YARA-L を使用してデータテーブルを変更する方法を示しています。
TableName: ip_user_domain_table(主キーのキー列は作成時に定義されます)
| IP アドレス | employee_id* | domain |
| 192.0.2.10 | Dana | altostrat.com |
| 192.0.2.20 | Quinn | altostrat.com |
| 192.0.2.30 | Lee | cymbalgroup.com |
* は主キーを示します。
次のクエリは、principal.ip、principal.user.employee_id、target.domain の一意の組み合わせを取得します。target.domain の普及率に基づいて結果をフィルタします。
events:
$e.principal.ip = $principal_ip
$e.principal.user.employee_id = $principal_user_employee_id
$e.target.domain.name = $target_domain
$e.target.domain.prevalence.day_count < 5
// To run this query as a rule, add Condition Section here
// condition:$e
クエリ結果:
| ip | empid | domain |
| 192.0.2.10 | Dana | altostrat.com |
| 192.0.2.30 | Lee | examplepetstore.com |
| 192.0.2.20 | Quinn | altostrat.com |
例: write_row を使用してクエリ出力をデータテーブルに書き込む
ルールの例:
rule udm_write_data_table {
meta:
description = "Writeto data table"
events:
$e.principal.user.employee_id = $principal_user_employee_id
$e.target.domain.name = $target_domain
$e.target.domain.prevalence.day_count < 5
outcome:
$hostname = $target_domain
$principal_emp_id = $principal_user_employee_id
condition:
$e
export:
%ips_with_hostnames.write_row(
employeeid:$principal_emp_id,
hostname:$hostname
)
}
検索の例:
events: $e.principal.user.employee_id = $principal_user_employee_id $e.target.domain.name = $target_domain $e.target.domain.prevalence.day_count < 5 outcome: $hostname = $target_domain $principal_emp_id = $principal_user_employee_id export: %ips_with_hostnames.write_row( employeeid:$principal_emp_id, hostname:$hostname )
例: write_row の理解
次の例では、user と ip が主キーとして使用されています。検出テーブルに保持される各検出結果により、クエリの export セクションで関数呼び出しが 1 回評価されます。
ルールの例:
rule udm_write_data_table {
meta:
description = "Write data table"
events:
$e.metadata.event_type = "USER_LOGIN"
all $e.security_result.action != "BLOCK"
all $e.security_result.action != "UNKNOWN_ACTION"
$user = $e.principal.user.userid
$ip = $e.target.ip
$ts = $e.metadata.event_timestamp.seconds
match:
$user, $ip over 1h
outcome:
$first_seen = min($ts)
condition:
$e
export:
%successful_logins.write_row(user:$user, ip:$ip)
}
検索の例:
events: $e.metadata.event_type = "USER_LOGIN" all $e.security_result.action != "BLOCK" all $e.security_result.action != "UNKNOWN_ACTION" $ts = $e.metadata.event_timestamp.seconds outcome: $user = $e.principal.user.userid $ip = $e.target.ip[0] export: %successful_logins.write_row(user:$user, ip:$ip)イベントデータは次のとおりです。
metadata: { event_type: USER_LOGIN event_timestamp: { seconds: 1283299200 } } principal: { user: { userid: "charlie" } } target: { ip: ["192.0.2.135", "192.0.2.136"] } security_result: { action: ALLOW }このクエリをルールとして実行すると、次の検出結果が返されます。
検出 ID $user に一致 $ip に一致 0 charlie 192.0.2.135 1 charlie 192.0.2.136 データテーブルには次の情報が含まれています。
ユーザー ip charlie 192.0.2.135 charlie 192.0.2.136
次の検索クエリは、検索で提供されるデータテーブルへのスカラー値の書き込みへの対応を示しています。
events: $e.metadata.event_type = "NETWORK_CONNECTION" export: %summary_table.write_row(col_name: $e.metadata.product_name, Vendor_name: $e.metadata.vendor_name)
データテーブルを使用してエンティティ グラフを拡充する
データテーブルを使用すると、エンティティ グラフに表示されるエンティティを追加、置換できるほか、ルールから削除できます。ルール setup セクションの関数を使用して、データテーブルを events セクションで参照されるエンティティ イベントとどのように統合するか、そのようなエンティティ イベントにどのように追加するか、またはそのようなエンティティ イベントからエンティティを削除するのにどのように使用するかを指定します。
次のルール テンプレートを使用して、エンティティ グラフを変更できます。
rule entity_graph_template {
meta:
...
setup:
// import the data table into entity graph
<enrichment_keyword> <join_condition>
events:
...
match:
...
condition:
...
}
次の YARA-L 2.0 関数を使用して、データテーブルでエンティティ グラフを強化できます。
graph_override: 結合条件に一致するエンティティ グラフ内の行をデータテーブルのデータで上書きします。例:
[graph_override](?tab=t.0#heading=h.v0fps7eke1if)graph_append: データテーブルの行をエンティティ グラフの行に追加します。graph_appendオペレーションでは、結合条件ではなく、データテーブル変数とエンティティ イベント変数を含む配列が必要です。次の例では、
$g1はエンティティ グラフ変数、example_tableはデータテーブルです。graph_append [$g1, %example_table]append関数では、エンティティを検証するために、データテーブルに次の列を含める必要があります。start_time(metadata.interval.start_time.secondsにマッピング)end_time(metadata.interval.end_time.secondsにマッピング)
ウェブ インターフェースを使用して、データテーブルの列をメタデータ フィールドにマッピングすることはできません。
appendのユースケースでは、Chronicle API(https://cloud.google.com/chronicle/docs/reference/rest/v1alpha/projects.locations.instances.dataTables/create)を使用してデータテーブルを作成する必要があります。graph_exclude:join条件に一致するエンティティ グラフ内の行を削除します。例:
[graph_exclude](?tab=t.0#heading=h.o0qbb5paki6g)
結合条件は、データテーブルの列とエンティティ グラフのフィールドとの間の等式表現である必要があります。graph_override 関数と graph_exclude 関数でデータテーブルにアクセスする構文は次のとおりです。
<data_table_name>.<column_name>
イベント セクションの <entity_variable> に指定されたフィルタはいずれも、データテーブルで拡張された後に適用されます。
エンティティ グラフのエンティティがデータテーブルのエンティティで拡充されたら、エンティティ グラフのエンティティ変数を UDM エンティティに結合する必要があります。
データテーブルのデータでエンティティ グラフをオーバーライドする
graph_override 関数を使用すると、エンティティ グラフとデータテーブルの両方に存在するフィールドが、データテーブルのフィールドに置き換えられます。エンティティ グラフに存在し、データテーブルに存在しないフィールドは変更されません。エンティティ グラフには存在しないが、データテーブルには存在するフィールドが含まれます。
マッピングされたデータテーブルの列のみが、エンティティ グラフの列をオーバーライドします。マッピングされていない列は、データテーブルが結合されているエンティティ グラフの additional フィールドに追加されます。
例: 単一結合で一致する
次の例では、データテーブルの列とエンティティ グラフのフィールド($g1.graph.entity.ip = %example_table.my_ip)の間の結合条件に一致するエンティティ グラフの行が、データテーブルによってオーバーライドされます。
rule rule_override {
meta:
description = "Override entity context with data table before joining with UDM event"
setup:
//Rows in the entity graph that match the join condition are overridden by the data table
graph_override ($g1.graph.entity.ip = %example_table.my_ip)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Filter will be applied after graph is overridden by data table
$g1.graph.entity.hostname = "ftp01"
// Accessing unmapped columns
$g1.graph.additional.fields["Owner"] = "alice"
// Joining the UDM event with the enriched entity graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
データテーブルの未マッピングの列(「Owner」など)を使用するには、$g1.graph.entity.owner = "alice" is $g1.graph.additional.fields["Owner"] = "alice" の同等のステートメントを使用します。これは、データテーブルのマッピングされていないすべての列が、エンティティ グラフ ($g1) の additional フィールドに格納されるためです。
次のテーブルは、データテーブルの IP フィールドがエンティティ グラフの IP フィールドと一致する場合に、エンティティ グラフの行が拡充されるオーバーライド オペレーションを示しています。
| 既存のエンティティ グラフ | ||
| Hostname | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| データテーブル | |||
| Hostname | IP | MAC | Owner |
| ftp01 | 10.1.1.4 | …:bb | alice |
| h1 | 10.1.1.6 | …:cc | bob |
| h2 | 10.1.1.7 | …:dd | chris |
| h3 | 10.1.1.4 | …:ee | doug |
| 拡充されたエンティティ グラフ | |||
| Hostname | IP | MAC | Owner |
| ftp01 | 10.1.1.4 | …:bb | alice |
| www01 | 10.1.1.5 | …:02 | |
| h3 | 10.1.1.4 | …:ee | doug |
例: 複数の結合で一致する
次の例では、複数の結合条件($g1.graph.entity.ip = %example_table.my_ip と $g1.graph.entity.hostname = %example_table.my_hostname)に一致するエンティティ グラフの行がデータテーブルによってオーバーライドされます。
rule rule_override {
meta:
description = "Override Entity context with Data Table before joining with UDM event"
setup:
// example with more than one condition
graph_override ($g1.graph.entity.ip = %example_table.my_ip and
$g1.graph.entity.hostname = %example_table.my_hostname)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Filter will be applied after graph is overridden by data table
$g1.graph.entity.hostname = "ftp01"
// joining the UDM event with the enriched entity graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
次のテーブルは、データテーブルの IP フィールドと Hostname フィールドの両方がエンティティ グラフの IP フィールドと Hostname フィールドに一致する場合に、エンティティ グラフの行が拡充されるオーバーライド オペレーションを示しています。
| 既存のエンティティ グラフ | ||
| Hostname | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| データテーブル | |||
| Hostname | IP | MAC | Owner |
| ftp01 | 10.1.1.4 | …:bb | alice |
| h1 | 10.1.1.5 | …:cc | bob |
| h2 | 10.1.1.6 | …:dd | chris |
| h3 | 10.1.1.4 | …:ee | doug |
| 拡充されたエンティティ グラフ | |||
| Hostname | IP | MAC | Owner |
| ftp01 | 10.1.1.4 | …:bb | alice |
| www01 | 10.1.1.5 | …:02 | |
データテーブルのデータをエンティティ グラフに追加する
graph_append 関数では、結合条件は必要ありません。
次の例では、データテーブルのすべての行がエンティティ グラフの行に追加されます。
rule rule_append {
meta:
description = "Data table append entity"
setup:
graph_append [$g1, %example_table]
events:
// filter UDM events
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
// Join the filtered UDM events with the enriched graph
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
次の例のテーブルは、データテーブルの行がエンティティ グラフの行に追加される追加オペレーションを示しています。
| 既存のエンティティ グラフ | ||
| Hostname | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| データテーブル | ||
| IP | MAC | Owner |
| 10.1.1.4 | …:01 | alice |
| 10.1.1.6 | …:cc | bob |
| 10.1.1.7 | …:dd | chris |
| 10.1.1.4 | …:ee | doug |
| 拡充されたエンティティ グラフ | |||
| Hostname | IP | MAC | Owner |
| ftp01 | 10.1.1.4 | …:01 | |
| www01 | 10.1.1.5 | …:02 | |
| 10.1.1.4 | …:bb | alice | |
| 10.1.1.6 | …:cc | bob | |
| 10.1.1.7 | …:dd | chris | |
| 10.1.1.4 | …:ee | doug | |
graph_exclude を使用してエンティティ グラフから行を削除する
graph_exclude 関数を使用すると、結合条件に一致するエンティティ グラフ内の行がエンティティ グラフから削除されます。
次の例では、指定された結合条件(データテーブルの列とエンティティ グラフのフィールドとの間)に一致するエンティティ グラフ内のすべての行が削除されます。データテーブルの行はエンティティ グラフに追加されません。
rule rule_exclude {
meta:
setup:
graph_exclude ($g1.graph.entity.ip = %example_table.ip)
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
$e.target.ip = $iocip
$g1.graph.entity.ip = $iocip
match:
$iocip over 1h
condition:
$e and $g1
}
次のテーブルは、データテーブルの IP フィールドと一致するエンティティ グラフの行が削除される除外オペレーションを示しています。
| 既存のエンティティ グラフ | ||
| Hostname | IP | MAC |
| ftp01 | 10.1.1.4 | …:01 |
| www01 | 10.1.1.5 | …:02 |
| データテーブル | ||
| IP | MAC | Owner |
| 10.1.1.4 | …:bb | alice |
| 10.1.1.6 | …:cc | bob |
| 10.1.1.7 | …:dd | chris |
| 拡充されたエンティティ グラフ | ||
| Hostname | IP | MAC |
| www01 | 10.1.1.5 | …:02 |
制限事項
Google SecOps アカウントのデータテーブルの最大数: 1,000。
データテーブルでサポートされているのは CSV データのみです。データテーブルでタブ区切り値がサポートされるのは、新しいデータテーブルを追加するときと、タブ区切り値(TSV)ファイルをインポートするときのみです。
データテーブルのフィールドは、カンマ(
,)に対応していません。クエリで参照リストを参照する場合の
inステートメントの数に関する上限は、データテーブルのinステートメントにも適用されます。Stringデータ型とNumberデータ型の列のクエリ内のinステートメントの最大数: 7。正規表現演算子を含む
inステートメントの最大数: 4。CIDR 演算子を含む
inステートメントの最大数: 2。データテーブルあたりの最大列数: 1,000。
データテーブルあたりの最大行数: 1,000 万。
アカウント内のデータテーブル全体のデータ容量の最大合計制限: 1 TB。
テキスト エディタ ビューとテーブル エディタ ビューでデータテーブルの行をウェブページに表示する際の最大行数: 10,000 行。
データテーブルの作成時の最大ファイル アップロード サイズの上限: 10 GB。
設定セクションではプレースホルダを使用できません。
データ型が
stringに設定されているデータテーブルの未マッピングの列は、UDM イベントまたは UDM エンティティの文字列フィールドとのみ結合できます。データ型が CIDR または正規表現の
cidrまたはregexに設定されているデータテーブルで、マッピングされていない列のみを使用します。データテーブルのルックアップ: 正規表現のワイルドカードには対応していません。検索語句は 100 文字までに制限されています。
ルール内のデータテーブル結合の制限事項
ルール内のデータテーブル結合には、次の制限が適用されます。
イベントでデータテーブル結合を使用している場合、検出結果のすべてのイベント サンプルを取得することはできません。
エンティティや UDM とは異なり、データテーブルはプレースホルダに対応していません。これにより、次の制限が生じます。
1 つのフィルタセットをデータテーブルに適用し、UDM エンティティと結合することはできません。
同じデータテーブルに別のフィルタセットを適用しながら、別の UDM プレースホルダと結合することはできません。
たとえば、
my_hostname、org、my_emailの 3 つの列を持つdtという名前のデータテーブルと、次のルールがあるとします。events: $e1.principal.hostname = %dt.my_hostname %dt.org ="hr" $e2.principal.email = %dt.my_email %dt.org !="hr"
データテーブルのすべてのフィルタが最初に適用され、次にデータテーブルのフィルタされた行が UDM と結合されます。この場合、dt テーブルの矛盾するフィルタ(%dt.org ="hr" and %dt.org !="hr")により、空のデータテーブルが生成され、そのテーブルが e1 と e2 の両方に結合されます。
ルールでデータテーブルを使用する場合の制限事項
ルールで使用する場合、データテーブルには次の制限事項が適用されます。
実行頻度に関する制限事項
データテーブルを含むルールでは、リアルタイム実行の頻度に対応していません。
データテーブルへの出力に関する制限事項
データテーブルの繰り返しフィールド列では、
any修飾子とall修飾子に対応していません。データテーブルの繰り返しフィールド列では、配列インデックス作成に対応していません。
結果変数はデータテーブルにのみエクスポートできます。イベントパスやデータテーブルの列を直接エクスポートすることはできません。
列リストには、データテーブルの主キー列を含める必要があります。
結果は最大 20 個まで設定できます。
データテーブルが存在しない場合は、指定された順序に従って、すべての列にデフォルトの
stringデータ型を使用して新しいテーブルが作成されます。一度にデータテーブルに書き込むことができるルールは 1 つだけです。別のルールがすでに書き込んでいるデータテーブルにルールが書き込もうとすると、ルールのコンパイルが失敗します。
プロデューサー ルールが、データテーブルのコンシューマー ルールが開始する前にそのデータテーブルに行を追加できる保証はありません。
単一のルールには、結果の行数に上限があります。結果と永続データ、データテーブルには最大 10,000 行の制限が適用されます。
行を更新すると、キー以外のすべての列の新しい値が古い値を置き換えます。新しい行の追加などの更新は、クエリで使用できるようになるまでに約 5 分かかります。
データテーブルからのエンティティ拡充に関する制限事項
1 つのエンティティ グラフ変数に適用できる拡充オペレーションは 1 つだけです(
override、append、excludeのいずれか)。各拡充オペレーションで使用できるデータテーブルは 1 つのみです。
YARA-L ルールの
setupセクションでは、任意のタイプの拡充オペレーションを最大 2 つ定義できます。
次の例では、override オペレーションがエンティティ グラフ変数 $g1 に適用され、append オペレーションがエンティティ グラフ変数 $g2 に適用されます。
setup:
graph_override($g1.graph.entity.user.userid = %table1.myids)
graph_append [$g2, %table1]
上記の例では、同じデータテーブル(table1)を使用して、異なるエンティティ グラフを強化しています。次のように、異なるデータテーブルを使用して、さまざまなエンティティ グラフを強化することもできます。
setup:
graph_override($g1.graph.entity.user.userid = %table1.myids)
graph_append [$g2, %table2]
検索でデータテーブルを使用する場合の制限事項
検索で使用されるデータテーブルには、次の制限事項が適用されます。
Chronicle API を使用してデータテーブルで検索クエリを実行することはできません。クエリにはウェブ インターフェースのみが対応しています。
1 回のクエリ実行でデータテーブルに出力できる行数は最大 100 万行、または 1 GB のいずれか先に達した方です。
検索結果をデータテーブルに出力する際、イベント行が 5 MB を超えるとスキップされます。
検索ではエンティティの拡充に対応していません。
顧客管理の暗号鍵(CMEK)のユーザーはデータテーブルに対応していません。
書き込みは、お客様 1 人につき 1 分あたり 6 回に制限されます。
検索関連のデータテーブル オペレーションでは API サポートを利用できません。
データテーブル結合では統計クエリに対応していません。
エンティティではなく UDM イベントでのみデータテーブルとデータテーブル結合に対応しています。
サポート対象:
%datatable1.column1 = %datatable2.column1サポート対象外:
graph.entity.hostname = %sample.test統計情報クエリの
exportセクションにmatch変数を含めることはできません。たとえば、以下はサポートされていません。
match: principal.hostname export: %sample.write_row( row: principal.hostname )
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。