🔍

【BigQuery】ドライブ監査ログをエクスポートしてみた(後編)

11 min read

はじめに

前編では、BigQuery Export機能を使ったドライブ監査ログの出力方法を紹介しました。
後編の今回は、VPC Service Controlsを有効化した場合の設定について紹介します。

実行環境

Product version
Google Workspace Enterprise Edition
BigQuery 2021年12月5日時点
VPC Service Controls 2021年12月5日時点

【構成図】

【補足】
・ Google WorkspceとBigQueryは同じ組織に所属しています。

前提

  • 何も考えずにVPCサービス境界でBigQueryを囲い込むとログは出力されなくなります。
  • Cloud Loggingでログを見る[1]とエラーログが3件出ていることが分かります。

  • ログの詳細は以下の通りになります。
ERROR_MESSAGE1
{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ",
      "details": [
        {
          "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
          "violations": [
            {
              "type": "VPC_SERVICE_CONTROLS",
              "description": "E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ"
            }
          ]
        }
      ]
    },
    "authenticationInfo": {
      "principalEmail": "gapps-reports@system.gserviceaccount.com"
    },
    "requestMetadata": {
      "requestAttributes": {},
      "destinationAttributes": {}
    },
    "serviceName": "bigquery.googleapis.com",
    "methodName": "permission:bigquery.datasets.create",
    "resourceName": "projects/xxxxxxxxxxxx",
    "metadata": {
      "ingressViolations": [
        {
          "targetResourcePermissions": [
            "bigquery.datasets.create"
          ],
          "targetResource": "projects/xxxxxxxxxxxx",
          "servicePerimeter": "accessPolicies/xxxxxxxxxxx/servicePerimeters/from_my_home"
        }
      ],
      "vpcServiceControlsUniqueId": "E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ",
      "violationReason": "NO_MATCHING_ACCESS_LEVEL",
      "securityPolicyInfo": {
        "servicePerimeterName": "accessPolicies/xxxxxxxxxxx/servicePerimeters/from_my_home",
        "organizationId": "xxxxxxxxxxxx"
      },
      "@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata",
      "resourceNames": [
        "projects/xxxxxxxxxxxx"
      ]
    }
  },
  "insertId": "lxecooeb98md",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "service": "bigquery.googleapis.com",
      "method": "permission:bigquery.datasets.create",
      "project_id": "composed-arbor-332218"
    }
  },
  "timestamp": "2021-11-29T13:09:36.774176499Z",
  "severity": "ERROR",
  "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Fpolicy",
  "receiveTimestamp": "2021-11-29T13:09:36.890253258Z"
}
ERROR_MESSAGE2
{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ."
    },
    "authenticationInfo": {
      "principalEmail": "gapps-reports@system.gserviceaccount.com"
    },
    "requestMetadata": {
      "requestAttributes": {},
      "destinationAttributes": {}
    },
    "serviceName": "bigquery.googleapis.com",
    "methodName": "datasetservice.insert",
    "authorizationInfo": [
      {
        "resource": "projects/composed-arbor-332218",
        "permission": "bigquery.datasets.create",
        "resourceAttributes": {}
      }
    ],
    "resourceName": "projects/composed-arbor-332218/datasets",
    "serviceData": {
      "@type": "type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData",
      "datasetInsertRequest": {
        "resource": {
          "datasetName": {
            "projectId": "composed-arbor-332218",
            "datasetId": "test_dataset01"
          },
          "info": {},
          "acl": {}
        }
      },
      "datasetInsertResponse": {
        "resource": {
          "datasetName": {},
          "info": {},
          "acl": {}
        }
      }
    },
    "resourceLocation": {
      "currentLocations": [
        "US"
      ]
    }
  },
  "insertId": "-1xu7wfdomww",
  "resource": {
    "type": "bigquery_resource",
    "labels": {
      "project_id": "composed-arbor-332218"
    }
  },
  "timestamp": "2021-11-29T13:09:36.786871Z",
  "severity": "ERROR",
  "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Factivity",
  "receiveTimestamp": "2021-11-29T13:09:37.260699618Z"
}
ERROR_MESSAGE3
{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 7,
      "message": "VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ."
    },
    "authenticationInfo": {
      "principalEmail": "gapps-reports@system.gserviceaccount.com"
    },
    "requestMetadata": {
      "requestAttributes": {},
      "destinationAttributes": {}
    },
    "serviceName": "bigquery.googleapis.com",
    "methodName": "google.cloud.bigquery.v2.DatasetService.InsertDataset",
    "authorizationInfo": [
      {
        "resource": "projects/composed-arbor-332218",
        "permission": "bigquery.datasets.create",
        "resourceAttributes": {}
      }
    ],
    "resourceName": "projects/composed-arbor-332218/datasets/test_dataset01",
    "metadata": {
      "@type": "type.googleapis.com/google.cloud.audit.BigQueryAuditMetadata",
      "datasetCreation": {
        "dataset": {
          "datasetName": "projects/composed-arbor-332218/datasets/test_dataset01",
          "acl": {
            "policy": {}
          }
        },
        "reason": "CREATE"
      }
    }
  },
  "insertId": "-1xu7wfdomwy",
  "resource": {
    "type": "bigquery_dataset",
    "labels": {
      "project_id": "composed-arbor-332218",
      "dataset_id": "test_dataset01"
    }
  },
  "timestamp": "2021-11-29T13:09:36.788652Z",
  "severity": "ERROR",
  "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Factivity",
  "receiveTimestamp": "2021-11-29T13:09:37.260699618Z"
}

