Mengumpulkan log SailPoint IAM

Didukung di:

Dokumen ini menjelaskan cara menyerap log SailPoint IAM ke Google Security Operations menggunakan Google Cloud Storage. SailPoint Identity Security Cloud menyediakan kemampuan tata kelola dan administrasi identitas untuk mengelola akses pengguna, kepatuhan, dan keamanan di seluruh aplikasi perusahaan.

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
  • Akses istimewa ke tenant atau API SailPoint Identity Security Cloud

Membuat bucket Google Cloud Storage

  1. Buka Google Cloud Console.
  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, sailpoint-iam-logs)
    Location type Pilih berdasarkan kebutuhan Anda (Region, Dual-region, Multi-region)
    Lokasi Pilih lokasi (misalnya, us-central1)
    Kelas penyimpanan Standar (direkomendasikan untuk log yang sering diakses)
    Access control Seragam (direkomendasikan)
    Alat perlindungan Opsional: Aktifkan pembuatan versi objek atau kebijakan retensi
  6. Klik Buat.

Kumpulkan kredensial SailPoint Identity Security Cloud API

  1. Login ke Konsol Admin SailPoint Identity Security Cloud sebagai administrator.
  2. Buka Admin > Global > Setelan Keamanan > Pengelolaan API.
  3. Klik Create API Client.
  4. Pilih Client Credentials sebagai jenis pemberian akses.
  5. Berikan detail konfigurasi berikut:
    • Name: Masukkan nama deskriptif (misalnya, Chronicle Export API).
    • Deskripsi: Masukkan deskripsi untuk klien API.
    • Cakupan: Pilih sp:scopes:all (atau cakupan baca yang sesuai untuk peristiwa audit).
  6. Klik Create, lalu salin kredensial API yang dibuat dengan aman.
  7. Catat URL dasar tenant SailPoint Anda (misalnya, https://tenant.api.identitynow.com).
  8. Salin dan simpan detail berikut di lokasi yang aman:

    • IDN_CLIENT_ID
    • IDN_CLIENT_SECRET
    • IDN_BASE

Menguji akses API

  • Uji kredensial Anda sebelum melanjutkan integrasi:

    # Replace with your actual credentials
    IDN_CLIENT_ID="your-client-id"
    IDN_CLIENT_SECRET="your-client-secret"
    IDN_BASE="https://tenant.api.identitynow.com"
    
    # Get OAuth token
    TOKEN=$(curl -s -X POST "${IDN_BASE}/oauth/token" \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "grant_type=client_credentials&client_id=${IDN_CLIENT_ID}&client_secret=${IDN_CLIENT_SECRET}&scope=sp:scopes:all" | jq -r '.access_token')
    
    # Test API access
    curl -v -H "Authorization: Bearer ${TOKEN}" "${IDN_BASE}/v3/search" \
      -H "Content-Type: application/json" \
      -d '{"indices":["events"],"query":{"query":"*"},"limit":1}'
    

Buat akun layanan untuk Cloud Run Function

Fungsi Cloud Run memerlukan akun layanan dengan izin untuk menulis ke bucket GCS.

Membuat akun layanan

  1. Di GCP Console, buka IAM & Admin > Service Accounts.
  2. Klik Create Service Account.
  3. Berikan detail konfigurasi berikut:
    • Nama akun layanan: Masukkan sailpoint-iam-collector-sa.
    • Deskripsi akun layanan: Masukkan Service account for Cloud Run function to collect SailPoint IAM logs.
  4. Klik Create and Continue.
  5. Di bagian Berikan akun layanan ini akses ke project:
    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 Selesai.

Peran ini diperlukan untuk:

  • Storage Object Admin: Menulis log ke bucket GCS dan mengelola file status
  • Cloud Run Invoker: Mengizinkan 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.
  3. Buka tab Izin.
  4. Klik Grant access.
  5. Berikan detail konfigurasi berikut:
    • Add principals: Masukkan email akun layanan.
    • Tetapkan 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 GCP Console, buka Pub/Sub > Topics.
  2. Klik Create topic.
  3. Berikan detail konfigurasi berikut:
    • ID Topik: Masukkan sailpoint-iam-trigger.
    • Biarkan setelan lainnya tetap default.
  4. Klik Buat.

Membuat fungsi Cloud Run untuk mengumpulkan log

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

  1. Di GCP Console, 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 sailpoint-iam-collector
    Wilayah 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 Pub/Sub (sailpoint-iam-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 (sailpoint-iam-collector-sa).
  9. Buka tab Containers:

    1. Klik Variables & Secrets.
    2. Klik + Tambahkan variabel untuk setiap variabel lingkungan:
    Nama Variabel Nilai Contoh
    GCS_BUCKET sailpoint-iam-logs
    GCS_PREFIX sailpoint/iam/
    STATE_KEY sailpoint/iam/state.json
    WINDOW_SECONDS 3600
    HTTP_TIMEOUT 60
    MAX_RETRIES 3
    USER_AGENT sailpoint-iam-to-gcs/1.0
    IDN_BASE https://tenant.api.identitynow.com
    IDN_CLIENT_ID your-client-id
    IDN_CLIENT_SECRET your-client-secret
    IDN_SCOPE sp:scopes:all
    PAGE_SIZE 250
    MAX_PAGES 20
  10. Scroll ke bawah di tab Variables & Secrets ke Requests:

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

    • Di bagian Materi:
      • Memori: Pilih 512 MiB atau yang lebih tinggi.
      • CPU: Pilih 1.
    • Klik Selesai.
  12. Scroll ke bawah ke Lingkungan eksekusi:

    • Pilih Default (direkomendasikan).
  13. Di bagian Penskalaan revisi:

    • Jumlah minimum instance: Masukkan 0.
    • Jumlah maksimum instance: Masukkan 100 (atau sesuaikan berdasarkan perkiraan beban).
  14. Klik Buat.

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

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

Menambahkan kode fungsi

  1. Masukkan main di Function entry point
  2. Di editor kode inline, buat dua file:

    • File pertama: main.py:
     import functions_framework
     from google.cloud import storage
     import json
     import os
     import urllib3
     from datetime import datetime, timezone
     import time
     import uuid
    
     # Initialize HTTP client
     http = urllib3.PoolManager()
    
     # Initialize Storage client
     storage_client = storage.Client()
    
     # Get environment variables
     GCS_BUCKET = os.environ.get('GCS_BUCKET')
     GCS_PREFIX = os.environ.get('GCS_PREFIX', 'sailpoint/iam/')
     STATE_KEY = os.environ.get('STATE_KEY', 'sailpoint/iam/state.json')
     WINDOW_SEC = int(os.environ.get('WINDOW_SECONDS', '3600'))
     HTTP_TIMEOUT = int(os.environ.get('HTTP_TIMEOUT', '60'))
     IDN_BASE = os.environ.get('IDN_BASE')
     CLIENT_ID = os.environ.get('IDN_CLIENT_ID')
     CLIENT_SECRET = os.environ.get('IDN_CLIENT_SECRET')
     SCOPE = os.environ.get('IDN_SCOPE', 'sp:scopes:all')
     PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '250'))
     MAX_PAGES = int(os.environ.get('MAX_PAGES', '20'))
     MAX_RETRIES = int(os.environ.get('MAX_RETRIES', '3'))
     USER_AGENT = os.environ.get('USER_AGENT', 'sailpoint-iam-to-gcs/1.0')
    
     def _load_state(bucket):
         """Load state from GCS."""
         try:
             blob = bucket.blob(STATE_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: {str(e)}')
         return {}
    
     def _save_state(bucket, st):
         """Save state to GCS."""
         try:
             blob = bucket.blob(STATE_KEY)
             blob.upload_from_string(
                 json.dumps(st, separators=(',', ':')),
                 content_type='application/json'
             )
         except Exception as e:
             print(f'Warning: Could not save state: {str(e)}')
    
     def _iso(ts):
         """Convert timestamp to ISO format."""
         return time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(ts))
    
     def _get_oauth_token():
         """Get OAuth2 access token using Client Credentials flow."""
         token_url = f"{IDN_BASE.rstrip('/')}/oauth/token"
    
         fields = {
             'grant_type': 'client_credentials',
             'client_id': CLIENT_ID,
             'client_secret': CLIENT_SECRET,
             'scope': SCOPE
         }
    
         headers = {
             'Content-Type': 'application/x-www-form-urlencoded',
             'User-Agent': USER_AGENT
         }
    
         response = http.request(
             'POST',
             token_url,
             fields=fields,
             headers=headers,
             timeout=HTTP_TIMEOUT
         )
    
         token_data = json.loads(response.data.decode('utf-8'))
         return token_data['access_token']
    
     def _search_events(access_token, created_from, search_after=None):
         """Search for audit events using SailPoint's /v3/search API.
    
         IMPORTANT: SailPoint requires colons in ISO8601 timestamps to be escaped with backslashes.
         Example: 2024-01-15T10:30:00Z must be sent as 2024-01-15T10\\:30\\:00Z
    
         For more information, see:
         - https://developer.sailpoint.com/docs/api/standard-collection-parameters/
         - https://developer.sailpoint.com/docs/api/v3/search-post/
         """
         search_url = f"{IDN_BASE.rstrip('/')}/v3/search"
    
         # Escape colons in timestamp for SailPoint search query
         escaped_timestamp = created_from.replace(':', '\\:')
         query_str = f'created:>={escaped_timestamp}'
    
         payload = {
             'indices': ['events'],
             'query': {
                 'query': query_str
             },
             'sort': ['created', '+id'],
             'limit': PAGE_SIZE
         }
    
         if search_after:
             payload['searchAfter'] = search_after
    
         attempt = 0
         while True:
             headers = {
                 'Content-Type': 'application/json',
                 'Accept': 'application/json',
                 'Authorization': f'Bearer {access_token}',
                 'User-Agent': USER_AGENT
             }
    
             try:
                 response = http.request(
                     'POST',
                     search_url,
                     body=json.dumps(payload).encode('utf-8'),
                     headers=headers,
                     timeout=HTTP_TIMEOUT
                 )
    
                 response_data = json.loads(response.data.decode('utf-8'))
    
                 # Handle different response formats
                 if isinstance(response_data, list):
                     return response_data
                 return response_data.get('results', response_data.get('data', []))
    
             except Exception as e:
                 attempt += 1
                 print(f'HTTP error on attempt {attempt}: {e}')
                 if attempt > MAX_RETRIES:
                     raise
                 # Exponential backoff with jitter
                 time.sleep(min(60, 2 ** attempt) + (time.time() % 1))
    
     def _put_events_data(bucket, events, from_ts, to_ts, page_num):
         """Write events to GCS in JSONL format (one JSON object per line)."""
         # Create unique GCS key for events data
         ts_path = time.strftime('%Y/%m/%d', time.gmtime(to_ts))
         uniq = f"{int(time.time() * 1e6)}_{uuid.uuid4().hex[:8]}"
         key = f"{GCS_PREFIX}{ts_path}/sailpoint_iam_{int(from_ts)}_{int(to_ts)}_p{page_num:03d}_{uniq}.jsonl"
    
         # Convert events list to JSONL format (one JSON object per line)
         jsonl_lines = [json.dumps(event, separators=(',', ':')) for event in events]
         jsonl_content = '\n'.join(jsonl_lines)
    
         blob = bucket.blob(key)
         blob.metadata = {
             'source': 'sailpoint-iam',
             'from_timestamp': str(int(from_ts)),
             'to_timestamp': str(int(to_ts)),
             'page_number': str(page_num),
             'events_count': str(len(events)),
             'format': 'jsonl'
         }
         blob.upload_from_string(
             jsonl_content,
             content_type='application/x-ndjson'
         )
    
         return key
    
     def _get_item_id(item):
         """Extract ID from event item, trying multiple possible fields."""
         for field in ('id', 'uuid', 'eventId', '_id'):
             if field in item and item[field]:
                 return str(item[field])
         return ''
    
     @functions_framework.cloud_event
     def main(cloud_event):
         """
         Cloud Run function triggered by Pub/Sub to fetch SailPoint IAM logs and write to GCS.
    
         Args:
             cloud_event: CloudEvent object containing Pub/Sub message
         """
    
         if not all([GCS_BUCKET, IDN_BASE, CLIENT_ID, CLIENT_SECRET]):
             print('Error: Missing required environment variables')
             return
    
         try:
             bucket = storage_client.bucket(GCS_BUCKET)
    
             st = _load_state(bucket)
             now = time.time()
             from_ts = float(st.get('last_to_ts') or (now - WINDOW_SEC))
             to_ts = now
    
             # Get OAuth token
             access_token = _get_oauth_token()
    
             created_from = _iso(from_ts)
             print(f'Fetching SailPoint IAM events from: {created_from}')
    
             # Handle pagination state
             last_created = st.get('last_created')
             last_id = st.get('last_id')
             search_after = [last_created, last_id] if (last_created and last_id) else None
    
             pages = 0
             total_events = 0
             written_keys = []
             newest_created = last_created or created_from
             newest_id = last_id or ''
    
             while pages < MAX_PAGES:
                 events = _search_events(access_token, created_from, search_after)
                 if not events:
                     break
    
                 # Write page to GCS in JSONL format
                 key = _put_events_data(bucket, events, from_ts, to_ts, pages + 1)
                 written_keys.append(key)
                 total_events += len(events)
    
                 # Update pagination state from last item
                 last_event = events[-1]
                 last_event_created = last_event.get('created') or last_event.get('metadata', {}).get('created')
                 last_event_id = _get_item_id(last_event)
    
                 if last_event_created:
                     newest_created = last_event_created
                 if last_event_id:
                     newest_id = last_event_id
    
                 search_after = [newest_created, newest_id]
                 pages += 1
    
                 # If we got less than page size, we're done
                 if len(events) < PAGE_SIZE:
                     break
    
             print(f'Successfully retrieved {total_events} events across {pages} pages')
    
             # Save state for next run
             st['last_to_ts'] = to_ts
             st['last_created'] = newest_created
             st['last_id'] = newest_id
             st['last_successful_run'] = now
             _save_state(bucket, st)
    
             print(f'Wrote {len(written_keys)} files to GCS')
    
         except Exception as e:
             print(f'Error processing logs: {str(e)}')
             raise
    
    • File kedua: 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 memublikasikan pesan ke topik Pub/Sub secara berkala, sehingga memicu fungsi Cloud Run.

  1. Di GCP Console, buka Cloud Scheduler.
  2. Klik Create Job.
  3. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Nama sailpoint-iam-collector-hourly
    Wilayah 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 Pub/Sub (sailpoint-iam-trigger)
    Isi pesan {} (objek JSON kosong)
  4. Klik Buat.

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 tugas penjadwal

  1. Di konsol Cloud Scheduler, temukan tugas Anda.
  2. Klik Jalankan paksa untuk memicu secara manual.
  3. Tunggu beberapa detik, lalu buka Cloud Run > Services > sailpoint-iam-collector > Logs.
  4. Pastikan fungsi berhasil dieksekusi.
  5. Periksa bucket GCS untuk mengonfirmasi bahwa log telah ditulis.

