Mengumpulkan log Skyhigh Security CASB (sebelumnya McAfee Skyhigh CASB)

Didukung di:

Dokumen ini menjelaskan cara menyerap log Skyhigh Security CASB (sebelumnya dikenal sebagai McAfee Skyhigh CASB) ke Google Security Operations menggunakan Google Cloud Storage V2.

Skyhigh Security CASB adalah broker keamanan akses cloud (CASB) yang memberikan visibilitas, kepatuhan, keamanan data, dan perlindungan ancaman untuk layanan cloud. Solusi ini memantau aktivitas pengguna di seluruh lingkungan SaaS, PaaS, dan IaaS, mendeteksi anomali, menerapkan kebijakan DLP, serta membuat log audit dan insiden melalui REST API-nya.

Sebelum memulai

Pastikan Anda memiliki prasyarat berikut:

  • Instance Google SecOps
  • Project GCP dengan Cloud Storage API diaktifkan
  • Izin untuk membuat dan mengelola bucket GCS
  • Izin untuk mengelola kebijakan IAM di bucket GCS
  • Izin untuk membuat layanan Cloud Run, topik Pub/Sub, dan tugas Cloud Scheduler
  • Tenant CASB Skyhigh Security dengan akses administratif
  • Kredensial API dari konsol Skyhigh Security (Client ID dan Client Secret)
  • Skyhigh Cloud Connector diinstal dan dikonfigurasi

Buat bucket Google Cloud Storage

  1. Buka Konsol Google Cloud.
  2. Pilih project Anda atau buat project baru.
  3. Di menu navigasi, buka Cloud Storage > Buckets.
  4. Klik Create bucket.
  5. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Beri nama bucket Anda Masukkan nama yang unik secara global (misalnya, skyhigh-casb-logs)
    Location type Pilih berdasarkan kebutuhan Anda (Region, Dual-region, Multi-region)
    Location Pilih lokasi (misalnya, us-central1)
    Kelas penyimpanan Standar (direkomendasikan untuk log yang sering diakses)
    Kontrol akses Seragam (direkomendasikan)
    Alat perlindungan Opsional: Aktifkan pembuatan versi objek atau kebijakan retensi
  6. Klik Create.

Mengumpulkan kredensial Skyhigh Security CASB API

Membuat kredensial klien API

  1. Login ke konsol Skyhigh Security.
  2. Buka Setelan > Infrastruktur > Integrasi API.
  3. Klik Create API Client.
  4. Masukkan nama untuk klien API (misalnya, Google SecOps Integration).

  5. Pilih cakupan berikut:

    • Insiden: Akses baca ke data insiden CASB
    • Anomali: Akses baca ke peristiwa anomali
    • Log Audit: Akses baca ke jejak audit
  6. Klik Create.

  7. Salin dan simpan detail berikut di lokasi yang aman:

    • Client ID: ID klien yang dibuat
    • Client Secret: Rahasia klien yang dibuat (hanya ditampilkan satu kali)

Mendapatkan URL dasar tenant

  1. Login ke konsol Skyhigh Security.

  2. Catat URL dasar dari kolom URL browser. Formatnya bergantung pada wilayah Anda:

    • Amerika Serikat: https://www.myshn.net
    • Uni Eropa: https://www.myshn.eu
    • SG: https://www.myshn.sg

Menguji akses API

  • Uji kredensial Anda sebelum melanjutkan integrasi:

    # 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"
    

Buat akun layanan untuk fungsi Cloud Run

Fungsi Cloud Run memerlukan akun layanan dengan izin untuk menulis ke bucket GCS dan dipanggil oleh Pub/Sub.

Membuat akun layanan

  1. Di Konsol GCP, buka IAM & Admin > Service Accounts.
  2. Klik Create Service Account.
  3. Berikan detail konfigurasi berikut:
    • Nama akun layanan: Masukkan skyhigh-casb-collector-sa
    • Deskripsi akun layanan: Masukkan Service account for Cloud Run function to collect Skyhigh Security CASB logs
  4. Klik Create and Continue.

  5. Di bagian Grant this service account access to project, tambahkan peran berikut:

    1. Klik Pilih peran.
    2. Telusuri dan pilih Storage Object Admin.
    3. Klik + Add another role.
    4. Telusuri dan pilih Cloud Run Invoker.
    5. Klik + Add another role.
    6. Telusuri dan pilih Cloud Functions Invoker.
  6. Klik Lanjutkan.

  7. Klik Done.

