0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lightdash のクエリ実行者を Cloud Audit Logs で追跡する

0
Last updated at Posted at 2026-05-06

1. 目的

データ基盤の運用において、「誰がいつどのデータにアクセスしたか」という証跡ログ(監査ログ)は、セキュリティインシデントの調査やコンプライアンス対応の場面で欠かせない情報です。
不審なアクセスの追跡やコスト増大の原因究明など、ログがなければ事後の調査が困難になります。

しかし Lightdash は BigQuery へのクエリをサービスアカウント経由で発行するため、BigQuery の標準的なジョブ履歴では実行者がサービスアカウント名しか表示されず、「実際に操作したのは誰か」を特定することができません。

Lightdash はこの問題を補うように、クエリ発行時にジョブラベルとしてユーザー UUID を付与しています。
Google Cloud の Cloud Audit Logs を BigQuery にエクスポートすることで、このラベルを SQL で検索できるようになり、クエリを実行した Lightdash ユーザーを特定できるようになります。

2. 前提

  • Lightdash が Google Cloud プロジェクト上で動作していること
  • Lightdash のデータウェアハウスとして BigQuery を使用していること
  • Google Cloud プロジェクトへの管理者権限を持っていること

3. 構成図

architecture.png

Lightdash は BigQuery にクエリを実行するたびに、Cloud Logging に Data Access ログが記録されます。
ログシンクがそのログを自動的に BigQuery の audit_log データセットへ転送します。
管理者は BigQuery コンソールから SQL を使ってクエリ実行者を確認できます。

4. 設定方法

設定の全体像は次のとおりです。

  1. BigQuery の Data Access 監査ログを有効化する
  2. ログ保存先の BigQuery データセットを作成する
  3. Cloud Logging のログシンクを作成する
  4. シンクのサービスアカウントにデータセットへの書き込み権限を付与する

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 の ログエクスプローラlogNamecloudaudit.googleapis.com%2Fdata_access が含まれるログが流れていれば有効化されています。

4-2. ログ保存先の BigQuery データセットを作成する

Cloud Logging のログを BigQuery に蓄積するため、保存先のデータセットを作成します。

BigQuery コンソールを開き、以下の設定でデータセットを作成します。

項目
データセット ID audit_log
ロケーション asia-northeast1(東京)

image.png

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"

image.png

4-4. シンクのサービスアカウントに書き込み権限を付与する

ログシンクを作成すると、専用のサービスアカウントが自動生成されます。このサービスアカウントが audit_log データセットに書き込めるよう権限を付与します。

ライター ID を確認する

ログルーターでシンクの詳細を開き、ライター ID を確認します。
serviceAccount:p123456789-XXXXXXX@gcp-sa-logging.iam.gserviceaccount.com のような形式です。

image.png

BigQuery データセットに権限を付与する

  1. BigQuery コンソールで audit_log データセットを選択
  2. 共有権限を追加 を開く
  3. 上記ライター 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-lightdashdatasource@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 HOURINTERVAL 7 DAY などに変更してください。

ユーザー名・メールアドレスを確認する

取得した user_uuid から実際のユーザー情報を確認するには、Lightdash の管理画面を使います。

  1. Lightdash に管理者アカウントでログイン
  2. 右上のアカウントアイコン → Organization settings
  3. 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 を付与してくれるため、サービスアカウント経由のアクセスでもユーザーレベルのトレーサビリティが得られます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?