Mengambil akun layanan Google SecOps

Google SecOps menggunakan akun layanan unik untuk membaca data dari bucket GCS Anda. Anda harus memberi akun layanan ini akses ke bucket Anda.

Dapatkan email akun layanan

  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, SailPoint IAM logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih SailPoint IAM sebagai Jenis log.
  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 untuk digunakan di langkah berikutnya.

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.

Mengonfigurasi feed di Google SecOps untuk memproses log IAM SailPoint

  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, SailPoint IAM logs).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih SailPoint IAM sebagai Jenis log.
  7. Klik Berikutnya.
  8. Tentukan nilai untuk parameter input berikut:

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

      gs://sailpoint-iam-logs/sailpoint/iam/
      
      • Ganti:

        • sailpoint-iam-logs: Nama bucket GCS Anda.
        • sailpoint/iam/: Awalan/jalur folder opsional tempat log disimpan (biarkan kosong untuk root).
      • Contoh:

        • Bucket root: gs://company-logs/
        • Dengan awalan: gs://company-logs/sailpoint-logs/
        • Dengan subfolder: gs://company-logs/sailpoint/iam/
    • 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. Defaultnya adalah 180 hari.

    • Namespace aset: Namespace aset.

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

  9. Klik Berikutnya.

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

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
tindakan metadata.description Nilai kolom tindakan dari log mentah.
actor.name principal.user.user_display_name Nilai kolom actor.name dari log mentah.
attributes.accountName principal.user.group_identifiers Nilai kolom attributes.accountName dari log mentah.
attributes.appId target.asset_id "ID Aplikasi: " digabungkan dengan nilai kolom attributes.appId dari log mentah.
attributes.attributeName additional.fields[0].value.string_value Nilai kolom attributes.attributeName dari log mentah, ditempatkan dalam objek additional.fields. Kunci ditetapkan ke "Nama Atribut".
attributes.attributeValue additional.fields[1].value.string_value Nilai kolom attributes.attributeValue dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "Nilai Atribut".
attributes.cloudAppName target.application Nilai kolom attributes.cloudAppName dari log mentah.
attributes.hostName target.hostname, target.asset.hostname Nilai kolom attributes.hostName dari log mentah.
attributes.interface additional.fields[2].value.string_value Nilai kolom attributes.interface dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "Interface".
attributes.operation security_result.action_details Nilai kolom attributes.operation dari log mentah.
attributes.previousValue additional.fields[3].value.string_value Nilai kolom attributes.previousValue dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "Nilai Sebelumnya".
attributes.provisioningResult security_result.detection_fields.value Nilai kolom attributes.provisioningResult dari log mentah, ditempatkan dalam objek security_result.detection_fields. Kuncinya ditetapkan ke "Provisioning Result".
attributes.sourceId principal.labels[0].value Nilai kolom attributes.sourceId dari log mentah, ditempatkan dalam objek principal.labels. Kuncinya ditetapkan ke "ID Sumber".
attributes.sourceName principal.labels[1].value Nilai kolom attributes.sourceName dari log mentah, ditempatkan dalam objek principal.labels. Kuncinya disetel ke "Nama Sumber".
auditClassName metadata.product_event_type Nilai kolom auditClassName dari log mentah.
dibuat metadata.event_timestamp.seconds, metadata.event_timestamp.nanos Nilai kolom yang dibuat dari log mentah, dikonversi menjadi stempel waktu jika instant.epochSecond tidak ada.
id metadata.product_log_id Nilai kolom id dari log mentah.
instant.epochSecond metadata.event_timestamp.seconds Nilai kolom instant.epochSecond dari log mentah, yang digunakan untuk stempel waktu.
ipAddress principal.asset.ip, principal.ip Nilai kolom ipAddress dari log mentah.
antarmuka additional.fields[0].value.string_value Nilai kolom antarmuka dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "interface".
loggerName intermediary.application Nilai kolom loggerName dari log mentah.
pesan metadata.description, security_result.description Digunakan untuk berbagai tujuan, termasuk menyetel deskripsi dalam metadata dan security_result, serta mengekstrak konten XML.
nama security_result.description Nilai kolom nama dari log mentah.
operasi target.resource.attribute.labels[0].value, metadata.product_event_type Nilai kolom operasi dari log mentah, ditempatkan dalam objek target.resource.attribute.labels. Kuncinya ditetapkan ke "operation". Juga digunakan untuk metadata.product_event_type.
org principal.administrative_domain Nilai kolom org dari log mentah.
pod principal.location.name Nilai kolom pod dari log mentah.
referenceClass additional.fields[1].value.string_value Nilai kolom referenceClass dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "referenceClass".
referenceId additional.fields[2].value.string_value Nilai kolom referenceId dari log mentah, ditempatkan dalam objek additional.fields. Kunci ditetapkan ke "referenceId".
sailPointObjectName additional.fields[3].value.string_value Nilai kolom sailPointObjectName dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "sailPointObjectName".
serverHost principal.hostname, principal.asset.hostname Nilai kolom serverHost dari log mentah.
tumpukan additional.fields[4].value.string_value Nilai kolom stack dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "Stack".
status security_result.severity_details Nilai kolom status dari log mentah.
target additional.fields[4].value.string_value Nilai kolom target dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "target".
target.name principal.user.userid Nilai kolom target.name dari log mentah.
technicalName security_result.summary Nilai kolom technicalName dari log mentah.
thrown.cause.message xml_body, detailed_message Nilai kolom thrown.cause.message dari log mentah, yang digunakan untuk mengekstrak konten XML.
thrown.message xml_body, detailed_message Nilai kolom thrown.message dari log mentah, yang digunakan untuk mengekstrak konten XML.
trackingNumber additional.fields[5].value.string_value Nilai kolom trackingNumber dari log mentah, ditempatkan dalam objek additional.fields. Kuncinya ditetapkan ke "Nomor Pelacakan".
jenis metadata.product_event_type Nilai kolom jenis dari log mentah.
_version metadata.product_version Nilai kolom _version dari log mentah.
T/A metadata.event_timestamp Diperoleh dari kolom instant.epochSecond atau kolom yang dibuat.
T/A metadata.event_type Ditentukan oleh logika parser berdasarkan berbagai kolom, termasuk has_principal_user, has_target_application, technicalName, dan action. Nilai defaultnya adalah "GENERIC_EVENT".
T/A metadata.log_type Tetapkan ke "SAILPOINT_IAM".
T/A metadata.product_name Ditetapkan ke "IAM".
T/A metadata.vendor_name Tetapkan ke "SAILPOINT".
T/A extensions.auth.type Disetel ke "AUTHTYPE_UNSPECIFIED" dalam kondisi tertentu.
T/A target.resource.attribute.labels[0].key Tetapkan ke "operation".

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