Peran ini diperlukan untuk:

  • Storage Object Admin: Menulis log ke bucket GCS dan mengelola file status
  • Cloud Run Invoker: Izinkan Pub/Sub memanggil fungsi
  • Cloud Functions Invoker: Mengizinkan pemanggilan fungsi

Memberikan izin IAM pada bucket GCS

Beri akun layanan izin tulis di bucket GCS:

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket Anda (misalnya, skyhigh-casb-logs).
  3. Buka tab Izin.
  4. Klik Grant access.

  5. Berikan detail konfigurasi berikut:

    • Tambahkan prinsipal: Masukkan email akun layanan (misalnya, skyhigh-casb-collector-sa@PROJECT_ID.iam.gserviceaccount.com)
    • Menetapkan peran: Pilih Storage Object Admin
  6. Klik Simpan.

Membuat topik Pub/Sub

Buat topik Pub/Sub yang akan dipublikasikan oleh Cloud Scheduler dan akan dilanggan oleh fungsi Cloud Run.

  1. Di Konsol GCP, buka Pub/Sub > Topics.
  2. Klik Create topic.

  3. Berikan detail konfigurasi berikut:

    • ID Topik: Masukkan skyhigh-casb-logs-trigger
    • Biarkan setelan lainnya sesuai default
  4. Klik Create.

Membuat fungsi Cloud Run untuk mengumpulkan log

Fungsi Cloud Run akan dipicu oleh pesan Pub/Sub dari Cloud Scheduler untuk mengambil log dari Skyhigh Security CASB API dan menuliskannya ke GCS.

  1. Di Konsol GCP, buka Cloud Run.
  2. Klik Create service.
  3. Pilih Function (gunakan editor inline untuk membuat fungsi).

  4. Di bagian Konfigurasi, berikan detail konfigurasi berikut:

    Setelan Nilai
    Nama layanan skyhigh-casb-collector
    Region Pilih region yang cocok dengan bucket GCS Anda (misalnya, us-central1)
    Runtime Pilih Python 3.12 atau yang lebih baru
  5. Di bagian Pemicu (opsional):

    1. Klik + Tambahkan pemicu.
    2. Pilih Cloud Pub/Sub.
    3. Di Select a Cloud Pub/Sub topic, pilih topik skyhigh-casb-logs-trigger.
    4. Klik Simpan.
  6. Di bagian Authentication:

    1. Pilih Wajibkan autentikasi.
    2. Periksa Identity and Access Management (IAM).
  7. Scroll ke bawah dan luaskan Containers, Networking, Security.

  8. Buka tab Security:

    • Akun layanan: Pilih akun layanan skyhigh-casb-collector-sa.
  9. Buka tab Containers:

    1. Klik Variables & Secrets.
    2. Klik + Tambahkan variabel untuk setiap variabel lingkungan:
    Nama Variabel Nilai Contoh Deskripsi
    GCS_BUCKET skyhigh-casb-logs Nama bucket GCS
    GCS_PREFIX skyhigh-casb Awalan untuk file log
    STATE_KEY skyhigh-casb/state.json Jalur file status
    SKYHIGH_BASE_URL https://www.myshn.net URL dasar Skyhigh Security
    SKYHIGH_CLIENT_ID your-client-id ID Klien API
    SKYHIGH_CLIENT_SECRET your-client-secret Rahasia Klien API
    MAX_RECORDS 5000 Jumlah data maks per proses
    PAGE_SIZE 100 Data per halaman
    LOOKBACK_HOURS 24 Periode lihat balik awal
  10. Di bagian Variables & Secrets, scroll ke bawah ke Requests:

    • Waktu tunggu permintaan: Masukkan 600 detik (10 menit)
  11. Buka tab Setelan:

    • Di bagian Referensi:
      • Memori: Pilih 512 MiB atau lebih tinggi
      • CPU: Pilih 1
  12. Di bagian Penskalaan revisi:

    • Minimum number of instances: Masukkan 0
    • Maximum number of instances: Masukkan 100 (atau sesuaikan berdasarkan perkiraan beban)
  13. Klik Create.

  14. Tunggu hingga layanan dibuat (1-2 menit).

  15. Setelah layanan dibuat, editor kode inline akan terbuka secara otomatis.

