ロギングデータのエクスポートのシナリオ: セキュリティとアクセス分析

このドキュメントでは、組織のクラウド インフラストラクチャ環境のセキュリティと分析の要件を満たすために、Cloud Logging から BigQueryChronicle、サードパーティの SIEM などの宛先にログをエクスポートする方法について説明します。多くの場合、組織はこうしたセキュリティ分析ツールを使用して、マルウェア、フィッシング、ランサムウェア、およびアセットの構成ミスなどの脅威を防止、検出し、対処します。このドキュメントでは、こうしたセキュリティと分析の要件を満たすことができるよう、まずアプリケーション ログからプラットフォーム ログ、さらに管理アクティビティ ログやデータアクセス ログなどの Google Cloud 環境におけるさまざまなセキュリティ関連のログを紹介します。

ログ範囲の設定ツールを使用すると、可視性と脅威検出のカバレッジの観点から、最初にこれらのセキュリティ関連のログタイプを評価できます。このツールは、脅威の戦術と手法を一般的な MITRE ATT&CK® 脅威モデルから、特定の Google Cloud ログタイプにマッピングできるため、これらの一般的な脅威の調査に役立ちます。同様に、Security Command Center の Event Threat Detection モジュールと、それらが依存する Google Cloud の対応ログソースとをマッピングします。

このシナリオでは、ユーザー定義のロギング フィルタに加えて、エクスポートの一環として、エクスポートしたログが構成された BigQuery のデータセットに配信されます。必要に応じて、ログへのアクセスを制限する権限を付与します。データの管理と照会を簡素化するには、ログエントリを timestamp フィールドに基づいて日別にパーティション分割したパーティション分割テーブルに、データをエクスポートするようにログシンクを構成します。この手法により、クエリの一部としてスキャンされるデータ量を減らして、クエリのコストを削減できます。パーティション分割テーブルのもう 1 つの利点は、個別のテーブルまたはデータセット全体のパーティションの有効期限を設定できることです。これにより、役立つと思われる期間、ロギングデータを維持できます。たとえば、監査ロギングデータを 3 年間保持すると、古いデータはパーティションの有効期限が切れて自動的に削除されます。

このシナリオは、Cloud Logging のエクスポートのための設計パターンの一部です。

エクスポート対象のログを評価する

ログ範囲の設定ツール

次のインタラクティブなログ範囲の設定ツールは、Cloud Audit Logs、アクセスの透明性ログ、複数のプラットフォーム ログなど、Google Cloud 全体のセキュリティに関連する重要なログを一覧表示します。このツールは、セキュリティとコンプライアンスのニーズを満たすためにエクスポートして分析するログを評価できるようにする目的で、各ログタイプを対応する次の項目にマッピングします。

ロギング エクスポートの設定セクションで使用する適切なログフィルタを自動的に生成するには、必要なログタイプを選択します。

ログフィルタを記録する

Cloud Shell で、上記の自動生成ログフィルタを保存する変数を作成します。必要に応じて、さらに細かく絞り込むこともできます。たとえば、1 つ以上の特定のプロジェクトにあるリソースのみをフィルタリング(または除外)できます。

export LOG_FILTER='log-filter'

ログ エクスポートの設定

次の図は、BigQuery へのログ エクスポートを有効にする手順を示しています。

  • BigQuery でログ エクスポート データセットを設定します。
  • すべての Google Cloud サービスの監査ログを有効にします。
  • 特定の Google Cloud サービスのプラットフォーム ログを有効にします。
  • ログ エクスポートを構成する
  • BigQuery データセットの IAM ポリシー権限を設定する

BigQuery へのログ エクスポートの有効化

BigQuery でデータセットを設定する

エクスポートしたログをホストするデータセットを設定するための手順を行います。集約ログを使用する場合、組織内のいずれかの Google Cloud プロジェクトに BigQuery データセットを配置する必要があります。単一のプロジェクトにログ エクスポートを使用している場合、BigQuery データセットは同じプロジェクト内にある必要があります。

すべてのサービスで監査ロギングを有効にする

データアクセス監査ログ(BigQuery 用を除く)は、デフォルトで無効になっています。Google Cloud Console でデータアクセス監査ログを直接構成するには、データアクセス監査ログを構成するをご覧ください。IAM ポリシー オブジェクトを使用して、gcloud でデータアクセス監査ログを構成することもできます。たとえば、すべてのサービスとすべてのユーザーのデータアクセス監査ログを有効にする一般的な IAM ポリシー構成については、すべてのデータアクセス監査ログを有効にするをご覧ください。

サービス固有のプラットフォーム ログを有効にする

プラットフォームのログは、サービス単位で、通常はリソースレベルで有効にする必要があります。たとえば、Cloud DNS ログは VPC ネットワーク レベルで有効にし、VPC フローログはサブネット内のすべての VM のサブネット レベルで有効にします。また、ファイアウォール ルールのログは個別のファイアウォール ルールレベルで有効にします。特定のログタイプを有効にする方法について詳しくは、ログ範囲の設定ツールを確認し、各行の [有効にする] リンクをクリックしてください。

ログ エクスポートを構成する

Google Cloud CLI から gcloud logging sinks create コマンドまたは organizations.sinks.create API 呼び出しを使用して、適切なロギング フィルタが設定されたシンクを作成します。次の gcloud コマンドの例では、この組織に対して gcp_logging_sink_bq という名前のシンクが作成されます。シンクにはすべての子プロジェクトが含まれ、上記で作成した $LOG_FILTER 変数に保存されたログフィルタを指定します。

