Lucid 監査ログを収集する

以下でサポートされています。

このドキュメントでは、Google Cloud Storage V2 を使用して Lucid 監査ログを Google Security Operations に取り込む方法について説明します。

Lucid Software は、Lucidchart、Lucidspark、Lucidscale などのビジュアル コラボレーション スイートを提供しています。監査ログ API は Enterprise Shield のお客様専用で、アカウント アクセス、ドキュメント アクティビティ、ユーザー管理、管理者操作、チーム オペレーションなど、組織全体のセキュリティとコンプライアンスのイベントをキャプチャします。

始める前に

次の前提条件を満たしていることを確認してください。

  • Google SecOps インスタンス
  • Cloud Storage API が有効になっている GCP プロジェクト
  • GCS バケットを作成および管理する権限
  • GCS バケットの IAM ポリシーを管理する権限
  • Cloud Run サービス、Pub/Sub トピック、Cloud Scheduler ジョブを作成する権限
  • 管理者またはアカウント オーナーの権限を持つ Lucid Enterprise Shield アカウント
  • デベロッパー ツールが有効になっている Lucid デベロッパー ポータルへのアクセス

Lucid でデベロッパー ツールを有効にする

API 認証情報を作成する前に、Lucid Developer Portal にアクセスできる必要があります。デベロッパー ツールを有効にする方法は 2 つあります。

オプション 1: ユーザー設定で有効にする

  1. lucid.app にログインします。
  2. 右上にあるプロフィール アイコンをクリックします。
  3. [アカウント設定] を選択します。
  4. [デベロッパー ツールを有効にする] チェックボックスをオンにします。

オプション 2: 管理者ロールの割り当てで有効にする

  1. アカウントの所有者またはチーム管理者として lucid.app にログインします。
  2. 管理パネルに移動します。
  3. [ユーザー] セクションに移動します。
  4. 対象ユーザーを選択します。
  5. ユーザーのロールを編集し、デベロッパー ロールを割り当てます。

Lucid API アクセスを構成する

Google SecOps が監査ログを取得できるようにするには、OAuth 2.0 クライアントを作成し、account.audit.logs スコープでアカウント レベルのアクセス トークンを生成する必要があります。

OAuth 2.0 アプリケーションとクライアントを作成する

  1. Lucid Developer Portal に移動します。
  2. [アプリケーションを作成] をクリックします。
  3. アプリケーションの名前を入力します(例: Chronicle SIEM Integration)。
  4. 新しく作成したアプリケーションをクリックして、その設定にアクセスします。
  5. [OAuth 2.0] タブに移動します。
  6. OAuth 2.0 クライアントの名前を入力します(例: Chronicle Audit Log Collector)。

  7. [OAuth 2.0 クライアントを作成] をクリックします。

クライアント認証情報を記録する

OAuth 2.0 クライアントを作成すると、ポータルに認証情報が表示されます。

  • クライアント ID: 一意のクライアント ID。
  • クライアント シークレット: API シークレット キー。

重要: クライアント シークレットをコピーしてすぐに保存します。クライアント シークレットが漏洩した場合は、OAuth 2.0 設定ページの [クライアント シークレットをリセット] ボタンをクリックします。シークレットをリセットすると、統合で新しいシークレットが更新されるまで、アクセス権が直ちに取り消されます。

リダイレクト URI を登録する

  1. OAuth 2.0 設定ページで、[Add Redirect URI] をクリックします。
  2. 統合のリダイレクト URI を入力します。Lucid が提供するテスト リダイレクトを使用する場合は、次のように入力します。

    https://lucid.app/oauth2/clients/<CLIENT_ID>/redirect
    

    <CLIENT_ID> は、実際のクライアント ID に置き換えます。

アカウント レベルのアクセス トークンを取得する

