1. 目的
データ基盤の運用において、「誰がいつどのデータにアクセスしたか」という証跡ログ(監査ログ)は、セキュリティインシデントの調査やコンプライアンス対応の場面で欠かせない情報です。
不審なアクセスの追跡やコスト増大の原因究明など、ログがなければ事後の調査が困難になります。
しかし Lightdash は BigQuery へのクエリをサービスアカウント経由で発行するため、BigQuery の標準的なジョブ履歴では実行者がサービスアカウント名しか表示されず、「実際に操作したのは誰か」を特定することができません。
Lightdash はこの問題を補うように、クエリ発行時にジョブラベルとしてユーザー UUID を付与しています。
Google Cloud の Cloud Audit Logs を BigQuery にエクスポートすることで、このラベルを SQL で検索できるようになり、クエリを実行した Lightdash ユーザーを特定できるようになります。
2. 前提
- Lightdash が Google Cloud プロジェクト上で動作していること
- Lightdash のデータウェアハウスとして BigQuery を使用していること
- Google Cloud プロジェクトへの管理者権限を持っていること
3. 構成図
Lightdash は BigQuery にクエリを実行するたびに、Cloud Logging に Data Access ログが記録されます。
ログシンクがそのログを自動的に BigQuery の audit_log データセットへ転送します。
管理者は BigQuery コンソールから SQL を使ってクエリ実行者を確認できます。
4. 設定方法
設定の全体像は次のとおりです。
- BigQuery の Data Access 監査ログを有効化する
- ログ保存先の BigQuery データセットを作成する
- Cloud Logging のログシンクを作成する
- シンクのサービスアカウントにデータセットへの書き込み権限を付与する
4-1. BigQuery Data Access 監査ログを有効化する
デフォルトでは BigQuery の Data Access ログは有効になっていません。まずこれを有効化します。
Google Cloud Console の IAM と管理 → 監査ログ では bigquery.googleapis.com のエントリが表示されない場合があります。その場合は gcloud CLI で設定します。
現在のプロジェクト IAM ポリシーをファイルに書き出します。
gcloud projects get-iam-policy YOUR_PROJECT_ID --format=yaml > policy.yaml
policy.yaml を開き、ファイルの先頭に以下のブロックを追加します。
auditConfigs:
- auditLogConfigs:
- logType: DATA_READ
- logType: DATA_WRITE
service: bigquery.googleapis.com
auditConfigs: キーがすでに存在する場合は、既存のリストに上記エントリを追記してください。
修正したポリシーを適用します。
gcloud projects set-iam-policy YOUR_PROJECT_ID policy.yaml
適用後、Cloud Logging の ログエクスプローラ で logName に cloudaudit.googleapis.com%2Fdata_access が含まれるログが流れていれば有効化されています。
4-2. ログ保存先の BigQuery データセットを作成する
Cloud Logging のログを BigQuery に蓄積するため、保存先のデータセットを作成します。
BigQuery コンソールを開き、以下の設定でデータセットを作成します。
| 項目 | 値 |
|---|---|
| データセット ID | audit_log |
| ロケーション |
asia-northeast1(東京) |
4-3. Cloud Logging のログシンクを作成する
Cloud Logging の ログルーター に、BigQuery Data Access ログを上記データセットへ転送するシンクを作成します。
Cloud Logging → ログルーター → シンクを作成 から以下のとおり設定します。
| 項目 | 値 |
|---|---|
| シンクのサービス | BigQuery データセット |
| シンク名 | bigquery-data-access |
| 宛先データセット | 4-2 で作成した audit_log
|
| パーティション分割テーブルを使用する | 有効 |
包含フィルタ には以下を入力します(my-lightdash はご自身のプロジェクト ID に置き換えてください)。
logName="projects/my-lightdash/logs/cloudaudit.googleapis.com%2Fdata_access"
AND protoPayload.serviceName="bigquery.googleapis.com"
4-4. シンクのサービスアカウントに書き込み権限を付与する
ログシンクを作成すると、専用のサービスアカウントが自動生成されます。このサービスアカウントが audit_log データセットに書き込めるよう権限を付与します。
ライター ID を確認する
ログルーターでシンクの詳細を開き、ライター ID を確認します。
serviceAccount:p123456789-XXXXXXX@gcp-sa-logging.iam.gserviceaccount.com のような形式です。
BigQuery データセットに権限を付与する
- BigQuery コンソールで
audit_logデータセットを選択 - 共有 → 権限を追加 を開く
- 上記ライター ID を入力し、ロールに BigQuery データ編集者(
roles/bigquery.dataEditor)を付与
以上で設定は完了です。Lightdash でクエリが実行されると、数分後に audit_log データセットの cloudaudit_googleapis_com_data_access テーブルにレコードが蓄積されます。
設定完了以前のクエリは記録されません。ログシンク作成後に実行されたクエリから記録が始まります。
5. 確認方法
Lightdash が付与するジョブラベル
Lightdash は BigQuery へのクエリに以下のジョブラベルを自動で付与します。これが監査ログに記録されます。
| ラベルキー | 内容 |
|---|---|
user_uuid |
Lightdash のユーザー UUID |
project_uuid |
プロジェクト UUID |
organization_uuid |
組織 UUID |
explore_name |
クエリ対象の Explore 名 |
query_context |
実行コンテキスト(exploreview / calculatetotal など) |
query_uuid |
クエリ UUID |
SQL でクエリ実行者の一覧を取得する
BigQuery コンソールで以下のクエリを実行します。
my-lightdash と datasource@my-lightdash.iam.gserviceaccount.com はご自身の環境に合わせて書き換えてください。
WITH base AS (
SELECT
(
SELECT value
FROM UNNEST(
protopayload_auditlog
.servicedata_v1_bigquery
.jobCompletedEvent
.job
.jobConfiguration
.labels
)
WHERE key = 'user_uuid'
) AS user_uuid,
COUNT(*) AS query_count
FROM
`my-lightdash.audit_log.cloudaudit_googleapis_com_data_access`
WHERE
timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND protopayload_auditlog.methodName = 'jobservice.jobcompleted'
AND protopayload_auditlog.authenticationInfo.principalEmail
= 'datasource@my-lightdash.iam.gserviceaccount.com'
GROUP BY user_uuid
)
SELECT user_uuid, query_count
FROM base
WHERE user_uuid IS NOT NULL
ORDER BY query_count DESC
各条件の意図:
| 条件 | 理由 |
|---|---|
methodName = 'jobservice.jobcompleted' |
クエリ完了イベントのみに絞る |
principalEmail = 'datasource@...' |
Lightdash が BigQuery へアクセスする際のサービスアカウントに絞る |
user_uuid IS NOT NULL |
ラベルを持たない(Lightdash 以外からの)クエリを除外する |
想定される結果:
| user_uuid | query_count |
|---|---|
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
42 |
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy |
15 |
zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz |
3 |
期間を変えたい場合は INTERVAL 24 HOUR を INTERVAL 7 DAY などに変更してください。
ユーザー名・メールアドレスを確認する
取得した user_uuid から実際のユーザー情報を確認するには、Lightdash の管理画面を使います。
- Lightdash に管理者アカウントでログイン
- 右上のアカウントアイコン → Organization settings
- Users & Groups → ユーザー一覧から UUID を照合
あるいは、Lightdash が接続している PostgreSQL データベースに直接クエリを発行することでも確認できます。
SELECT
u.user_uuid,
u.first_name,
u.last_name,
e.email
FROM users u
JOIN emails e ON e.user_id = u.user_id
WHERE u.user_uuid = ANY(ARRAY[
'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy'
])
ORDER BY u.last_name, u.first_name;
まとめ
Cloud Audit Logs を BigQuery にエクスポートする設定を行うことで、Lightdash のクエリ実行者を SQL で確認できるようになります。Lightdash 自身がジョブラベルに user_uuid を付与してくれるため、サービスアカウント経由のアクセスでもユーザーレベルのトレーサビリティが得られます。



