Skyhigh Security CASB(旧 McAfee Skyhigh CASB)のログを収集する
このドキュメントでは、Google Cloud Storage V2 を使用して Skyhigh Security CASB(以前の McAfee Skyhigh CASB)ログを Google Security Operations に取り込む方法について説明します。
Skyhigh Security CASB は、クラウド サービスに可視性、コンプライアンス、データ セキュリティ、脅威保護を提供するクラウド アクセス セキュリティ ブローカー(CASB)です。SaaS、PaaS、IaaS 環境全体でユーザー アクティビティをモニタリングし、異常を検出し、DLP ポリシーを適用し、REST API を介してインシデント ログと監査ログを生成します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス
- Cloud Storage API が有効になっている GCP プロジェクト
- GCS バケットを作成および管理する権限
- GCS バケットの IAM ポリシーを管理する権限
- Cloud Run サービス、Pub/Sub トピック、Cloud Scheduler ジョブを作成する権限
- 管理者権限を持つ Skyhigh Security CASB テナント
- Skyhigh Security コンソールからの API 認証情報(クライアント ID とクライアント シークレット)
- Skyhigh Cloud Connector がインストールされ、構成されている
Google Cloud Storage バケットを作成する
- Google Cloud コンソールに移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前( skyhigh-casb-logsなど)を入力します。ロケーション タイプ ニーズに応じて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション 場所を選択します(例: us-central1)。ストレージ クラス Standard(アクセス頻度の高いログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
Skyhigh Security CASB API 認証情報を収集する
API クライアント認証情報を作成する
- Skyhigh Security コンソールにログインします。
- [設定> インフラストラクチャ> API 統合] に移動します。
- [Create API Client] をクリックします。
API クライアントの名前(
Google SecOps Integrationなど)を入力します。次のスコープを選択します。
- インシデント: CASB インシデント データへの読み取りアクセス権
- 異常: 異常イベントへの読み取りアクセス
- 監査ログ: 監査証跡への読み取りアクセス
[作成] をクリックします。
次の詳細をコピーして安全な場所に保存します。
- クライアント ID: 生成されたクライアント識別子
- クライアント シークレット: 生成されたクライアント シークレット(1 回のみ表示されます)
テナントのベース URL を取得する
Skyhigh Security コンソールにログインします。
ブラウザのアドレスバーからベース URL をメモします。形式はリージョンによって異なります。
- 米国:
https://www.myshn.net - EU:
https://www.myshn.eu - SG:
https://www.myshn.sg
- 米国:
テスト API へのアクセス
統合に進む前に、認証情報をテストします。
# Replace with your actual credentials CLIENT_ID="your-client-id" CLIENT_SECRET="your-client-secret" BASE_URL="https://www.myshn.net" # Get OAuth 2.0 access token TOKEN=$(curl -s -X POST "${BASE_URL}/shnapi/rest/external/api/v1/oauth/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") # Test API access - list incidents curl -v -H "Authorization: Bearer ${TOKEN}" \ "${BASE_URL}/shnapi/rest/external/api/v1/incidents?limit=1"
Cloud Run functions のサービス アカウントを作成する
Cloud Run functions には、GCS バケットへの書き込み権限があり、Pub/Sub によって呼び出されるサービス アカウントが必要です。
サービス アカウントの作成
- GCP コンソールで、[IAM と管理>サービス アカウント] に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成情報を指定します。
- サービス アカウント名: 「
skyhigh-casb-collector-sa」と入力します。 - サービス アカウントの説明:
Service account for Cloud Run function to collect Skyhigh Security CASB logsと入力します。
- サービス アカウント名: 「
[作成して続行] をクリックします。
[このサービス アカウントにプロジェクトへのアクセスを許可する] セクションで、次のロールを追加します。
- [ロールを選択] をクリックします。
- [ストレージ オブジェクト管理者] を検索して選択します。
- [+ 別のロールを追加] をクリックします。
- [Cloud Run 起動元] を検索して選択します。
- [+ 別のロールを追加] をクリックします。
- [Cloud Functions 起動元] を検索して選択します。
[続行] をクリックします。
[完了] をクリックします。
これらのロールは、次の操作に必要です。
- Storage オブジェクト管理者: ログを GCS バケットに書き込み、状態ファイルを管理する
- Cloud Run 起動元: Pub/Sub が関数を呼び出すことを許可します。
- Cloud Functions 起動元: 関数の呼び出しを許可する
GCS バケットに対する IAM 権限を付与する
GCS バケットに対する書き込み権限をサービス アカウントに付与します。
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
skyhigh-casb-logsなど)をクリックします。 - [権限] タブに移動します。
[アクセス権を付与] をクリックします。
次の構成情報を提供してください。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
skyhigh-casb-collector-sa@PROJECT_ID.iam.gserviceaccount.com)を入力します。 - ロールを割り当てる: [ストレージ オブジェクト管理者] を選択します。
- プリンシパルを追加: サービス アカウントのメールアドレス(例:
[保存] をクリックします。
Pub/Sub トピックの作成
Cloud Scheduler がパブリッシュし、Cloud Run 関数がサブスクライブする Pub/Sub トピックを作成します。
- GCP Console で、[Pub/Sub> トピック] に移動します。
[トピックを作成] をクリックします。
次の構成情報を提供してください。
- トピック ID: 「
skyhigh-casb-logs-trigger」と入力します。 - その他の設定はデフォルトのままにします。
- トピック ID: 「
[作成] をクリックします。
ログを収集する Cloud Run 関数を作成する
Cloud Run functions は、Cloud Scheduler からの Pub/Sub メッセージによってトリガーされ、Skyhigh Security CASB API からログを取得して GCS に書き込みます。
- GCP Console で、[Cloud Run] に移動します。
- [サービスを作成] をクリックします。
[関数] を選択します(インライン エディタを使用して関数を作成します)。
[構成] セクションで、次の構成の詳細を指定します。
設定 値 サービス名 skyhigh-casb-collectorリージョン GCS バケットと一致するリージョンを選択します(例: us-central1)。ランタイム [Python 3.12] 以降を選択します。 [トリガー(省略可)] セクションで、次の操作を行います。
- [+ トリガーを追加] をクリックします。
- [Cloud Pub/Sub] を選択します。
- [Cloud Pub/Sub トピックを選択してください] で、トピック
skyhigh-casb-logs-triggerを選択します。 - [保存] をクリックします。
[認証] セクションで、次の操作を行います。
- [認証が必要] を選択します。
- Identity and Access Management(IAM)を確認します。
下にスクロールして、[コンテナ、ネットワーキング、セキュリティ] を開きます。
[セキュリティ] タブに移動します。
- サービス アカウント: サービス アカウント
skyhigh-casb-collector-saを選択します。
- サービス アカウント: サービス アカウント
[コンテナ] タブに移動します。
- [変数とシークレット] をクリックします。
- 環境変数ごとに [+ 変数を追加] をクリックします。
変数名 値の例 説明 GCS_BUCKETskyhigh-casb-logsGCS バケット名 GCS_PREFIXskyhigh-casbログファイルの接頭辞 STATE_KEYskyhigh-casb/state.json状態ファイルのパス SKYHIGH_BASE_URLhttps://www.myshn.netSkyhigh Security のベース URL SKYHIGH_CLIENT_IDyour-client-idAPI クライアント ID SKYHIGH_CLIENT_SECRETyour-client-secretAPI クライアント シークレット MAX_RECORDS5000実行あたりの最大レコード数 PAGE_SIZE1001 ページあたりのレコード数 LOOKBACK_HOURS24初期ルックバック期間 [変数とシークレット] セクションで、[リクエスト] まで下にスクロールします。
- リクエストのタイムアウト:
600秒(10 分)を入力します。
- リクエストのタイムアウト:
[設定] タブに移動します。
- [リソース] セクションで次の操作を行います。
- メモリ: 512 MiB 以上を選択します。
- CPU: 1 を選択します。
- [リソース] セクションで次の操作を行います。
[リビジョン スケーリング] セクションで、次の操作を行います。
- インスタンスの最小数:
0と入力します。 - インスタンスの最大数:
100と入力します(または、予想される負荷に基づいて調整します)。
- インスタンスの最小数:
[作成] をクリックします。
サービスが作成されるまで待ちます(1 ~ 2 分)。
サービスを作成すると、インライン コードエディタが自動的に開きます。
関数コードを追加する
[エントリ ポイント] フィールドに「main」と入力します。
インライン コードエディタで、次の 2 つのファイルを作成します。
- main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone, timedelta import time import base64 import urllib.parse # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'skyhigh-casb') STATE_KEY = os.environ.get('STATE_KEY', 'skyhigh-casb/state.json') SKYHIGH_BASE_URL = os.environ.get('SKYHIGH_BASE_URL', '[https://www.myshn.net](https://www.myshn.net)') SKYHIGH_CLIENT_ID = os.environ.get('SKYHIGH_CLIENT_ID') SKYHIGH_CLIENT_SECRET = os.environ.get('SKYHIGH_CLIENT_SECRET') MAX_RECORDS = int(os.environ.get('MAX_RECORDS', '5000')) PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100')) LOOKBACK_HOURS = int(os.environ.get('LOOKBACK_HOURS', '24')) def get_access_token(base_url: str, client_id: str, client_secret: str) -> str: """Get OAuth 2.0 access token from Skyhigh Security.""" token_url = f"{base_url}/shnapi/rest/external/api/v1/oauth/token" body = urllib.parse.urlencode({ 'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret, }).encode('utf-8') response = http.request( 'POST', token_url, body=body, headers={'Content-Type': 'application/x-www-form-urlencoded'}, ) if response.status != 200: raise Exception(f"Failed to get access token: HTTP {response.status} - {response.data.decode('utf-8')}") token_data = json.loads(response.data.decode('utf-8')) return token_data['access_token'] @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Skyhigh Security CASB logs and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not all([GCS_BUCKET, SKYHIGH_BASE_URL, SKYHIGH_CLIENT_ID, SKYHIGH_CLIENT_SECRET]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) # Load state state = load_state(bucket, STATE_KEY) # Determine time window now = datetime.now(timezone.utc) last_time = None if isinstance(state, dict) and state.get("last_event_time"): try: last_time = parse_datetime(state["last_event_time"]) # Overlap by 2 minutes to catch any delayed events last_time = last_time - timedelta(minutes=2) except Exception as e: print(f"Warning: Could not parse last_event_time: {e}") if last_time is None: last_time = now - timedelta(hours=LOOKBACK_HOURS) print(f"Fetching logs from {last_time.isoformat()} to {now.isoformat()}") # Get OAuth token access_token = get_access_token(SKYHIGH_BASE_URL, SKYHIGH_CLIENT_ID, SKYHIGH_CLIENT_SECRET) print("Successfully obtained access token") all_records = [] newest_time = None # Fetch incidents incidents, inc_newest = fetch_logs( base_url=SKYHIGH_BASE_URL, access_token=access_token, endpoint_path="/shnapi/rest/external/api/v1/incidents", start_time=last_time, end_time=now, page_size=PAGE_SIZE, max_records=MAX_RECORDS, log_category="incidents", ) all_records.extend(incidents) if inc_newest: newest_time = inc_newest # Fetch anomalies anomalies, anom_newest = fetch_logs( base_url=SKYHIGH_BASE_URL, access_token=access_token, endpoint_path="/shnapi/rest/external/api/v1/anomalies", start_time=last_time, end_time=now, page_size=PAGE_SIZE, max_records=MAX_RECORDS, log_category="anomalies", ) all_records.extend(anomalies) if anom_newest and (newest_time is None or parse_datetime(anom_newest) > parse_datetime(newest_time)): newest_time = anom_newest if not all_records: print("No new log records found.") save_state(bucket, STATE_KEY, now.isoformat()) return # Write to GCS as NDJSON timestamp = now.strftime('%Y%m%d_%H%M%S') object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson" blob = bucket.blob(object_key) ndjson = '\n'.join([json.dumps(record, ensure_ascii=False) for record in all_records]) + '\n' blob.upload_from_string(ndjson, content_type='application/x-ndjson') print(f"Wrote {len(all_records)} records to gs://{GCS_BUCKET}/{object_key}") # Update state with newest event time if newest_time: save_state(bucket, STATE_KEY, newest_time) else: save_state(bucket, STATE_KEY, now.isoformat()) print(f"Successfully processed {len(all_records)} records") except Exception as e: print(f'Error processing logs: {str(e)}') raise def parse_datetime(value: str) -> datetime: """Parse ISO datetime string to datetime object.""" if value.endswith("Z"): value = value[:-1] + "+00:00" return datetime.fromisoformat(value) def load_state(bucket, key): """Load state from GCS.""" try: blob = bucket.blob(key) if blob.exists(): state_data = blob.download_as_text() return json.loads(state_data) except Exception as e: print(f"Warning: Could not load state: {e}") return {} def save_state(bucket, key, last_event_time_iso: str): """Save the last event timestamp to GCS state file.""" try: state = {'last_event_time': last_event_time_iso} blob = bucket.blob(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 fetch_logs(base_url: str, access_token: str, endpoint_path: str, start_time: datetime, end_time: datetime, page_size: int, max_records: int, log_category: str): """ Fetch logs from Skyhigh Security CASB API with pagination and rate limiting. Args: base_url: Skyhigh Security base URL access_token: OAuth 2.0 access token endpoint_path: API endpoint path start_time: Start time for log query end_time: End time for log query page_size: Number of records per page max_records: Maximum total records to fetch log_category: Category name for logging Returns: Tuple of (records list, newest_event_time ISO string) """ endpoint = f"{base_url.rstrip('/')}{endpoint_path}" headers = { 'Authorization': f'Bearer {access_token}', 'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'GoogleSecOps-SkyhighCASBCollector/1.0' } records = [] newest_time = None page_num = 0 backoff = 1.0 offset = 0 start_iso = start_time.strftime('%Y-%m-%dT%H:%M:%SZ') end_iso = end_time.strftime('%Y-%m-%dT%H:%M:%SZ') while True: page_num += 1 if len(records) >= max_records: print(f"Reached max_records limit ({max_records}) for {log_category}") break limit = min(page_size, max_records - len(records)) url = f"{endpoint}?start_time={start_iso}&end_time={end_iso}&offset={offset}&limit={limit}" try: response = http.request('GET', url, headers=headers) # Handle rate limiting with exponential backoff if response.status == 429: retry_after = int(response.headers.get('Retry-After', str(int(backoff)))) print(f"Rate limited (429). Retrying after {retry_after}s...") time.sleep(retry_after) backoff = min(backoff * 2, 30.0) continue backoff = 1.0 if response.status != 200: print(f"HTTP Error: {response.status} for {log_category}") response_text = response.data.decode('utf-8') print(f"Response body: {response_text}") return [], None data = json.loads(response.data.decode('utf-8')) page_results = data.get('data', data.get('results', data.get('items', []))) if not page_results: print(f"No more results (empty page) for {log_category}") break print(f"Page {page_num}: Retrieved {len(page_results)} {log_category} events") records.extend(page_results) # Track newest event time for event in page_results: try: event_time = event.get('timestamp') or event.get('created_at') or event.get('eventTime') if event_time: if newest_time is None or parse_datetime(str(event_time)) > parse_datetime(str(newest_time)): newest_time = str(event_time) except Exception as e: print(f"Warning: Could not parse event time: {e}") # If we got fewer results than requested, no more pages if len(page_results) < limit: print(f"Last page reached for {log_category}") break offset += len(page_results) except Exception as e: print(f"Error fetching {log_category} logs: {e}") return [], None print(f"Retrieved {len(records)} total {log_category} records from {page_num} pages") return records, newest_time- requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0[デプロイ] をクリックして、関数を保存してデプロイします。
デプロイが完了するまで待ちます(2 ~ 3 分)。
Cloud Scheduler ジョブの作成
Cloud Scheduler は、定期的に Pub/Sub トピックにメッセージをパブリッシュし、Cloud Run functions の関数をトリガーします。
- GCP Console で、[Cloud Scheduler] に移動します。
[ジョブを作成] をクリックします。
次の構成情報を提供してください。
設定 値 名前 skyhigh-casb-collector-hourlyリージョン Cloud Run functions と同じリージョンを選択する 周波数 0 * * * *(1 時間ごと、毎正時)タイムゾーン タイムゾーンを選択(UTC を推奨) ターゲット タイプ Pub/Sub トピック トピック「 skyhigh-casb-logs-trigger」を選択しますメッセージ本文 {}(空の JSON オブジェクト)[作成] をクリックします。
スケジュールの頻度オプション
ログの量とレイテンシの要件に基づいて頻度を選択します。
| 頻度 | CRON 式 | ユースケース |
|---|---|---|
| 5 分おき | */5 * * * * |
大容量、低レイテンシ |
| 15 分ごと | */15 * * * * |
検索量が普通 |
| 1 時間ごと | 0 * * * * |
標準(推奨) |
| 6 時間ごと | 0 */6 * * * |
少量、バッチ処理 |
| 毎日 | 0 0 * * * |
過去のデータの収集 |
統合をテストする
- Cloud Scheduler コンソールで、ジョブを見つけます。
- [強制実行] をクリックして、ジョブを手動でトリガーします。
- 数秒待ちます。
- Cloud Run > [サービス] に移動します。
skyhigh-casb-collectorをクリックします。- [ログ] タブをクリックします。
関数が正常に実行されたことを確認します。以下のものを探します。
Fetching logs from YYYY-MM-DDTHH:MM:SS+00:00 to YYYY-MM-DDTHH:MM:SS+00:00 Successfully obtained access token Page 1: Retrieved X incidents events Page 1: Retrieved X anomalies events Wrote X records to gs://skyhigh-casb-logs/skyhigh-casb/logs_YYYYMMDD_HHMMSS.ndjson Successfully processed X records[Cloud Storage] > [バケット] に移動します。
バケット名(
skyhigh-casb-logs)をクリックします。skyhigh-casb/フォルダに移動します。現在のタイムスタンプで新しい
.ndjsonファイルが作成されたことを確認します。
ログにエラーが表示された場合:
- HTTP 401: 環境変数の API 認証情報を確認します。トークンの有効期限が切れている可能性があります。
- HTTP 403: Skyhigh Security コンソールで、API クライアントに必要なスコープがあることを確認します
- HTTP 429: レート制限 - 関数はバックオフで自動的に再試行されます
- 環境変数が不足している: 必要な変数がすべて設定されていることを確認します。
Skyhigh Security CASB のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Skyhigh Security CASB Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [Log type] として [McAfee Skyhigh CASB] を選択します。
[サービス アカウントを取得する] をクリックします。一意のサービス アカウントのメールアドレスが表示されます(例:)。
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comこのメールアドレスをコピーします。
[次へ] をクリックします。
次の入力パラメータの値を指定します。
ストレージ バケットの URL: 接頭辞パスを含む GCS バケット URI を入力します。
gs://skyhigh-casb-logs/skyhigh-casb/- 次のように置き換えます。
skyhigh-casb-logs: GCS バケット名。skyhigh-casb: ログが保存されるオプションの接頭辞/フォルダパス(ルートの場合は空のままにします)。
- 次のように置き換えます。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
- 転送されたファイルを削除する: 転送が完了した後にファイルを削除します。
転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
ファイルの最大経過日数: 過去の日数以内に変更されたファイルを含めます(デフォルトは 180 日)。
アセットの名前空間: アセットの名前空間
Ingestion labels: このフィードのイベントに適用されるラベル
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者のロールが必要です。
- [Cloud Storage] > [バケット] に移動します。
- バケット名をクリックします。
- [権限] タブに移動します。
[アクセス権を付与] をクリックします。
次の構成情報を提供してください。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレスを貼り付けます。
- ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
[保存] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
| EventReceivedTime | metadata.event_timestamp | yyyy-MM-dd HH:mm:ss 形式からタイムスタンプに変換 |
| FileSize | target.file.size | 直接マッピングされ、uinteger に変換されます |
| ホスト名 | principal.hostname | 直接マッピングされます。 |
| MessageSourceAddress | principal.ip | 直接マッピング、複数のインスタンスの場合は統合 |
| 重大度 | additional.fields.value.string_value(キー: SEVERITY) | 直接マッピングされます。 |
| SeverityValue | additional.fields.value.string_value(キー: SEVERITY_VALUE) | 直接マッピングされます。 |
| SourceModuleName | additional.fields.value.string_value(キー: SOURCE_MODULE_NAME) | 直接マッピングされます。 |
| SourceModuleType | principal.resource.resource_subtype | 直接マッピングされます。 |
| SyslogFacility | security_result.about.resource.attribute.labels.value(キー: SYSLOG_FACILITY) | 直接マッピングされます。 |
| SyslogFacilityValue | security_result.about.resource.attribute.labels.value(キー: SYSLOG_FACILITY_VALUE) | 直接マッピングされます。 |
| SyslogSeverity | security_result.about.resource.attribute.labels.value(キー: SYSLOG_SEVERITY) | 直接マッピングされます。 |
| SyslogSeverityValue | security_result.about.resource.attribute.labels.value(キー: SYSLOG_SEVERITY_VALUE) | 直接マッピングされます。 |
| activityName | metadata.product_event_type | 直接マッピング、角かっこを削除 |
| actorId | principal.user.userid | 直接マッピングされます。メールアドレスの場合は email_addresses にも追加されます。 |
| actorIdType | principal.user.attribute.roles.name | 直接マッピングされます。 |
| collaborationSharedLink | security_result.about.resource.attribute.labels.value(キー: COLLABORATION_SHARED_LINK) | 直接マッピングされます。 |
| contentItemId | target.file.full_path(contentItemType が FILE の場合) | 直接マッピングされ、引用符が削除されます |
| contentItemId | target.url(contentItemType が SAAS_RESOURCE の場合) | 直接マッピングされ、引用符が削除されます |
| contentItemHierarchy | additional.fields.value.string_value(キー: CONTENT_ITEM_HIERARCHY) | 直接マッピングされ、引用符が削除されます |
| contentItemName | target.resource.name | 直接マッピングされ、引用符が削除されます |
| contentItemType | additional.fields.value.string_value(キー: CONTENT_ITEM_TYPE) | 直接マッピングされます。 |
| incidentGroup | security_result.detection_fields.value(キー: INCIDENT_GROUP) | 直接マッピングされます。 |
| incidentId | metadata.product_log_id | 直接マッピングされます。 |
| incidentRiskScore | security_result.detection_fields.value(キー: INCIDENT_RISK_SCORE) | 直接マッピングされます。 |
| incidentRiskSeverityId | riskSeverity と組み合わせて security_result.severity を決定するために使用されます | |
| informationAccountId | target.resource.product_object_id | 直接マッピングされます。 |
| informationAnomalyCategory | security_result.category_details | 直接マッピングされ、引用符が削除されます |
| informationAnomalyCause | security_result.detection_fields.value(キー: INFO_ANOMALY_CAUSE) | 直接マッピングされ、引用符が削除されます |
| informationCategory | security_result.category_details | 直接マッピングされます。 |
| informationConfigType | additional.fields.value.string_value(キー: INFORMATION_CONFIG_TYPE) | 直接マッピングされ、引用符が削除されます |
| informationContentItemParent | target.resource.parent | 直接マッピングされ、引用符が削除されます |
| informationEventId | additional.fields.value.string_value(キー: INFORMATION_EVENT_ID) | 直接マッピングされます。 |
| informationExternalCollaboratorsCount | additional.fields.value.string_value(キー: INFORMATION_COLLAB_COUNT) | 直接マッピングされます。 |
| informationFileTypes | additional.fields.value.list_value.values.string_value(キー: FILE_TYPE) | JSON 形式の文字列から抽出され、角かっこや引用符は削除されます |
| informationLastExecutedResponseLabel | additional.fields.value.string_value(キー: INFORMATION_LAST_RESPONSE) | 直接マッピングされます。 |
| informationScanName | metadata.description | 直接マッピングされ、引用符が削除されます |
| informationScanRunDate | UDM にマッピングされていません | |
| informationSource | additional.fields.value.string_value(キー: INFORMATION_SOURCE) | 直接マッピングされます。 |
| informationUniqueMatchCount | additional.fields.value.string_value(キー: INFORMATION_UNQ_MATCH_COUNT) | 直接マッピングされます。 |
| informationUserAttributesSAMAccountName | principal.user.user_display_name | 直接マッピング、角かっこを削除 |
| instanceId | principal.resource.product_object_id | 直接マッピングされます。 |
| instanceName | principal.resource.name | 直接マッピングされ、引用符が削除されます |
| policyId | security_result.rule_id | 直接マッピングされます。 |
| policyName | security_result.summary | 直接マッピングされ、引用符が削除されます |
| レスポンス | security_result.action(ALLOW または BLOCK)の決定に使用されます。 | |
| riskSeverity | incidentRiskSeverityId と組み合わせて security_result.severity を決定するために使用されます。大文字に変換されます | |
| serviceNames | target.application | 直接マッピングされ、角かっこ、引用符、余分なスペースが削除されます |
| sourceIps | principal.ip | JSON 形式の文字列から抽出され、複数のインスタンスがある場合は統合されます |
| ステータス | additional.fields.value.string_value(キー: STATUS) | 直接マッピングされます。 |
| threatCategory | security_result.threat_name | 直接マッピングされ、引用符が削除されます |
| totalMatchCount | security_result.detection_fields.value(キー: TOTAL_MATCH_COUNT) | 直接マッピングされます。 |
| なし | metadata.vendor_name | MCAFEE - 静的な値 |
| なし | metadata.product_name | MCAFEE_SKYHIGH_CASB - 静的な値 |
| なし | metadata.log_type | MCAFEE_SKYHIGH_CASB - 静的な値 |
| なし | principal.resource.type | VIRTUAL_MACHINE - instanceName または instanceId が存在する場合に設定 |
| なし | metadata.event_type | 一連の条件に基づいて決定されます。- actorId、contentItemId、contentItemName が存在する場合は USER_RESOURCE_UPDATE_CONTENT - actorId と target が存在する場合は USER_UNCATEGORIZED - Hostname または MessageSourceAddress が存在する場合は STATUS_UPDATE - それ以外の場合は GENERIC_EVENT |
| なし | security_result.severity | riskSeverity と incidentRiskSeverityId の組み合わせに基づいて決定されます。- riskSeverity が LOW で、incidentRiskSeverityId が 0 の場合は LOW - riskSeverity が MEDIUM で、incidentRiskSeverityId が 1 の場合は MEDIUM - riskSeverity が HIGH で、incidentRiskSeverityId が 2 の場合は HIGH - riskSeverity が INFO で、incidentRiskSeverityId が 3 の場合は INFORMATIONAL |
column2 |
event.idm.read_only_udm.principal.ip と event.idm.read_only_udm.principal.asset.ip |
変更履歴からマッピング |
intermediary_host |
event.idm.read_only_udm.intermediary.hostname と event.idm.read_only_udm.intermediary.asset.hostname |
変更履歴からマッピング |
column3 |
event.idm.read_only_udm.network.http.response_code |
変更履歴からマッピング |
column8 |
event.idm.read_only_udm.network.received_bytes |
変更履歴からマッピング |
column9 |
event.idm.read_only_udm.network.sent_bytes |
変更履歴からマッピング |
column10 |
event.idm.read_only_udm.network.http.user_agent |
変更履歴からマッピング |
column10 |
event.idm.read_only_udm.network.http.parsed_user_agent |
変更履歴からマッピング |
http_method |
event.idm.read_only_udm.network.http.method |
変更履歴からマッピング |
tar_host |
event.idm.read_only_udm.target.hostname と event.idm.read_only_udm.target.asset.hostname |
変更履歴からマッピング |
tar_port |
event.idm.read_only_udm.target.port |
変更履歴からマッピング |
application_protocol |
event.idm.read_only_udm.network.application_protocol |
変更履歴からマッピング |
tar_url |
event.idm.read_only_udm.target.url |
変更履歴からマッピング |
http_version |
event.idm.read_only_udm.additional.fields |
変更履歴からマッピング |
column1 |
event.idm.read_only_udm.additional.fields |
変更履歴からマッピング |
intermediary_application |
event.idm.read_only_udm.intermediary.application |
変更履歴からマッピング |
column5 |
event.idm.read_only_udm.security_result.category_details |
変更履歴からマッピング |
column6 |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
column12 |
event.idm.read_only_udm.security_result.detection_fields |
変更履歴からマッピング |
column7 |
event.idm.read_only_udm.target.file.mime_type |
変更履歴からマッピング |
変更ログ
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。