Audit Logs API には、アカウント トークン(ユーザー トークンではない)が必要です。アカウント管理者は、アカウントに代わってトークンを作成する OAuth 2.0 クライアントを承認する必要があります。

  1. アカウント管理者に、ブラウザで次の承認 URL にアクセスするよう指示します。

    https://lucid.app/oauth2/authorizeAccount?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URI>&scope=account.audit.logs
    

    <CLIENT_ID> と <REDIRECT_URI> は実際の値に置き換えます。

  2. 管理者は同意画面でリクエストされた権限を確認し、[許可] をクリックします。

  3. Lucid は、認可 code クエリ パラメータを含むリダイレクト URI にリダイレクトします。

  4. トークン エンドポイントに POST リクエストを送信して、認証コードをアクセス トークンと交換します。

    curl --request POST \
      --url https://api.lucid.co/oauth2/token \
      --header 'Content-Type: application/json' \
      --data '{
        "grant_type": "authorization_code",
        "client_id": "<CLIENT_ID>",
        "client_secret": "<CLIENT_SECRET>",
        "code": "<AUTHORIZATION_CODE>",
        "redirect_uri": "<REDIRECT_URI>"
      }'
    
  5. レスポンスには access_token と refresh_token が含まれます。両方の値を安全に記録します。

API アクセスを確認する

  • テスト リクエストを作成して、アクセス トークンが機能することを確認します。

    curl --request GET \
      --url 'https://api.lucid.co/auditLogs?pageSize=1' \
      --header 'Authorization: Bearer <ACCESS_TOKEN>' \
      --header 'Lucid-Api-Version: 1' \
      --header 'Accept: application/json'
    

成功すると、監査ログイベントの JSON 配列が返されます。

必要な API 権限

  • OAuth 2.0 クライアントには次のスコープが必要です。

    範囲 トークンのタイプ 目的
    account.audit.logs アカウント アカウントの監査ログイベントを取得する

Google Cloud Storage バケットを作成する

  1. Google Cloud コンソールに移動します。
  2. プロジェクトを選択するか、新しいプロジェクトを作成します。
  3. ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
  4. [バケットを作成] をクリックします。
  5. 次の構成情報を提供してください。

    設定 値
    バケットに名前を付ける グローバルに一意の名前(lucid-audit-logs-gcs など)を入力します。
    ロケーション タイプ ニーズに応じて選択します(リージョン、デュアルリージョン、マルチリージョン)。
    ロケーション 場所を選択します(例: us-central1)。
    ストレージ クラス Standard(アクセス頻度の高いログにおすすめ)
    アクセス制御 均一(推奨)
    保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする
  6. [作成] をクリックします。