gcloud logging sinks create gcp_logging_sink_bq \
     bigquery.googleapis.com/projects/compliance-logging-export/datasets/gcp_logging_export \
     --use-partitioned-tables \
     --log-filter='$LOG_FILTER' \
     --include-children \
     --organization=324989855333

コマンドの出力は次のようになります。

Created [https://logging.googleapis.com/v2/organizations/324989855333/sinks/gcp_logging_sink_bq].
Please remember to grant `serviceAccount:gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com` the WRITER role on the dataset..
More information about sinks can be found at /logging/docs/export/configure_export

この API 呼び出しからの戻り値の serviceAccount エントリにおいて、gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com という ID がレスポンスに含まれます。この ID は、ログのエクスポート専用に作成された Google Cloud サービス アカウントを表します。この ID に BigQuery データセットへの書き込みアクセス権を付与するまで、このシンクからのログエントリのエクスポートは失敗します。詳細については、次のセクションをご覧ください。

BigQuery データセットの IAM ポリシー権限を設定する

編集者権限を持つ gcp_logging_export データセットにサービス アカウント gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com を追加することにより、宛先に書き込む権限がサービス アカウントに付与されます。これらの権限が追加されるまで、シンクのエクスポートは失敗します。

サービス アカウントに権限を付与するには、次の操作を行います。

  1. Cloud Console で BigQuery に移動します。

    BigQuery に移動

  2. 新しく作成した gcp_logging_export データセットを開きます。

  3. データセットの情報タブで、[共有] プルダウン メニューをクリックし、[権限] をクリックします。

  4. [データセットの権限] サイドパネルで、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、サービス アカウントを入力します。次の図に示すように、[ロール] プルダウン メニューで [BigQuery データ編集者] を選択します。

    IAM ポリシー権限 - 編集者

このフィルタを使用してログ エクスポートを作成すると、構成されたプロジェクトの BigQuery データセットへの入力が、ログファイルによって開始されます。

権限セットの例として、次の操作が可能です。

  • BigQuery データセット権限から、必須でないユーザーをすべて削除します。
  • BigQuery 管理者に完全なアクセス権を付与します。
  • エクスポート サービス アカウントにエクスポート ログを書き込む権限を付与します。
  • 他の個別のユーザーに Google Cloud ロギング エクスポートへの閲覧権限を付与します。

エクスポートされたログの使用

BigQuery データセットにログをエクスポートすると、エクスポートされたログエントリを保持する日付別テーブルが作成されます。ログエントリは、エントリのログ名に基づいて名前が付けられたテーブルに配置され、エントリのタイムスタンプに基づいて分割されます。たとえば、次の図に示すように、データアクセス監査ログは cloudaudit_googleapis_com_data_access テーブルにルーティングされます。

スキーマを持つテーブルのリスト。

管理アクティビティ ログとデータアクセス ログは、どちらも protoPayload 形式で BigQuery に読み込まれます。BigQuery に書き込む前に Cloud Logging によって行われるスキーマ変換の詳細については、エクスポートされた監査ログのフィールドをご覧ください。

サンプルの質問とクエリ

監査ログに対してさまざまなクエリを実行できます。これらのクエリは、Google Cloud のデータにアクセスまたは修正を行ったユーザーを把握するための分析を行います。gcp_logging_export は、BigQuery データセットの名前に置き換えます。

前週に最も頻繁にデータにアクセスしたユーザーは誰か

次のクエリでは、データアクセス監査ログを使用して、過去 1 週間に BigQuery テーブルに最も頻繁にアクセスしたユーザー ID を確認します。

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

先月「accounts」テーブルのデータにアクセスしたユーザーは誰か

次のクエリでは、データアクセス監査ログを使用して、過去 1 か月間に "accounts" テーブルに最も頻繁にクエリを実行しているユーザー アカウントを確認します。MY_PROJECT_ID はプロジェクト ID に置き換え、MY_DATASET はデータセットに置き換えます。

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/MY_PROJECT_ID/datasets/MY_DATASET/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

前週に VM を削除したユーザー

次のクエリでは、管理アクティビティ監査ログを使用して、過去 1 週間に VM を削除したユーザー ID を確認します。

SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

次のクエリは、管理アクティビティ 監査ログを使用して、先月オートスケーリングが使用された頻度を確認します。

SELECT
  protopayload_auditlog.methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  1
LIMIT
  1000

次のクエリを使用すると、時間の経過に伴う Compute Engine インスタンス マネージャーの動作の傾向を日付別に分類して可視化できます。

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

上記のクエリを Google データポータルのデータソース カスタムクエリとして使用すると、次のグラフに示すように時間の経過に伴う傾向を可視化できます。

データポータルの可視化

詳細については、データポータル カスタムクエリをご覧ください。

最も頻繁にアクセスされているテーブルはどれで、アクセスしたユーザーは誰か

次のクエリでは、データアクセス監査ログを使用して、過去 1 か月間に頻繁に読み取り、変更されたデータが含まれる BigQuery テーブルを検索します。関連するユーザー ID と、データの読み取り総回数に対する変更の総回数の内訳が表示されます。

SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

前週の BigQuery に対するクエリのトップ 10 は何か

次のクエリでは、データアクセス監査ログを使用して、過去 1 週間で最も頻繁に実行されたクエリを確認します。また、対応するユーザーと参照されたテーブルも一覧表示されます。

SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

過去 1 か月間にデータアクセス ログに記録されたもっとも多い操作は何か

次のクエリでは、すべての Cloud Audit Logs を使用して、過去 1 か月間に記録された頻度の高い 100 件のアクションを確認します。

SELECT
  ANY_VALUE(_TABLE_SUFFIX),
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_*`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

次のステップ