Stackdriver Logging のエクスポートのためのシナリオ: セキュリティおよびアクセス解析

このシナリオでは、組織のクラウド インフラストラクチャ環境のセキュリティおよびアクセス解析の要件を満たすために、Stackdriver Logging から BigQuery にログをエクスポートする方法について説明します。多くの場合、組織では設定に対する未承認の変更やデータへの不適切なアクセスを特定するために解析ツールを使用します。このようなセキュリティおよび解析の要件を満たす上で、Stackdriver Logging では、管理アクティビティ ログおよびデータアクセス ログの 2 種類の監査ログをキャプチャできます。

このシナリオでは、エクスポートの一環として、エクスポートしたログが構成された BigQuery のデータセットに配信されます。必要に応じて権限を付与し、ログへのアクセスを制限します。エクスポートされたデータを日付分割テーブルに整理することによって、データを簡単に管理および照会できます。この手法により、クエリの一部としてスキャンされるデータ量を減らして、クエリ料金を削減できます。パーティショニングの 1 つのメリットとして、パーティションの有効期限を設定して、役立つと思われる期間ロギングデータを管理できます。たとえば、監査ロギングデータを 3 年間保持し、その後削除することができます。

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

ログ エクスポートの設定

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

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

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

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

ベスト プラクティス: テーブルの作成時には、パーティションの有効期限を設定して、ログ エクスポート ストレージのサイズと、時間の経過に伴う累積ストレージ費用を制限します。

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

データアクセス監査ログは、BigQuery を除き、デフォルトで無効になっています。すべての監査ログを有効にするには、監査ポリシーのドキュメントに記載されている設定を指定して、IAM ポリシーを更新するための手順に従います。手順は次のとおりです。

  • 現在の IAM ポリシーをファイルとしてダウンロードします。
  • 監査ログポリシーの JSON または YAML オブジェクトを現在のポリシー ファイルに追加します。
  • 更新されたポリシー ファイルでプロジェクトを更新します。

すべてのサービスに対してすべての監査ログを有効にする JSON オブジェクトの例を次に示します。

"auditConfigs": [
    {
        "service": "allServices",
        "auditLogConfigs": [
            { "logType": "ADMIN_READ" },
            { "logType": "DATA_READ"  },
            { "logType": "DATA_WRITE" },
        ]
    },
]

ログ エクスポートを設定する

集約エクスポートまたはログ エクスポートを設定したら、監査ログをエクスポートするためにロギング フィルタを絞り込む必要があります。次のロギング フィルタには、管理アクティビティ監査ログとデータアクセス監査ログに加えて、特定のリソースタイプのログが含まれます。

logName:"/logs/cloudaudit.googleapis.com" OR
resource.type:gce OR
resource.type=gcs_bucket OR
resource.type=cloudsql_database OR
resource.type=bigquery_resource

適切なフィルタを使用してシンクを作成するには、gcloud コマンドライン ツールで gcloud logging sinks create コマンドまたは organizations.sinks.create API 呼び出しを使用します。次の gcloud コマンドの例は、組織のために gcp_logging_sink_gcs というシンクを作成します。シンクにはすべての子プロジェクトが含まれ、特定の監査ログを選択するためのフィルタリングを指定します。

gcloud logging sinks create gcp_logging_sink_bq22 \
     bigquery.googleapis.com/projects/compliance-logging-export/datasets/gcp_logging_export \
     --log-filter='logName:"/logs/cloudaudit.googleapis.com"' \
     --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 エントリでは、レスポンスに ID gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com が含まれます。この ID は、エクスポート用に作成された GCP サービス アカウントを表します。この ID に送信先への書き込みアクセス権を付与するまで、このシンクからのログエントリのエクスポートは失敗します。詳細については、次のセクションまたは BigQuery データセットの権限の設定に関するドキュメントご覧ください。

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

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

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

  1. BigQuery ウェブ UI を開きます。

    BigQuery ウェブ UI に移動

  2. gcp_logging_export データセットの隣にあるプルダウン矢印をクリックしてから、[共有データセット] をクリックします。

  3. 次のスクリーンショットに示されているように、[ユーザーを追加] フィールドにサービス アカウントを入力します。

    IAM ポリシー権限 - 編集者

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