【解説】
・ principalEmailにgapps-reports@system.gserviceaccount.comと表示されています。
・ このアカウントはBigQueryにログ出力するためのサービスアカウントになります。
・ このアカウントからのアクセスをVPCサービス境界で許可する必要があります。

実施手順

  1. VM用のサービスアカウント作成
  2. サービスアカウントのアクセスレベル登録
  3. VPCサービス境界の作成

1. VM用のサービスアカウント作成

  • ログ出力用サービスアカウント(gapps-reports)をAccess Context Managerのアクセスレベルに登録するには、以下のような制約があります。

サービスアカウントの登録は管理コンソールからは実施できないため、gcloudコマンドで実施する必要があります。[2]
また、Cloud ShellではAccess Context Managerの操作はできないため、Compute Engineなどの環境から実施する必要があります。

  • 組織レベルを指定した状態で[IAMと管理] > [IAM]を開きます。
  • gcloudコマンドを実行するためのVMにアタッチするサービスアカウントを追加します。
  • サービスアカウントには Access Context Manager編集者 ロールを割り当てます。

Access Content Managerは組織レベルで操作するサービスになります。プロジェクトレベルの[IAMと管理]でサービスアカウントに Access Context Manager編集者 ロールを割り当てても権限付与されません。

2. サービスアカウントのアクセスレベル登録

  • [APIとサービス] > [ダッシュボード]を開き、[APIとサービスの有効化]をクリックします。

  • Access Context Manager APIを有効化します。

  • [Compute Engine] > [VMインスタンス]を開きます。
  • 作業用VMにサービスアカウント(for_vm)をアタッチした状態で起動します。
  • まず、下記コマンドで登録するサービスアカウントのリストを作成します。
登録するサービスアカウントのリスト作成
$ vi memberspec.yaml
  • memberspec.yamlの中身には下記内容を記載して保存します。
memberspec.yaml
- members:
  - serviceAccount:gapps-reports@system.gserviceaccount.com
  • gcloudコマンドでサービスアカウント(gapps-reports)をアクセスレベル登録します。
アクセスレベルの追加設定
$ gcloud access-context-manager levels create export_gdrive_auditlog_access \
    --basic-level-spec=memberspec.yaml \
    --combine-function=OR \
    --description="Access level for export Google Drive auditlog permission." \
    --title="Access_Level for Export Google Drive AuditLog"
  • 以下のメッセージが出力されればOKです。
Create request issued for: [export_gdrive_auditlog_access]
Created level [export_gdrive_auditlog_access].
  • export_gdrive_auditlog_accessという名前のアクセスレベルが作成されます。

3. VPCサービス境界の作成

  • [セキュリティ] > [VPC Service Controls]を開き、[新しい境界]をクリックします。

  • 以下の設定値でサービス境界を作成します。
項目 備考
境界名 for_reports 任意の名前を入力します
境界のタイプ 標準境界 デフォルトのまま
プロジェクト My Project 89493 保護したいBigQueryのあるプロジェクトを指定します
サービス名 BigQuery API 保護したいサービスAPIを指定します
VPCのアクセス可能なサービス すべてのサービス デフォルトのまま
上りポリシー: アクセスレベル Access_Level for Export Google Drive AuditLog 登録したアクセスレベルを指定します
Ingress rules なし デフォルトのまま
Egress rules なし デフォルトのまま
  • サービス境界で囲い込まれたため、登録したアクセスレベル以外からはBigQueryにアクセスできなくなります。(データセットが表示されません)

まとめ

さて、いかがでしたでしょうか?

Google Workspaceの監査ログとなるとそれなりにセキュリティを確保する必要があると思います。
BigQueryに監査ログを書き込む操作をIPアドレスでは制御できないと思っていましたが
Cloud Loggingでサービスアカウントを特定できたので、VPCサービス境界で制御できました。

Google Workspace管理コンソールでBigQuery Exportの設定をしたタイミングで
Cloud IAMにgapps-reports@system.gserviceaccount.comが作成されていることは
認識していましたが、実際にログを見てみることで確実に特定できました。

意外と色々と設定する必要があったので、前編と合わせて試して頂けると幸いです^^

脚注
  1. VPC Service Controls 境界のトラブルシューティングに役立つ Unique Identifier ↩︎

  2. ユーザーまたはサービス アカウントによるアクセスを制限する ↩︎

Discussion

ログインするとコメントできます