監査ログについて

このページでは、Cloud 監査ログのログエントリの構造、読み取り方法、解釈方法など、Cloud 監査ログのログエントリの詳細について説明します。

Cloud Audit Logs では、Google Cloud プロジェクト、フォルダ、組織ごとに以下の監査ログが保存されます。

  • 管理アクティビティ監査ログ
  • データアクセス監査ログ
  • システム イベント監査ログ
  • ポリシー拒否監査ログ

Cloud Audit Logging の概要については、Cloud Audit Logging をご覧ください。

監査ログエントリの形式

監査ログエントリは、Stackdriver Logging ログエントリの一種です。すべての Logging ログエントリと同様に、監査ログエントリは LogEntry オブジェクトに格納されます。監査ログエントリと他のログエントリを区別するのが protoPayload フィールドです。監査ログエントリには、ログエントリの protoPayload フィールドに AuditLog 監査ログデータを格納するオブジェクトが含まれています。

つまり、すべての監査ログエントリには次の情報が保存されます。

  • ログエントリを所有するプロジェクト、フォルダ、または組織。
  • ログエントリが適用されるリソース。この情報は、モニタリング対象リソースリストのリソースタイプと特定のインスタンスを表す追加の値で構成されます。たとえば、単一の Compute Engine VM インスタンスまたはすべての VM インスタンスからの監査ログエントリを表示できます。
  • タイムスタンプ
  • サービス。サービスは、Compute Engine、Cloud SQL、Pub/Sub などの個々の Google Cloud サービスです。各サービスは名前で識別されます。Compute Engine は compute.googleapis.com、Cloud SQL は cloudsql.googleapis.com などです。この情報は、監査ログエントリの protoPayload.serviceName フィールドにリストされます。

    リソースタイプは単一のサービスに属しますが、サービスは複数のリソースタイプを持つことができます。サービスとリソースのリストについては、サービスとリソースのマッピングをご覧ください。

  • ペイロード。protoPayload 型になります。各監査ログエントリのペイロードは、AuditLog タイプのオブジェクトで、serviceNameauthenticationInfo といった、Cloud 監査ログに固有の一連のフィールドを定義します。また、Google Cloud サービスで監査ログエントリ内のサービス固有情報をリストするために使用される、オプション フィールドの metadata も含まれています。一部の Google Cloud サービスでは、古い serviceData フィールドを引き続き使用してサービス固有の情報を一覧表示します。serviceData フィールドを使用するサービスのリストについては、サービス固有の監査データをご覧ください。

  • ログ名。監査ログエントリは、プロジェクト、フォルダ、組織内のログに属します。ログ名は次のとおりです。

   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Factivity
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Factivity
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fpolicy

プロジェクト、フォルダ、または組織内では、これらのログ名は通常、activitydata_accesssystem_eventpolicy の略です。

監査ログ エントリの例

ここではサンプルの監査ログエントリを使用して、監査ログエントリに記述されている最も重要な情報を見つける方法について説明します。

以下のサンプルは、App Engine によって書き込まれた管理アクティビティの監査ログエントリであり、PROJECT_ID my-gcp-project-id で Identity and Access Management(IAM)ポリシーの変更内容が記録されています。わかりやすくするため、一部のログエントリは省略し、一部のフィールドはハイライト表示してあります。

    {
      protoPayload: {
        @type: "type.googleapis.com/google.cloud.audit.AuditLog",
        status: {},
        authenticationInfo: {
          principalEmail: "user@example.com"
        },
        serviceName: "appengine.googleapis.com",
        methodName: "SetIamPolicy",
        authorizationInfo: [...],
        serviceData: {
          @type: "type.googleapis.com/google.appengine.legacy.AuditData",
          policyDelta: { bindingDeltas: [
              action: "ADD",
              role: "roles/logging.privateLogViewer",
              member: "user:user@example.com"
          ], }
        },
        request: {
          resource: "my-gcp-project-id",
          policy: { bindings: [...], }
        },
        response: {
          bindings: [
            {
              role: "roles/logging.privateLogViewer",
              members: [ "user:user@example.com" ]
            }
          ],
        }
      },
      insertId: "53179D9A9B559.AD6ACC7.B40604EF",
      resource: {
        type: "gae_app",
        labels: { project_id: "my-gcp-project-id" }
      },
      timestamp: "2019-05-27T16:24:56.135Z",
      severity: "NOTICE",
      logName: "projects/my-gcp-project-id/logs/cloudaudit.googleapis.com%2Factivity",
    }