Menambahkan kode fungsi

  1. Masukkan main di kolom Entry point.

  2. Di editor kode inline, buat dua file:

    • 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
    
  3. Klik Deploy untuk menyimpan dan men-deploy fungsi.

  4. Tunggu hingga deployment selesai (2-3 menit).

Buat tugas Cloud Scheduler

Cloud Scheduler akan memublikasikan pesan ke topik Pub/Sub secara berkala, sehingga memicu fungsi Cloud Run.

  1. Di Konsol GCP, buka Cloud Scheduler.
  2. Klik Create Job.

  3. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Nama skyhigh-casb-collector-hourly
    Region Pilih region yang sama dengan fungsi Cloud Run
    Frekuensi 0 * * * * (setiap jam, tepat pada waktunya)
    Zona Waktu Pilih zona waktu (UTC direkomendasikan)
    Jenis target Pub/Sub
    Topik Pilih topik skyhigh-casb-logs-trigger
    Isi pesan {} (objek JSON kosong)
  4. Klik Create.

Opsi frekuensi jadwal

Pilih frekuensi berdasarkan volume log dan persyaratan latensi:

Frekuensi Ekspresi Cron Kasus Penggunaan
Setiap 5 menit */5 * * * * Volume tinggi, latensi rendah
Setiap 15 menit */15 * * * * Volume sedang
Setiap jam 0 * * * * Standar (direkomendasikan)
Setiap 6 jam 0 */6 * * * Volume rendah, pemrosesan batch
Harian 0 0 * * * Pengumpulan data historis

Menguji integrasi

  1. Di konsol Cloud Scheduler, temukan tugas Anda.
  2. Klik Force run untuk memicu tugas secara manual.
  3. Tunggu beberapa detik.
  4. Buka Cloud Run > Services.
  5. Klik skyhigh-casb-collector.
  6. Klik tab Logs.
  7. Pastikan fungsi berhasil dieksekusi. Cari:

    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
    
  8. Buka Cloud Storage > Buckets.

  9. Klik nama bucket Anda (skyhigh-casb-logs).

  10. Buka folder skyhigh-casb/.

  11. Pastikan file .ndjson baru dibuat dengan stempel waktu saat ini.

Jika Anda melihat error dalam log:

  • HTTP 401: Periksa kredensial API di variabel lingkungan atau token mungkin sudah tidak berlaku
  • HTTP 403: Verifikasi bahwa klien API memiliki cakupan yang diperlukan di konsol Skyhigh Security
  • HTTP 429: Pembatasan kecepatan - fungsi akan otomatis mencoba lagi dengan penundaan
  • Variabel lingkungan tidak ada: Pastikan semua variabel yang diperlukan telah ditetapkan

Mengonfigurasi feed di Google SecOps untuk menyerap log CASB Skyhigh Security

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Skyhigh Security CASB Logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih McAfee Skyhigh CASB sebagai Log type.
  7. Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Salin alamat email ini.

  9. Klik Berikutnya.

  10. Tentukan nilai untuk parameter input berikut:

    • URL bucket penyimpanan: Masukkan URI bucket GCS dengan jalur awalan:

      gs://skyhigh-casb-logs/skyhigh-casb/
      
      • Ganti:
        • skyhigh-casb-logs: Nama bucket GCS Anda.
        • skyhigh-casb: Awalan/jalur folder opsional tempat log disimpan (biarkan kosong untuk root).
    • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:

      • Jangan pernah: Tidak pernah menghapus file apa pun setelah transfer (direkomendasikan untuk pengujian).
      • Hapus file yang ditransfer: Menghapus file setelah transfer berhasil.
      • Hapus file yang ditransfer dan direktori kosong: Menghapus file dan direktori kosong setelah transfer berhasil.

    • Usia File Maksimum: Menyertakan file yang diubah dalam beberapa hari terakhir (default adalah 180 hari)

    • Namespace aset: Namespace aset

    • Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini

  11. Klik Berikutnya.

  12. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

Memberikan izin IAM ke akun layanan Google SecOps