Cloud Run functions のサービス アカウントを作成する

  1. GCP コンソールで、[IAM と管理>サービス アカウント] に移動します。
  2. [サービス アカウントを作成] をクリックします。
  3. 次の構成情報を指定します。
    • サービス アカウント名: 「lucid-audit-collector-sa」と入力します。
    • サービス アカウントの説明: Service account for Cloud Run function to collect Lucid audit logs と入力します。
  4. [作成して続行] をクリックします。
  5. [このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
    1. [ロールを選択] をクリックします。
    2. [ストレージ オブジェクト管理者] を検索して選択します。
    3. [+ 別のロールを追加] をクリックします。
    4. [Cloud Run 起動元] を検索して選択します。
    5. [+ 別のロールを追加] をクリックします。
    6. [Cloud Functions 起動元] を検索して選択します。
  6. [続行] をクリックします。
  7. [完了] をクリックします。

GCS バケットに対する IAM 権限を付与する

  1. [Cloud Storage] > [バケット] に移動します。
  2. バケット名(lucid-audit-logs-gcs)をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成情報を指定します。
    • プリンシパルの追加: サービス アカウントのメールアドレス(lucid-audit-collector-sa@PROJECT_ID.iam.gserviceaccount.com)を入力します。
    • ロールを割り当てる: [ストレージ オブジェクト管理者] を選択します。
  6. [保存] をクリックします。

Pub/Sub トピックの作成

  1. GCP Console で、[Pub/Sub> トピック] に移動します。
  2. [トピックを作成] をクリックします。
  3. 次の構成情報を指定します。
    • トピック ID: 「lucid-audit-trigger」と入力します。
    • その他の設定はデフォルトのままにします。
  4. [作成] をクリックします。

ログを収集する Cloud Run 関数を作成する

Cloud Run 関数は、Cloud Scheduler からの Pub/Sub メッセージによってトリガーされ、Lucid Audit Logs API からログを取得して GCS に書き込みます。

  1. GCP Console で、[Cloud Run] に移動します。
  2. [サービスを作成] をクリックします。
  3. [関数] を選択します(インライン エディタを使用して関数を作成します)。
  4. [構成] セクションで、次の構成の詳細を指定します。

    設定 値
    サービス名 lucid-audit-collector
    リージョン GCS バケットと一致するリージョンを選択します(例: us-central1)。
    ランタイム [Python 3.12] 以降を選択します。
  5. [トリガー(省略可)] セクションで、次の操作を行います。

    1. [+ トリガーを追加] をクリックします。
    2. [Cloud Pub/Sub] を選択します。
    3. [Cloud Pub/Sub トピックを選択してください] で、lucid-audit-trigger を選択します。
    4. [保存] をクリックします。
  6. [認証] セクションで、次の操作を行います。

    1. [認証が必要] を選択します。
    2. Identity and Access Management(IAM)を確認します。
  7. 下にスクロールして、[コンテナ、ネットワーキング、セキュリティ] を開きます。

  8. [セキュリティ] タブに移動します。

    • サービス アカウント: lucid-audit-collector-sa を選択します。
  9. [コンテナ] タブに移動します。

    1. [変数とシークレット] をクリックします。
    2. 環境変数ごとに [+ 変数を追加] をクリックします。
    変数名 値の例 説明
    GCS_BUCKET lucid-audit-logs-gcs GCS バケット名
    GCS_PREFIX lucid-audit ログファイルの接頭辞
    STATE_KEY lucid-audit/state.json 状態ファイルのパス
    LUCID_CLIENT_ID your-oauth-client-id Lucid OAuth 2.0 クライアント ID
    LUCID_CLIENT_SECRET your-oauth-client-secret Lucid OAuth 2.0 クライアント シークレット
    LUCID_REFRESH_TOKEN your-refresh-token Lucid OAuth 2.0 更新トークン
    LOOKBACK_HOURS 24 初期ルックバック期間
    PAGE_SIZE 200 API ページあたりのレコード数(最大 200)
    MAX_PAGES 50 実行あたりの最大ページ数
  10. [変数とシークレット] セクションで、[リクエスト] まで下にスクロールします。

    • リクエストのタイムアウト: 600 秒(10 分)を入力します。
  11. [設定] タブに移動します。

    • [リソース] セクションで次の操作を行います。
      • メモリ: 512 MiB 以上を選択します。
      • CPU: 1 を選択します。
  12. [リビジョン スケーリング] セクションで、次の操作を行います。

    • インスタンスの最小数: 0 と入力します。
    • [インスタンスの最大数] に「100」と入力します。
  13. [作成] をクリックします。

  14. サービスが作成されるまで待ちます(1 ~ 2 分)。

  15. サービスを作成すると、インライン コードエディタが自動的に開きます。

関数コードを追加する

  1. [エントリ ポイント] フィールドに「main」と入力します。
  2. インライン コードエディタで、次の 2 つのファイルを作成します。
  • main.py:

    import functions_framework
    from google.cloud import storage
    import json
    import os
    import urllib3
    from datetime import datetime, timezone, timedelta
    import re
    
    http = urllib3.PoolManager(
        timeout=urllib3.Timeout(connect=10.0, read=60.0),
        retries=False,
    )
    
    storage_client = storage.Client()
    
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'lucid-audit')
    STATE_KEY = os.environ.get('STATE_KEY', 'lucid-audit/state.json')
    LUCID_CLIENT_ID = os.environ.get('LUCID_CLIENT_ID')
    LUCID_CLIENT_SECRET = os.environ.get('LUCID_CLIENT_SECRET')
    LUCID_REFRESH_TOKEN = os.environ.get('LUCID_REFRESH_TOKEN')
    LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24'))
    PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '200'))
    MAX_PAGES = int(os.environ.get('MAX_PAGES', '50'))
    
    API_BASE = 'https://api.lucid.co'
    
    @functions_framework.cloud_event
    def main(cloud_event):
        if not all([GCS_BUCKET, LUCID_CLIENT_ID, LUCID_CLIENT_SECRET, LUCID_REFRESH_TOKEN]):
            print('Error: Missing required environment variables')
            return
    
        try:
            bucket = storage_client.bucket(GCS_BUCKET)
            state = load_state(bucket)
            now = datetime.now(timezone.utc)
    
            if isinstance(state, dict) and state.get('last_event_time'):
                try:
                    last_val = state['last_event_time']
                    if last_val.endswith('Z'):
                        last_val = last_val[:-1] + '+00:00'
                    last_time = datetime.fromisoformat(last_val)
                    last_time = last_time - timedelta(minutes=2)
                except Exception as e:
                    print(f"Warning: Could not parse last_event_time: {e}")
                    last_time = now - timedelta(hours=LOOKBACK_HOURS)
            else:
                last_time = now - timedelta(hours=LOOKBACK_HOURS)
    
            print(f"Fetching audit logs from {last_time.isoformat()} to {now.isoformat()}")
    
            access_token, new_refresh_token = refresh_access_token()
    
            if new_refresh_token:
                save_refresh_token(bucket, new_refresh_token)
    
            records, newest_event_time = fetch_audit_logs(access_token, last_time, now)
    
            if not records:
                print("No new audit log records found.")
                save_state(bucket, now.isoformat())
                return
    
            timestamp = now.strftime('%Y%m%d_%H%M%S')
            object_key = f"{GCS_PREFIX}/lucid_audit_{timestamp}.ndjson"
            blob = bucket.blob(object_key)
    
            ndjson = '\n'.join(
                [json.dumps(record, ensure_ascii=False) for record in records]
            ) + '\n'
            blob.upload_from_string(ndjson, content_type='application/x-ndjson')
    
            print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{object_key}")
    
            if newest_event_time:
                save_state(bucket, newest_event_time)
            else:
                save_state(bucket, now.isoformat())
    
            print(f"Successfully processed {len(records)} audit log records")
    
        except Exception as e:
            print(f'Error processing logs: {str(e)}')
            raise
    
    def refresh_access_token():
        url = f"{API_BASE}/oauth2/token"
        body = json.dumps({
            'grant_type': 'refresh_token',
            'refresh_token': LUCID_REFRESH_TOKEN,
            'client_id': LUCID_CLIENT_ID,
            'client_secret': LUCID_CLIENT_SECRET
        }).encode('utf-8')
    
        response = http.request(
            'POST', url,
            body=body,
            headers={'Content-Type': 'application/json'}
        )
    
        if response.status != 200:
            raise Exception(
                f"Token refresh failed: {response.status} - "
                f"{response.data.decode('utf-8')}"
            )
    
        data = json.loads(response.data.decode('utf-8'))
        access_token = data.get('access_token')
        new_refresh_token = data.get('refresh_token')
    
        if not access_token:
            raise Exception("No access_token in token refresh response")
    
        print("Successfully refreshed Lucid API access token")
        return access_token, new_refresh_token
    
    def fetch_audit_logs(access_token, start_time, end_time):
        records = []
        newest_time = None
        page_num = 0
        next_page_url = None
    
        since_str = start_time.strftime('%Y-%m-%dT%H:%M:%S.000Z')
        until_str = end_time.strftime('%Y-%m-%dT%H:%M:%S.000Z')
    
        while page_num < MAX_PAGES:
            page_num += 1
    
            if next_page_url:
                url = next_page_url
            else:
                url = (
                    f"{API_BASE}/auditLogs"
                    f"?pageSize={PAGE_SIZE}"
                    f"&since={since_str}"
                    f"&until={until_str}"
                )
    
            headers = {
                'Authorization': f'Bearer {access_token}',
                'Lucid-Api-Version': '1',
                'Accept': 'application/json'
            }
    
            response = http.request('GET', url, headers=headers)
    
            if response.status == 429:
                print(f"Rate limited on page {page_num}. Stopping pagination.")
                break
    
            if response.status != 200:
                print(
                    f"API error on page {page_num}: {response.status} - "
                    f"{response.data.decode('utf-8')}"
                )
                break
    
            page_results = json.loads(response.data.decode('utf-8'))
    
            if not page_results:
                print(f"No more results at page {page_num}")
                break
    
            records.extend(page_results)
            print(f"Page {page_num}: Retrieved {len(page_results)} events "
                  f"(total: {len(records)})")
    
            for event in page_results:
                try:
                    event_time = event.get('eventTimestamp')
                    if event_time:
                        if newest_time is None or event_time > newest_time:
                            newest_time = event_time
                except Exception as e:
                    print(f"Warning: Could not parse event time: {e}")
    
            link_header = response.headers.get('Link', '')
            next_page_url = parse_link_header(link_header)
    
            if not next_page_url:
                print(f"No next page link found. Pagination complete.")
                break
    
            if len(page_results) < PAGE_SIZE:
                break
    
        print(f"Total audit log records fetched: {len(records)} from {page_num} pages")
        return records, newest_time
    
    def parse_link_header(link_header):
        if not link_header:
            return None
    
        match = re.search(r'<([^>]+)>;\s*rel="next"', link_header)
        if match:
            return match.group(1)
        return None
    
    def load_state(bucket):
        try:
            blob = bucket.blob(STATE_KEY)
            if blob.exists():
                return json.loads(blob.download_as_text())
        except Exception as e:
            print(f"Warning: Could not load state: {e}")
        return {}
    
    def save_state(bucket, last_event_time_iso):
        try:
            state = {
                'last_event_time': last_event_time_iso,
                'last_run': datetime.now(timezone.utc).isoformat()
            }
            blob = bucket.blob(STATE_KEY)
            blob.upload_from_string(
                json.dumps(state, indent=2),
                content_type='application/json'
            )
            print(f"Saved state: last_event_time={last_event_time_iso}")
        except Exception as e:
            print(f"Warning: Could not save state: {e}")
    
    def save_refresh_token(bucket, new_refresh_token):
        try:
            token_key = f"{GCS_PREFIX}/refresh_token.json"
            blob = bucket.blob(token_key)
            blob.upload_from_string(
                json.dumps({'refresh_token': new_refresh_token}, indent=2),
                content_type='application/json'
            )
            print("Saved new refresh token to GCS")
        except Exception as e:
            print(f"Warning: Could not save refresh token: {e}")
    
  • requirements.txt:

      functions-framework==3.*
      google-cloud-storage==2.*
      urllib3>=2.0.0
      ```
    
  1. [デプロイ] をクリックして、関数を保存してデプロイします。
  2. デプロイが完了するまで待ちます(2 ~ 3 分)。

Cloud Scheduler ジョブの作成

  1. GCP Console で、[Cloud Scheduler] に移動します。
  2. [ジョブを作成] をクリックします。
  3. 次の構成情報を提供してください。

    設定 値
    名前 lucid-audit-collector-hourly
    リージョン Cloud Run functions と同じリージョンを選択する
    周波数 0 * * * *(1 時間ごと、毎正時)
    タイムゾーン タイムゾーンを選択(UTC を推奨)
    ターゲット タイプ Pub/Sub
    トピック lucid-audit-trigger を選択
    メッセージ本文 {}(空の JSON オブジェクト)
  4. [作成] をクリックします。

統合をテストする

  1. Cloud Scheduler コンソールで、ジョブ(lucid-audit-collector-hourly)を見つけます。
  2. [強制実行] をクリックして、ジョブを手動でトリガーします。
  3. 数秒待ちます。
  4. Cloud Run > [サービス] に移動します。
  5. lucid-audit-collector をクリックします。
  6. [ログ] タブをクリックします。
  7. 関数が正常に実行されたことを確認します。以下のものを探します。

    Fetching audit logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00
    Successfully refreshed Lucid API access token
    Page 1: Retrieved X events (total: X)
    Wrote X records to gs://lucid-audit-logs-gcs/lucid-audit/lucid_audit_YYYYMMDD_HHMMSS.ndjson
    Successfully processed X audit log records
    
  8. [Cloud Storage] > [バケット] に移動します。

  9. lucid-audit-logs-gcs をクリックします。

  10. lucid-audit/ フォルダに移動します。

  11. 現在のタイムスタンプで新しい .ndjson ファイルが作成されたことを確認します。

ログにエラーが表示された場合:

  • HTTP 401: LUCID_CLIENT_ID、LUCID_CLIENT_SECRET、LUCID_REFRESH_TOKEN 環境変数が正しいことを確認する
  • HTTP 403: OAuth 2.0 クライアントに account.audit.logs スコープがあり、トークンがアカウント トークンであることを確認します。
  • HTTP 429: レート制限 - 関数はページネーションを停止し、次のスケジュールされた実行で再開します。
  • 環境変数がありません: 必要な変数がすべて Cloud Run functions の構成で設定されていることを確認します。

監査ログイベントのカテゴリ

Lucid の監査ログは、次のイベント カテゴリに分類されます。

カテゴリ 説明
ログイン ユーザー ログインに関連付けられたイベント
コンテンツ ドキュメントとフォルダのアクセスと変更に関連するイベント
管理 管理者アクティビティとアカウントの変更に関連するイベント
ユーザー 個人設定に関するユーザー アクションに関連付けられたイベント
Team チーム オペレーションに関連付けられたイベント

イベントタイプとそのスキーマの完全なリストについては、Lucid 監査ログイベントのドキュメントをご覧ください。

FedRAMP 環境

Lucid FedRAMP 環境のユーザーは、異なる認証と API エンドポイントを使用します。正しいエンドポイント URL については、Lucid FedRAMP 環境のドキュメントをご覧ください。

Google SecOps サービス アカウントを取得する

  1. [SIEM 設定] > [フィード] に移動します。
  2. [Add New Feed] をクリックします。
  3. [単一フィードを設定] をクリックします。
  4. [フィード名] フィールドに、フィードの名前を入力します(例: Lucid Audit Logs)。
  5. [ソースタイプ] として [Google Cloud Storage V2] を選択します。
  6. [ログタイプ] として [Lucid] を選択します。
  7. [サービス アカウントを取得する] をクリックします。一意のサービス アカウントのメールアドレスが表示されます(例:)。

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. このメールアドレスをコピーして、次のステップで使用します。

  9. [次へ] をクリックします。

  10. 次の入力パラメータの値を指定します。

    • ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。

      gs://lucid-audit-logs-gcs/lucid-audit/
      
    • Source deletion option: 必要に応じて削除オプションを選択します。

      • なし: 転送後にファイルを削除しません(テストにおすすめ)。
      • 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
      • 転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。

    • ファイルの最大経過日数: 過去の日数以内に変更されたファイルを含めます(デフォルトは 180 日)。

    • アセットの名前空間: アセットの名前空間

    • Ingestion labels: このフィードのイベントに適用されるラベル

  11. [次へ] をクリックします。

  12. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

Google SecOps サービス アカウントに IAM 権限を付与する

Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者のロールが必要です。

  1. [Cloud Storage] > [バケット] に移動します。
  2. lucid-audit-logs-gcs をクリックします。
  3. [権限] タブに移動します。
  4. [アクセス権を付与] をクリックします。
  5. 次の構成情報を指定します。
    • プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
    • ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
  6. [保存] をクリックします。

UDM マッピング テーブル

ログフィールド UDM マッピング ロジック
document_opened additional.fields 空でない場合は、各ソースフィールドから作成されたラベルと統合されます
share_link_enable additional.fields
restricted_account_enable additional.fields
event1.documentIds additional.fields
team_folder additional.fields
method_type additional.fields
extensions.auth.type extensions.auth.type ログイン/ログアウト イベントの場合は「AUTHTYPE_UNSPECIFIED」に設定します。
eventTimestamp metadata.event_timestamp 日付照合 ISO8601 または yyyy-MM-ddTHH:mm:ss.SSSSSSZ を使用して変換されました
has_user_login metadata.event_type has_* フラグに基づいて設定します。has_user_login と has_target_user の場合は USER_LOGIN、has_user_logout と has_target_user の場合は USER_LOGOUT、has_user_resource_updated と has_target_resource と has_principal_user の場合は USER_RESOURCE_UPDATE_CONTENT、has_principal_user と has_target_application と has_target_user の場合は USER_CREATION、has_target_resource と has_principal_user の場合は USER_RESOURCE_CREATION、has_target_file と has_principal と has_target の場合は FILE_CREATION、has_target_resource の場合は USER_RESOURCE_ACCESS、has_principal_user の場合は USER_COMMUNICATION、has_principal と has_target が false の場合は STATUS_UPDATE、それ以外の場合は GENERIC_EVENT
has_user_logout metadata.event_type
has_user_resource_updated metadata.event_type
has_principal_user metadata.event_type
has_target_resource metadata.event_type
has_target_file metadata.event_type
has_principal metadata.event_type
has_target_user metadata.event_type
has_target_application metadata.event_type
has_target metadata.event_type
event1.event1Type metadata.product_event_type 値を直接コピーする
actor.actorIp principal.asset.ip 空でない場合、値が直接コピーされます
actor.actorIp principal.ip 空でない場合、値が直接コピーされます
actor.actorAccountId principal.resource.id 空でない場合、値が直接コピーされます
actor.actorClient principal.resource.name 空でない場合、値が直接コピーされます
flowId principal.resource.product_object_id 空でない場合、値が直接コピーされます
actor.actorType principal.user.attribute.roles eventType がログイン/ログアウトではなく、actor_type が空でない場合は actor_type からマージされます
actor.actorEmail principal.user.email_addresses actor_email が空でなく、有効なメールアドレスで、eventType がログイン/ログアウトでない場合に統合
actor.actorUserId principal.user.userid 空でなく、eventType がログイン/ログアウトでない場合は、値が直接コピーされます
event1.registrationMethod security_result.description 空でない場合、値が直接コピーされます
event1.source target.application 空でない場合、値が直接コピーされます
event1.publishedLink.link target.file.full_path 空でない場合、値が直接コピーされます
event1.filename target.file.names 空でない場合はマージされます
targetData._targetType target.resource.attribute.labels 空でない場合は、各ソースフィールドから作成されたラベルと統合されます
targetData._targetId target.resource.attribute.labels
event1.format target.resource.attribute.labels
event1.method target.resource.attribute.labels
event1.publishedLink.format target.resource.attribute.labels
accountId target.resource.id 空でない場合、値が直接コピーされます
event1.destinationFolderName target.resource.name 空でない場合は destinationFolderName、空でない場合は folderName、空でない場合は publishedLink.name に設定します。
event1.folderName target.resource.name
event1.publishedLink.name target.resource.name
event1.documentId target.resource.product_object_id 空でない場合、値が直接コピーされます
actor.actorType target.user.attribute.roles eventType がログイン/ログアウトの場合は actor_type から、空でない場合は event_role から統合されます
event1.role target.user.attribute.roles
actor.actorEmail target.user.email_addresses ログイン/ログアウトが有効な場合は actor_email から、_target の userEmail からマージ
targetData.userEmail target.user.email_addresses
event1.destinationFolderId target.user.product_object_id 空でない場合は destinationFolderId に設定し、空でない場合は folderId に設定します。
event1.folderId target.user.product_object_id
targetData.displayName target.user.user_display_name 空でない場合、値が直接コピーされます
actor.actorUserId target.user.userid 空でなく、eventType がログイン/ログアウトの場合、値は直接コピーされます
event1.product metadata.product_name 空でない場合は商品の値、それ以外の場合は「LUCID」
metadata.vendor_name metadata.vendor_name 「LUCID」に設定

変更ログ

このパーサーの変更ログを表示する

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。