次に、上記の監査ログエントリのサンプルを選択するために使用されたクエリを示します。それはログ エクスプローラ、Logging API、または Google Cloud CLI で使用できます。プロジェクト識別子がログの名前に含まれており、logName フィールドがインデックス付けされていることから、クエリは高速です。

    resource.type = "gae_app"
    logName = "projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity"

gce_instance のようにリソースタイプの単一インスタンスから監査ログを検索する場合は、インスタンス修飾子を追加します。

    resource.type = "gce_instance"
    resource.instance_id = "INSTANCE_ID"
    logName = "projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity"

サンプル監査ログエントリの解釈

上記の監査ログエントリの例に示されている protoPayloadinsertIdresourcetimestampseveritylogName のフィールドは LogEntry オブジェクトの一部です。protoPayload フィールドの値は AuditLog オブジェクトです。これは監査ログデータをカプセル化しています。

上記の監査ログエントリのサンプルについて、次のような疑問が生じるかもしれません。

  • これは監査ログエントリなのか? 次の 2 つのことから、監査ログエントリであることがわかります。

    • protoPayload.@type フィールドは type.googleapis.com/google.cloud.audit.AuditLog です。

    • logName フィールドにはドメイン cloudaudit.googleapis.com が含まれています。

  • 監査ログを書き込んだサービスは何なのか?ログは App Engine によって書き込まれます。この情報は、監査ログエントリの protoPayload.serviceName フィールドにリストされます。

  • 監査対象オペレーションは何なのか?監査対象は protoPayload.methodName フィールドで指定されている SetIamPolicy です。監査されるオペレーションの詳細については、protoPayload.serviceDataAuditData オブジェクトをご覧ください。

  • 監査対象のリソースは何なのか?Google Cloud のプロジェクト my-gcp-project-id に関連付けられている App Engine で実行中のアプリケーションが監査対象になります。これは、リソースタイプ gae_app とプロジェクト識別子 my-gcp-project-id を指定する resource フィールドから判断できます。この例では、モニタリング対象リソース項目リストでリソースタイプの詳細を確認できます。

詳細については、LogEntry タイプAuditLog タイプIAM AuditData タイプをご覧ください。

長時間実行オペレーションの監査ログ

長時間実行オペレーションの API は、監査ログを 2 回出力します。1 回は API が呼び出されてオペレーションが開始されたときで、もう 1 回はオペレーションが完了したときです。

In this case, the LogEntry object contains an operation field. 同じオペレーションのログエントリでは、LogEntry.operation.idLogEntry.operation.producer の両方が同じ値になります。最初に書き込まれたログには LogEntry.operation.first=true が、完了ログには LogEntry.operation.last=true が含まれています。

オペレーションがすぐに完了した場合は、LogEntry.operation.first=trueLogEntry.operation.last=true の両方を含むログが 1 つだけ存在します。

これらの API にはオペレーション サービスが実装されています。このサービスは通常、呼び出されたときに監査ログを出力します。呼び出される API に応じて、protoPayload.methodName は次のいずれかになります。

  • google.longrunning.Operations.ListOperations
  • google.longrunning.Operations.GetOperation
  • google.longrunning.Operations.CancelOperation
  • google.longrunning.Operations.WaitOperation
  • google.longrunning.Operations.DeleteOperation

この API は長時間実行オペレーションに関するメタデータを返しますが、長時間実行オペレーション自体ではないため、この場合は LogEntry.operation は指定されません。

監査対象の API の詳細については、監査ログ付きの Google サービスをご覧ください(サービスによって異なる場合があるため)。

ストリーミング API の監査ログ

長時間実行オペレーションと同様に、ストリーミング API では監査ログが 2 回出力されます。1 回は API が最初に呼び出されたときで、もう 1 回はストリーミング接続が終了したときです。

この場合、LogEntry オブジェクトには operation フィールドが含まれ、同じオペレーションのログエントリの LogEntry.operation.idLogEntry.operation.producer の値は同じです。最初に書き込まれるログには LogEntry.operation.first=true、完了ログには LogEntry.operation.last=true が含まれます。

この API では、ストリームが開始している状態であることを示すために、LogEntry.operation.firstLogEntry.operation.last のどちらも設定されていない継続ログが出力される場合もあります。

サービス固有の監査データ

一部のサービスでは、監査ログの serviceData フィールドに補足データ構造を配置することにより、AuditLog に格納されている情報を拡張します。次の表は、serviceData フィールドを使用するサービスをリストし、それらの AuditData タイプへのリンクを示しています。

サービス サービスのデータ型
App Engine type.googleapis.com/google.appengine.v1.AuditData
App Engine(レガシー) type.googleapis.com/google.appengine.legacy.AuditData
BigQuery type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData
IAM type.googleapis.com/google.iam.v1.logging.AuditData