Akun layanan Google SecOps memerlukan peran Storage Object Viewer di bucket GCS Anda.

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket Anda.
  3. Buka tab Izin.
  4. Klik Grant access.

  5. Berikan detail konfigurasi berikut:

    • Add principals: Tempel email akun layanan Google SecOps
    • Tetapkan peran: Pilih Storage Object Viewer
  6. Klik Simpan.

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
EventReceivedTime metadata.event_timestamp Dikonversi menjadi stempel waktu dari format yyyy-MM-dd HH:mm:ss
FileSize target.file.size Dipetakan langsung, dikonversi menjadi uinteger
Hostname principal.hostname Dipetakan secara langsung
MessageSourceAddress principal.ip Dipetakan secara langsung, digabungkan jika ada beberapa instance
Keparahan additional.fields.value.string_value (kunci: SEVERITY) Dipetakan secara langsung
SeverityValue additional.fields.value.string_value (kunci: SEVERITY_VALUE) Dipetakan secara langsung
SourceModuleName additional.fields.value.string_value (kunci: SOURCE_MODULE_NAME) Dipetakan secara langsung
SourceModuleType principal.resource.resource_subtype Dipetakan secara langsung
SyslogFacility security_result.about.resource.attribute.labels.value (kunci: SYSLOG_FACILITY) Dipetakan secara langsung
SyslogFacilityValue security_result.about.resource.attribute.labels.value (kunci: SYSLOG_FACILITY_VALUE) Dipetakan secara langsung
SyslogSeverity security_result.about.resource.attribute.labels.value (kunci: SYSLOG_SEVERITY) Dipetakan secara langsung
SyslogSeverityValue security_result.about.resource.attribute.labels.value (kunci: SYSLOG_SEVERITY_VALUE) Dipetakan secara langsung
activityName metadata.product_event_type Dipetakan secara langsung, tanda kurung dihapus
actorId principal.user.userid Dipetakan secara langsung, juga ditambahkan ke email_addresses jika berupa email
actorIdType principal.user.attribute.roles.name Dipetakan secara langsung
collaborationSharedLink security_result.about.resource.attribute.labels.value (kunci: COLLABORATION_SHARED_LINK) Dipetakan secara langsung
contentItemId target.file.full_path (jika contentItemType adalah FILE) Dipetakan langsung, penawaran harga dihapus
contentItemId target.url (jika contentItemType adalah SAAS_RESOURCE) Dipetakan langsung, penawaran harga dihapus
contentItemHierarchy additional.fields.value.string_value (kunci: CONTENT_ITEM_HIERARCHY) Dipetakan langsung, penawaran harga dihapus
contentItemName target.resource.name Dipetakan langsung, penawaran harga dihapus
contentItemType additional.fields.value.string_value (kunci: CONTENT_ITEM_TYPE) Dipetakan secara langsung
incidentGroup security_result.detection_fields.value (kunci: INCIDENT_GROUP) Dipetakan secara langsung
incidentId metadata.product_log_id Dipetakan secara langsung
incidentRiskScore security_result.detection_fields.value (kunci: INCIDENT_RISK_SCORE) Dipetakan secara langsung
incidentRiskSeverityId Digunakan bersama dengan riskSeverity untuk menentukan security_result.severity
informationAccountId target.resource.product_object_id Dipetakan secara langsung
informationAnomalyCategory security_result.category_details Dipetakan langsung, penawaran harga dihapus
informationAnomalyCause security_result.detection_fields.value (kunci: INFO_ANOMALY_CAUSE) Dipetakan langsung, penawaran harga dihapus
informationCategory security_result.category_details Dipetakan secara langsung
informationConfigType additional.fields.value.string_value (kunci: INFORMATION_CONFIG_TYPE) Dipetakan langsung, penawaran harga dihapus
informationContentItemParent target.resource.parent Dipetakan langsung, penawaran harga dihapus
informationEventId additional.fields.value.string_value (kunci: INFORMATION_EVENT_ID) Dipetakan secara langsung
informationExternalCollaboratorsCount additional.fields.value.string_value (kunci: INFORMATION_COLLAB_COUNT) Dipetakan secara langsung
informationFileTypes additional.fields.value.list_value.values.string_value (kunci: FILE_TYPE) Diekstrak dari string mirip JSON, tanda kurung dan tanda kutip dihapus
informationLastExecutedResponseLabel additional.fields.value.string_value (kunci: INFORMATION_LAST_RESPONSE) Dipetakan secara langsung
informationScanName metadata.description Dipetakan langsung, penawaran harga dihapus
informationScanRunDate Tidak dipetakan ke UDM
informationSource additional.fields.value.string_value (kunci: INFORMATION_SOURCE) Dipetakan secara langsung
informationUniqueMatchCount additional.fields.value.string_value (kunci: INFORMATION_UNQ_MATCH_COUNT) Dipetakan secara langsung
informationUserAttributesSAMAccountName principal.user.user_display_name Dipetakan secara langsung, tanda kurung dihapus
instanceId principal.resource.product_object_id Dipetakan secara langsung
instanceName principal.resource.name Dipetakan langsung, penawaran harga dihapus
policyId security_result.rule_id Dipetakan secara langsung
policyName security_result.summary Dipetakan langsung, penawaran harga dihapus
respons Digunakan untuk menentukan security_result.action (ALLOW atau BLOCK)
riskSeverity Digunakan bersama dengan incidentRiskSeverityId untuk menentukan security_result.severity, yang dikonversi menjadi huruf besar
serviceNames target.application Dipetakan secara langsung, tanda kurung, tanda petik, dan spasi tambahan dihapus
sourceIps principal.ip Diekstrak dari string mirip JSON, digabungkan jika ada beberapa instance
status additional.fields.value.string_value (kunci: STATUS) Dipetakan secara langsung
threatCategory security_result.threat_name Dipetakan langsung, penawaran harga dihapus
totalMatchCount security_result.detection_fields.value (kunci: TOTAL_MATCH_COUNT) Dipetakan secara langsung
T/A metadata.vendor_name MCAFEE - Nilai statis
T/A metadata.product_name MCAFEE_SKYHIGH_CASB - Nilai statis
T/A metadata.log_type MCAFEE_SKYHIGH_CASB - Nilai statis
T/A principal.resource.type VIRTUAL_MACHINE - Ditetapkan jika instanceName atau instanceId ada
T/A metadata.event_type Ditentukan berdasarkan serangkaian kondisi: - USER_RESOURCE_UPDATE_CONTENT jika actorId, contentItemId, atau contentItemName ada - USER_UNCATEGORIZED jika actorId dan target ada - STATUS_UPDATE jika Hostname atau MessageSourceAddress ada - GENERIC_EVENT jika tidak ada
T/A security_result.severity Ditentukan berdasarkan kombinasi riskSeverity dan incidentRiskSeverityId: - LOW jika riskSeverity adalah LOW dan incidentRiskSeverityId adalah 0 - MEDIUM jika riskSeverity adalah MEDIUM dan incidentRiskSeverityId adalah 1 - HIGH jika riskSeverity adalah HIGH dan incidentRiskSeverityId adalah 2 - INFORMATIONAL jika riskSeverity adalah INFO dan incidentRiskSeverityId adalah 3
column2 event.idm.read_only_udm.principal.ip dan event.idm.read_only_udm.principal.asset.ip Dipetakan dari log perubahan
intermediary_host event.idm.read_only_udm.intermediary.hostname dan event.idm.read_only_udm.intermediary.asset.hostname Dipetakan dari log perubahan
column3 event.idm.read_only_udm.network.http.response_code Dipetakan dari log perubahan
column8 event.idm.read_only_udm.network.received_bytes Dipetakan dari log perubahan
column9 event.idm.read_only_udm.network.sent_bytes Dipetakan dari log perubahan
column10 event.idm.read_only_udm.network.http.user_agent Dipetakan dari log perubahan
column10 event.idm.read_only_udm.network.http.parsed_user_agent Dipetakan dari log perubahan
http_method event.idm.read_only_udm.network.http.method Dipetakan dari log perubahan
tar_host event.idm.read_only_udm.target.hostname dan event.idm.read_only_udm.target.asset.hostname Dipetakan dari log perubahan
tar_port event.idm.read_only_udm.target.port Dipetakan dari log perubahan
application_protocol event.idm.read_only_udm.network.application_protocol Dipetakan dari log perubahan
tar_url event.idm.read_only_udm.target.url Dipetakan dari log perubahan
http_version event.idm.read_only_udm.additional.fields Dipetakan dari log perubahan
column1 event.idm.read_only_udm.additional.fields Dipetakan dari log perubahan
intermediary_application event.idm.read_only_udm.intermediary.application Dipetakan dari log perubahan
column5 event.idm.read_only_udm.security_result.category_details Dipetakan dari log perubahan
column6 event.idm.read_only_udm.security_result.detection_fields Dipetakan dari log perubahan
column12 event.idm.read_only_udm.security_result.detection_fields Dipetakan dari log perubahan
column7 event.idm.read_only_udm.target.file.mime_type Dipetakan dari log perubahan

Log Perubahan

Melihat Log Perubahan untuk parser ini

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.