ベスト プラクティス: 必要に応じて、最小権限のポリシーを実装します。特定の GCP ユーザー アカウント、Google グループ、または GCP サービス アカウントに基づいて、データセット権限を設定できます。BigQuery データセットへのアクセスを許可するには、IAM 権限を使用します。

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

  • BigQuery データセット権限からすべての非必須ユーザーを削除します。
  • BigQuery 管理者に完全なアクセス権を付与します。
  • エクスポート ユーザー権限を付与して、エクスポート ログを書き込みます。
  • 他の個々のユーザーに GCP ログ エクスポートに対する閲覧者アクセス権を付与します。

データセットの IAM 権限は、GCP Console から直接更新することも、gsutil コマンドライン ユーティリティ経由または API 経由で更新することもできます。

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

BigQuery データセットにログをエクスポートすると、Stackdriver Logging はエクスポートされたログエントリを保持する日付別テーブルを作成します。ログエントリは、エントリのログ名に基づく名前が付けられたテーブルに格納されます。

日付別テーブル

次のサンプルのように、テーブルリストは YYYYMMDD の接尾辞とともに表示されます。

テーブルのリスト

エクスポートされたログは監査ログであるため、管理アクティビティ ログとデータアクセス ログは protoPayload の形式で BigQuery に読み込まれます。

外部アクセス権を付与する

セキュリティ アナリスト、DevOps チーム、監査担当者などの特定のユーザーに対して、エクスポートされたログへのアクセス権を付与することもできます。BigQuery では、ログへの安全なアクセス権を付与するためのオプションがいくつか用意されています。

ログの場所戦略

BigQuery でユーザーが閲覧できるログを選択するためのオプションは複数あります。

  • 共有するログのコピーを作成する。

    個々のログテーブルまたはログテーブルのセットを手動またはプログラムによって作成し、それらのコピーを個別の BigQuery データセットに配置します。次に、必要に応じて個別の BigQuery データセット権限を使用して特定のユーザーとログを共有します。

    メリット: 公開されているデータの数を、コピーされたデータに限定することができます。

    デメリット: 個別のデータセットを作成、共有、管理する必要があり、コストが高くなる可能性があります。

  • すべてのログへの読み取り専用アクセス権を付与する。

    BigQuery ログ エクスポート テーブルへの閲覧者権限を手動またはプログラムによって設定し、すべてのログ エクスポートへのアクセス権を付与します。

    メリット: アクセス権を簡単に付与することができます。

    デメリット: 特定のログファイルではなく、すべてのログにアクセス権を付与する必要があります。

ユーザーのアクセス制御戦略

BigQuery でログへのアクセス権を付与するためのオプションは複数あります。

  • Google グループを使用する。

    ログ エクスポート BigQuery データセットに対する読み取り専用アクセス権を使用して、auditors@example.com などの Google グループを作成します。次に、Google グループに監査担当者を追加または削除することによって Google アカウントのリストを管理します。

    メリット: グループ経由でのアクセスの管理は簡単です。ユーザー アクセスの目的が明確です。

    デメリット: グループのメンバーシップを確認せずにアクセス権を持つユーザーを特定できません。

  • 個別の Google アカウントを使用する。

    ログ エクスポート BigQuery データセットへのアクセス権を、必要とする各ユーザーの個々の Google アカウントに付与します。

    メリット: 各ユーザーを手動またはプログラムで簡単に追加できます。

    デメリット: 監査ユーザーを他の閲覧者から識別できません。

サンプルの質問とクエリ

監査ログに対してさまざまなクエリを実行できます。このようなクエリは、GCP のデータにアクセスしているユーザーや、オートスケーラーがどのように動作しているかを理解するための分析を実行します。

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

次のクエリは、データアクセス Cloud Audit ログを使用して、データアクセス ログに最も頻繁に現れたユーザー アカウントを検索します。

