🔍
【BigQuery】ドライブ監査ログをエクスポートしてみた(後編)
はじめに
前編では、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サービス境界で許可する必要があります。
実施手順
- VM用のサービスアカウント作成
- サービスアカウントのアクセスレベル登録
- VPCサービス境界の作成
1. VM用のサービスアカウント作成
- ログ出力用サービスアカウント(
gapps-reports
)をAccess Context Managerのアクセスレベルに登録するには、以下のような制約があります。
- 組織レベルを指定した状態で[IAMと管理] > [IAM]を開きます。
- gcloudコマンドを実行するためのVMにアタッチするサービスアカウントを追加します。
- サービスアカウントには
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
が作成されていることは
認識していましたが、実際にログを見てみることで確実に特定できました。
意外と色々と設定する必要があったので、前編と合わせて試して頂けると幸いです^^
Discussion