監査ログの表示

すべての監査ログに対してクエリを実行することも、監査ログ名でログをクエリすることもできます。監査ログ名には、Google Cloud プロジェクト、フォルダ、請求先アカウント、または監査ロギング情報を表示する組織のリソース識別子が含まれています。クエリでは、インデックス付きの LogEntry フィールドを指定できます。SQL クエリをサポートする [ログ分析] ページを使用する場合は、クエリ結果をグラフとして表示できます。

ログのクエリの詳細については、次のページをご覧ください。

Google Cloud コンソール、Google Cloud CLI、または Logging API を使用して、Cloud Logging で監査ログを表示できます。

Console

Google Cloud コンソールでは、ログ エクスプローラを使用して、Google Cloud プロジェクト、フォルダ、または組織の監査ログエントリを取得できます。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが [Logging] の結果を選択します。

  2. 既存の Google Cloud プロジェクト、フォルダ、または組織を選択します。

  3. すべての監査ログを表示するには、次のいずれかのクエリを [クエリエディタ] フィールドに入力し、[クエリを実行] をクリックします。

    logName:"cloudaudit.googleapis.com"
    
    protoPayload."@type"="type.googleapis.com/google.cloud.audit.AuditLog"
    
  4. 特定のリソースと監査ログタイプの監査ログを表示するには、[クエリビルダー] ペインで次の操作を行います。

    • リソースタイプに、表示する監査ログを含む Google Cloud リソースを選択します。

    • [ログ名] で、表示する監査ログタイプを選択します。

      • 管理アクティビティ監査ログの場合は、[activity] を選択します。
      • データアクセス監査ログの場合は、[data_access] を選択します。
      • システム イベント監査ログの場合は、[system_event] を選択します。
      • ポリシー拒否監査ログの場合は、[policy] を選択します。
    • [クエリを実行] をクリックします。

    これらのオプションが表示されない場合、Google Cloud プロジェクト、フォルダ、または組織で利用可能なその種類の監査ログは存在しないことを意味します。

    ログ エクスプローラでログを表示する際に問題が発生した場合は、トラブルシューティングの情報をご覧ください。

    ログ エクスプローラを使用したクエリの詳細については、ログ エクスプローラでクエリを作成するをご覧ください。 Gemini を使用してログ エクスプローラでログエントリを要約する方法については、Gemini アシスト機能を使用してログエントリを要約するをご覧ください。

gcloud

Google Cloud CLI は、Logging API へのコマンドライン インターフェースを提供します。ログ名ごとに有効なリソース識別子を指定します。たとえば、クエリに PROJECT_ID が含まれている場合、指定するプロジェクト ID は、現在選択された Google Cloud プロジェクトを参照している必要があります。

Google Cloud プロジェクト レベルの監査ログエントリを読み取るには、次のコマンドを実行します。

gcloud logging read "logName : projects/PROJECT_ID/logs/cloudaudit.googleapis.com" \
    --project=PROJECT_ID

フォルダレベルの監査ログエントリを読み取るには、次のコマンドを実行します。

gcloud logging read "logName : folders/FOLDER_ID/logs/cloudaudit.googleapis.com" \
    --folder=FOLDER_ID

組織レベルの監査ログエントリを読み取るには、次のコマンドを実行します。

gcloud logging read "logName : organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com" \
    --organization=ORGANIZATION_ID

Cloud 請求先アカウント レベルの監査ログエントリを読み取るには、次のコマンドを実行します。

gcloud logging read "logName : billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com" \
    --billing-account=BILLING_ACCOUNT_ID

1 日以上経過したログを読み取るには、コマンドに --freshness フラグを追加します。

gcloud CLI の使用方法に関する詳細については、gcloud logging read をご覧ください。

API

クエリを作成するときは、ログ名ごとに有効なリソース識別子を指定します。たとえば、クエリに PROJECT_ID が含まれている場合、指定するプロジェクト ID は、現在選択された Google Cloud プロジェクトを参照している必要があります。

たとえば、Logging API を使用してプロジェクト レベルの監査ログエントリを表示する手順は次のとおりです。

  1. entries.list メソッドのドキュメント内の [Try this API] セクションに移動します。

  2. [Try this API] フォームのリクエストの本文に、次のコードを入力します。この事前入力されたフォームをクリックすると、リクエストの本文が自動的に入力されますが、それぞれのログ名に有効な PROJECT_ID を指定する必要があります。

    {
      "resourceNames": [
        "projects/PROJECT_ID"
      ],
      "pageSize": 5,
      "filter": "logName : projects/PROJECT_ID/logs/cloudaudit.googleapis.com"
    }
    
  3. [実行] をクリックします。