SELECT
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNT(*) AS COUNTER
FROM
(TABLE_DATE_RANGE(
Logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  protopayload_auditlog.methodName = "jobservice.query"
GROUP BY
   protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNTER desc
LIMIT
  1000

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

次のクエリは、データアクセス Cloud Audit ログを使用して、「accounts」テーブルを最も頻繁に照会したユーザー アカウントを検索します。[YOUR_PROJECT_ID] を実際のプロジェクト ID に置き換えます。

SELECT
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNT(*) AS COUNTER
FROM
(TABLE_DATE_RANGE(logging_export.cloudaudit_googleapis_com_data_access_,DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),CURRENT_TIMESTAMP()))
WHERE
  protopayload_auditlog.methodName = "jobservice.query" AND
  protopayload_auditlog.authorizationInfo.permission = "bigquery.tables.getData"
AND
  protopayload_auditlog.authorizationInfo.resource = "projects/[YOUR_PROJECT_ID]/datasets/bqtesting/tables/accounts"
GROUP BY
   protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
   protopayload_auditlog.authenticationInfo.principalEmail,
   COUNTER desc
LIMIT
  1000

前週に仮想マシンを削除したユーザーは誰か

次のクエリは、管理アクティビティ Cloud Audit ログを使用して、前週に仮想マシンを削除したユーザー アカウントを検索します。

SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance"
  AND operation.first IS TRUE
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
ORDER BY
  timestamp,
  resource.labels.instance_id
LIMIT
  1000

次のクエリは、単純なカウントでアカウントを要約するフォローアップ クエリです。

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  count(*) as counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance"
  AND operation.first IS TRUE
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
GROUP BY
  protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
  protopayload_auditlog.authenticationInfo.principalEmail,
  counter
LIMIT
  1000

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

SELECT
  protopayload_auditlog.methodName,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance_group_manager"
GROUP BY
  protopayload_auditlog.methodName,
ORDER BY
  protopayload_auditlog.methodName
LIMIT
  1000

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

SELECT
  timestamp,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_activity_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  resource.type = "gce_instance_group_manager"
GROUP BY
  timestamp,
  methodName
ORDER BY
  timestamp,
  methodName

次のグラフに示すように、前のクエリを Data Studio のデータソース カスタムクエリとして使用して、時間の経過に伴う傾向を視覚化できます。

データスタジオの可視化

詳細については、Data Studio カスタムクエリをご覧ください。

最も頻繁にアクセスされているデータは何で、アクセスしたユーザーはだれか

次のクエリは、データアクセス Cloud Audit ログを使用して、最も頻繁にアクセスされている BigQuery データセットを検索し、関連するユーザー アカウントがその数とともに表示されます。

SELECT
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
WHERE
  protopayload_auditlog.authorizationInfo.permission = "bigquery.tables.getData"
GROUP BY
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail
ORDER BY
  protopayload_auditlog.authorizationInfo.resource,
  protopayload_auditlog.authenticationInfo.principalEmail,
  counter DESC
LIMIT
  1000

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

次のクエリは、データアクセス Cloud Audit ログを使用して、最も一般的なクエリを検索します。

SELECT
  protopayload_auditlog.servicedata_v1_bigquery.jobQueryRequest.query,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
Logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-7,'DAY'),
CURRENT_TIMESTAMP()))
WHERE
  protopayload_auditlog.methodName = "jobservice.query"
GROUP BY
  protopayload_auditlog.servicedata_v1_bigquery.jobQueryRequest.query
ORDER BY
  counter DESC
LIMIT
  1000

過去 30 日間にデータアクセス ログに記録された特に一般的な操作は何か

次のクエリは、データアクセス Cloud Audit ログを使用して、過去 30 日間に記録された特に一般的な操作を検索します。

SELECT
  protopayload_auditlog.methodName,
  resource.type,
  COUNT(*) AS counter
FROM
(TABLE_DATE_RANGE(
logging_export.cloudaudit_googleapis_com_data_access_,
DATE_ADD(CURRENT_TIMESTAMP(),-30,'DAY'),
CURRENT_TIMESTAMP())
)
GROUP BY
  protopayload_auditlog.methodName,
  resource.type
ORDER BY
  COUNTER DESC
LIMIT
  1000

次のステップ

フィードバックを送信...