Mengumpulkan log autentikasi Duo
Versi Parser: 7.0
Dokumen ini menjelaskan cara menyerap log autentikasi Duo ke Google Security Operations. Parser mengekstrak log dari pesan berformat JSON. Parser ini mengubah data log mentah menjadi Unified Data Model (UDM), memetakan kolom seperti pengguna, perangkat, aplikasi, lokasi, dan detail autentikasi, sekaligus menangani berbagai faktor dan hasil autentikasi untuk mengategorikan peristiwa keamanan. Parser juga melakukan pembersihan data, konversi jenis, dan penanganan error untuk memastikan kualitas dan konsistensi data.
Pilih salah satu dari dua metode pengumpulan:
- Opsi 1: Penyerapan langsung menggunakan API pihak ketiga
- Opsi 2: Mengumpulkan log menggunakan fungsi Cloud Run dan Google Cloud Storage
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Akses istimewa ke Duo Admin Panel (peran Owner diperlukan untuk membuat aplikasi Admin API)
- Akses istimewa ke GCP jika menggunakan Opsi 2
Opsi 1: Serap log autentikasi Duo menggunakan API Pihak ketiga
Mengumpulkan prasyarat Duo (kredensial API)
- Login ke Duo Admin Panel sebagai administrator dengan peran Owner, Administrator, atau Application Manager.
- Buka Applications > Application Catalog.
- Temukan entri untuk Admin API di katalog.
- Klik + Add untuk membuat aplikasi.
- Salin dan simpan detail berikut di lokasi yang aman:
- Kunci Integrasi
- Kunci Rahasia
- Nama Host API (misalnya,
api-XXXXXXXX.duosecurity.com)
- Buka bagian Izin.
- Batalkan pilihan semua opsi izin kecuali Grant read log.
- Klik Simpan Perubahan.
Mengonfigurasi feed di Google SecOps untuk menyerap log autentikasi Duo
- Buka Setelan > Pengelolaan Data > Feed. Jika Anda menggunakan platform khusus SIEM, buka Settings > Feeds.
- Klik + Tambahkan Feed Baru.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Duo Authentication Logs). - Pilih API pihak ketiga sebagai Jenis sumber.
- Pilih Duo Auth sebagai Log type.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Username: Masukkan Integration key dari Duo.
- Secret: Masukkan Secret key dari Duo.
- Nama Host API: Masukkan nama host API Anda (misalnya,
api-XXXXXXXX.duosecurity.com). - Namespace aset: Opsional. Namespace aset.
- Label penyerapan: Opsional. Label yang akan diterapkan ke peristiwa dari feed ini.
- Klik Berikutnya.
- Tinjau konfigurasi feed berita baru Anda di layar Finalize, lalu klik Submit.
Opsi 2: Serap log autentikasi Duo menggunakan Google Cloud Storage
Mengumpulkan kredensial Duo Admin API
- Login ke Panel Admin Duo.
- Buka Applications > Application Catalog.
- Temukan Admin API di katalog aplikasi.
- Klik + Add untuk menambahkan aplikasi Admin API.
- Salin dan simpan nilai berikut:
- Kunci integrasi (ikey)
- Kunci rahasia (skey)
- Nama host API (misalnya,
api-XXXXXXXX.duosecurity.com)
- Di Permissions, aktifkan Grant read log.
- Klik Simpan Perubahan.
Membuat bucket Google Cloud Storage
- Buka Konsol Google Cloud.
- Pilih project Anda atau buat project baru.
- Di menu navigasi, buka Cloud Storage > Buckets.
- Klik Create bucket.
Berikan detail konfigurasi berikut:
Setelan Nilai Memberi nama bucket Anda Masukkan nama yang unik secara global (misalnya, duo-auth-logs)Location type Pilih sesuai kebutuhan Anda (Region, Dual-region, Multi-region) Location Pilih lokasi (misalnya, us-central1)Storage class Standard (direkomendasikan untuk log yang sering diakses) Kontrol akses Seragam (direkomendasikan) Alat perlindungan Opsional: Mengaktifkan pembuatan versi objek atau kebijakan retensi Klik Create.
Membuat akun layanan untuk fungsi Cloud Run
Fungsi Cloud Run memerlukan akun layanan dengan izin untuk menulis ke bucket GCS.
Membuat akun layanan
- Di Konsol GCP, buka IAM & Admin > Service Accounts.
- Klik Create Service Account.
- Berikan detail konfigurasi berikut:
- Service account name: Masukkan
duo-auth-collector-sa. - Service account description: Masukkan
Service account for Cloud Run function to collect Duo authentication logs.
- Service account name: Masukkan
- Klik Create and Continue.
- Di bagian Grant this service account access to project, tambahkan peran berikut:
- Klik Pilih peran.
- Telusuri dan pilih Storage Object Admin.
- Klik + Add another role.
- Telusuri dan pilih Cloud Run Invoker.
- Klik + Add another role.
- Telusuri dan pilih Cloud Functions Invoker.
- Klik Lanjutkan.
- Klik Done.
Peran ini diperlukan untuk:
- Storage Object Admin: Menulis log ke bucket GCS dan mengelola state file
- Cloud Run Invoker: Mengizinkan Pub/Sub memanggil fungsi
- Cloud Functions Invoker: Mengizinkan pemanggilan fungsi
Memberikan izin IAM di bucket GCS
Beri akun layanan izin tulis di bucket GCS:
- Buka Cloud Storage > Buckets.
- Klik nama bucket Anda.
- Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Tambahkan entitas: Masukkan email akun layanan (misalnya,
duo-auth-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Assign roles: Pilih Storage Object Admin.
- Tambahkan entitas: Masukkan email akun layanan (misalnya,
- Klik Simpan.
Membuat topik Pub/Sub
Buat topik Pub/Sub yang akan dipublikasikan oleh Cloud Scheduler dan di-subscribe oleh fungsi Cloud Run.
- Di Konsol GCP, buka Pub/Sub > Topics.
- Klik Create topic.
- Berikan detail konfigurasi berikut:
- ID Topik: Masukkan
duo-auth-trigger. - Biarkan setelan lainnya sesuai default.
- ID Topik: Masukkan
- Klik Create.
Membuat fungsi Cloud Run untuk mengumpulkan log
Fungsi Cloud Run dipicu oleh pesan Pub/Sub dari Cloud Scheduler untuk mengambil log dari Duo Admin API dan menulisnya ke GCS.
- Di Konsol GCP, buka Cloud Run.
- Klik Create service.
- Pilih Function (gunakan editor inline untuk membuat fungsi).
Di bagian Configure, berikan detail konfigurasi berikut:
Setelan Nilai Nama layanan duo-auth-collectorRegion Pilih region yang cocok dengan bucket GCS Anda (misalnya, us-central1)Runtime Pilih Python 3.12 atau yang lebih baru Di bagian Trigger (optional):
- Klik + Tambahkan pemicu.
- Pilih Cloud Pub/Sub.
- Di Select a Cloud Pub/Sub topic, pilih topik
duo-auth-trigger. - Klik Simpan.
Di bagian Authentication:
- Pilih Wajibkan autentikasi.
- Periksa Identity and Access Management (IAM).
Scroll ke bawah dan luaskan Containers, Networking, Security.
Buka tab Keamanan:
- Service account: Pilih akun layanan
duo-auth-collector-sa.
- Service account: Pilih akun layanan
Buka tab Penampung:
- Klik Variables & Secrets.
- Klik + Add variable untuk setiap variabel lingkungan:
Nama Variabel Nilai Contoh GCS_BUCKETduo-auth-logsGCS_PREFIXduo/auth/STATE_KEYduo/auth/state.jsonDUO_IKEYDIXYZ...DUO_SKEY****************DUO_API_HOSTNAMEapi-XXXXXXXX.duosecurity.comLIMIT500Scroll ke bawah di tab Variables & Secrets ke Requests:
- Request timeout: Masukkan
600detik (10 menit).
- Request timeout: Masukkan
Buka tab Setelan di Penampung:
- Di bagian Resources:
- Memory: Pilih 512 MiB atau lebih tinggi.
- CPU: Pilih 1.
- Klik Done.
- Di bagian Resources:
Scroll ke Execution environment:
- Pilih Default (direkomendasikan).
Di bagian Revision scaling:
- Minimum number of instances: Masukkan
0. - Maximum number of instances: Masukkan
100(atau sesuaikan berdasarkan beban yang diharapkan).
- Minimum number of instances: Masukkan
Klik Create.
Tunggu hingga layanan dibuat (1-2 menit).
Setelah layanan dibuat, editor kode inline akan otomatis terbuka.
Menambahkan kode fungsi
- Masukkan main di Function entry point
Di editor kode inline, buat dua file:
- File pertama: main.py:
#!/usr/bin/env python3 # Cloud Run Function: Pull Duo Admin API v2 Authentication Logs to GCS (raw JSON pages) # Notes: # - Duo v2 requires mintime/maxtime in *milliseconds* (13-digit epoch). # - Pagination via metadata.next_offset ("<millis>,<txid>"). # - We save state (mintime_ms) in ms to resume next run without gaps. import functions_framework from google.cloud import storage import os import json import time import hmac import hashlib import base64 import email.utils import urllib.parse from urllib.request import Request, urlopen from urllib.error import HTTPError, URLError DUO_IKEY = os.environ["DUO_IKEY"] DUO_SKEY = os.environ["DUO_SKEY"] DUO_API_HOSTNAME = os.environ["DUO_API_HOSTNAME"].strip() GCS_BUCKET = os.environ["GCS_BUCKET"] GCS_PREFIX = os.environ.get("GCS_PREFIX", "duo/auth/").strip("/") STATE_KEY = os.environ.get("STATE_KEY", "duo/auth/state.json") LIMIT = min(int(os.environ.get("LIMIT", "500")), 1000) # default 500, max 1000 storage_client = storage.Client() def _canon_params(params: dict) -> str: parts = [] for k in sorted(params.keys()): v = params[k] if v is None: continue parts.append(f"{urllib.parse.quote(str(k), '~')}={urllib.parse.quote(str(v), '~')}") return "&".join(parts) def _sign(method: str, host: str, path: str, params: dict) -> dict: now = email.utils.formatdate() canon = "\n".join([ now, method.upper(), host.lower(), path, _canon_params(params) ]) sig = hmac.new( DUO_SKEY.encode("utf-8"), canon.encode("utf-8"), hashlib.sha1 ).hexdigest() auth = base64.b64encode(f"{DUO_IKEY}:{sig}".encode()).decode() return { "Date": now, "Authorization": f"Basic {auth}" } def _http(method: str, path: str, params: dict, timeout: int = 60, max_retries: int = 5) -> dict: host = DUO_API_HOSTNAME assert host.startswith("api-") and host.endswith(".duosecurity.com"), \ "DUO_API_HOSTNAME must be like api-XXXXXXXX.duosecurity.com" qs = _canon_params(params) url = f"https://{host}{path}" + (f"?{qs}" if qs else "") attempt, backoff = 0, 1.0 while True: req = Request(url, method=method.upper()) req.add_header("Accept", "application/json") for k, v in _sign(method, host, path, params).items(): req.add_header(k, v) try: with urlopen(req, timeout=timeout) as r: return json.loads(r.read().decode("utf-8")) except HTTPError as e: if (e.code == 429 or 500 <= e.code <= 599) and attempt < max_retries: time.sleep(backoff) attempt += 1 backoff *= 2 continue raise except URLError: if attempt < max_retries: time.sleep(backoff) attempt += 1 backoff *= 2 continue raise def _read_state_ms() -> int | None: try: bucket = storage_client.bucket(GCS_BUCKET) blob = bucket.blob(STATE_KEY) if blob.exists(): state_data = blob.download_as_text() val = json.loads(state_data).get("mintime") if val is None: return None # Backward safety: if seconds were stored, convert to ms return int(val) * 1000 if len(str(int(val))) <= 10 else int(val) except Exception: return None def _write_state_ms(mintime_ms: int): bucket = storage_client.bucket(GCS_BUCKET) blob = bucket.blob(STATE_KEY) body = json.dumps({"mintime": int(mintime_ms)}).encode("utf-8") blob.upload_from_string(body, content_type="application/json") def _write_page(payload: dict, when_epoch_s: int, page: int) -> str: bucket = storage_client.bucket(GCS_BUCKET) key = f"{GCS_PREFIX}/{time.strftime('%Y/%m/%d', time.gmtime(when_epoch_s))}/duo-auth-{page:05d}.json" blob = bucket.blob(key) blob.upload_from_string( json.dumps(payload, separators=(",", ":")).encode("utf-8"), content_type="application/json" ) return key def fetch_and_store(): now_s = int(time.time()) # Duo recommends a ~2-minute delay buffer; use maxtime = now - 120 seconds (in ms) maxtime_ms = (now_s - 120) * 1000 mintime_ms = _read_state_ms() or (maxtime_ms - 3600 * 1000) # 1 hour on first run page = 0 total = 0 next_offset = None while True: params = { "mintime": mintime_ms, "maxtime": maxtime_ms, "limit": LIMIT } if next_offset: params["next_offset"] = next_offset data = _http("GET", "/admin/v2/logs/authentication", params) _write_page(data, maxtime_ms // 1000, page) page += 1 resp = data.get("response") items = resp if isinstance(resp, list) else [] total += len(items) meta = data.get("metadata") or {} next_offset = meta.get("next_offset") if not next_offset: break # Advance window to maxtime_ms for next run _write_state_ms(maxtime_ms) return { "ok": True, "pages": page, "events": total, "next_mintime_ms": maxtime_ms } @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Duo authentication logs and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ try: result = fetch_and_store() print(f"Successfully processed {result['events']} events in {result['pages']} pages") print(f"Next mintime_ms: {result['next_mintime_ms']}") except Exception as e: print(f"Error processing logs: {str(e)}") raise- File kedua: requirements.txt:
functions-framework==3.* google-cloud-storage==2.*Klik Deploy untuk menyimpan dan men-deploy fungsi.
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.
- Di Konsol GCP, buka Cloud Scheduler.
- Klik Create Job.
Berikan detail konfigurasi berikut:
Setelan Nilai Nama duo-auth-collector-hourlyRegion Pilih region yang sama dengan fungsi Cloud Run Frekuensi 0 * * * *(setiap jam, tepat pada jamnya)Zona Waktu Pilih zona waktu (UTC direkomendasikan) Jenis target Pub/Sub Topik Pilih topik duo-auth-triggerIsi pesan {}(objek JSON kosong)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 tugas penjadwal
- Di konsol Cloud Scheduler, temukan tugas Anda.
- Klik Force run untuk memicu secara manual.
- Tunggu beberapa detik, lalu buka Cloud Run > Services > duo-auth-collector > Logs.
- Pastikan fungsi berhasil dieksekusi.
- 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.
Mendapatkan email akun layanan
- Buka Setelan > Pengelolaan Data > Feed. Jika Anda menggunakan platform khusus SIEM, buka Settings > Feeds.
- Klik Tambahkan Feed Berita Baru.
- Klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Duo Authentication Logs). - Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih Duo Auth sebagai Log type.
Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comSalin 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.
- Buka Cloud Storage > Buckets.
- Klik nama bucket Anda.
- Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Add principals: Tempel email akun layanan Google SecOps.
- Assign roles: Pilih Storage Object Viewer.
Klik Simpan.
Mengonfigurasi feed di Google SecOps untuk menyerap log autentikasi Duo
- Buka Setelan > Pengelolaan Data > Feed. Jika Anda menggunakan platform khusus SIEM, buka Settings > Feeds.
- Klik Tambahkan Feed Berita Baru.
- Klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Duo Authentication Logs). - Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih Duo Auth sebagai Log type.
- Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
Storage bucket URL: Masukkan URI bucket GCS dengan jalur awalan:
gs://duo-auth-logs/duo/auth/Ganti:
duo-auth-logs: Nama bucket GCS Anda.duo/auth/: Jalur awalan/folder opsional tempat log disimpan (biarkan kosong untuk root).
Contoh:
- Bucket root:
gs://company-logs/ - Dengan awalan:
gs://company-logs/duo-logs/ - Dengan subfolder:
gs://company-logs/duo/auth/
- Bucket root:
Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:
- Never: Tidak pernah menghapus file apa pun setelah transfer (direkomendasikan untuk pengujian).
- Delete transferred files: Menghapus file setelah transfer berhasil.
Delete transferred files and empty directories: Menghapus file dan direktori kosong setelah transfer berhasil.
Usia File Maksimum: Sertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
Namespace aset: Namespace aset.
Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
Klik Berikutnya.
Tinjau konfigurasi feed berita baru Anda di layar Finalize, lalu klik Submit.
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| access_device.browser | target.resource.attribute.labels.value | Jika access_device.browser ada, nilainya akan dipetakan ke UDM. |
| access_device.hostname | principal.hostname | Jika access_device.hostname ada dan tidak kosong, nilainya akan dipetakan ke UDM. Jika kosong dan event_type adalah USER_CREATION, event_type akan diubah menjadi USER_UNCATEGORIZED. Jika access_device.hostname kosong dan kolom hostname ada, nilai hostname akan digunakan. |
| access_device.ip | principal.ip | Jika access_device.ip ada dan merupakan alamat IPv4 yang valid, nilainya akan dipetakan ke UDM. Jika bukan alamat IPv4 yang valid, alamat tersebut akan ditambahkan sebagai nilai string ke additional.fields dengan kunci access_device.ip. |
| access_device.location.city | principal.location.city | Jika ada, nilai akan dipetakan ke UDM. |
| access_device.location.country | principal.location.country_or_region | Jika ada, nilai akan dipetakan ke UDM. |
| access_device.location.state | principal.location.state | Jika ada, nilai akan dipetakan ke UDM. |
| access_device.os | principal.platform | Jika ada, nilai akan diterjemahkan ke nilai UDM yang sesuai (MAC, WINDOWS, LINUX). |
| access_device.os_version | principal.platform_version | Jika ada, nilai akan dipetakan ke UDM. |
| application.key | target.resource.id | Jika ada, nilai akan dipetakan ke UDM. |
| application.name | target.application | Jika ada, nilai akan dipetakan ke UDM. |
| auth_device.ip | target.ip | Jika ada dan bukan "None", nilai akan dipetakan ke UDM. |
| auth_device.location.city | target.location.city | Jika ada, nilai akan dipetakan ke UDM. |
| auth_device.location.country | target.location.country_or_region | Jika ada, nilai akan dipetakan ke UDM. |
| auth_device.location.state | target.location.state | Jika ada, nilai akan dipetakan ke UDM. |
| auth_device.name | target.hostname ATAU target.user.phone_numbers | Jika auth_device.name ada dan merupakan nomor telepon (setelah normalisasi), nomor tersebut akan ditambahkan ke target.user.phone_numbers. Jika tidak, nilai ini akan dipetakan ke target.hostname. |
| client_ip | target.ip | Jika ada dan bukan "None", nilai akan dipetakan ke UDM. |
| client_section | target.resource.attribute.labels.value | Jika client_section ada, nilainya akan dipetakan ke UDM dengan kunci client_section. |
| dn | target.user.userid | Jika dn ada, sedangkan nama pengguna dan username tidak ada, userid akan diekstrak dari kolom dn menggunakan grok dan dipetakan ke UDM. event_type ditetapkan ke USER_LOGIN. |
| event_type | metadata.product_event_type AND metadata.event_type | Nilai dipetakan ke metadata.product_event_type. Nilai ini juga digunakan untuk menentukan metadata.event_type: "authentication" menjadi USER_LOGIN, "enrollment" menjadi USER_CREATION, dan jika kosong atau bukan salah satu dari keduanya, nilai ini akan menjadi GENERIC_EVENT. |
| faktor | extensions.auth.mechanism DAN extensions.auth.auth_details | Nilai ini diterjemahkan ke nilai auth.mechanism UDM yang sesuai (HARDWARE_KEY, REMOTE_INTERACTIVE, LOCAL, OTP). Nilai asli juga dipetakan ke extensions.auth.auth_details. |
| hostname | principal.hostname | Jika ada dan access_device.hostname kosong, nilai akan dipetakan ke UDM. |
| log_format | target.resource.attribute.labels.value | Jika log_format ada, nilainya akan dipetakan ke UDM dengan kunci log_format. |
| loglevel._classuuid_ | target.resource.attribute.labels.value | Jika loglevel._classuuid_ ada, nilainya akan dipetakan ke UDM dengan kunci class_uuid. |
| log_level.name | target.resource.attribute.labels.value AND security_result.severity | Jika log_level.name ada, nilainya akan dipetakan ke UDM dengan nama kunci. Jika nilainya adalah "info", security_result.severity akan ditetapkan ke INFORMATIONAL. |
| log_logger.unpersistable | target.resource.attribute.labels.value | Jika log_logger.unpersistable ada, nilainya akan dipetakan ke UDM dengan kunci unpersistable. |
| log_namespace | target.resource.attribute.labels.value | Jika log_namespace ada, nilainya akan dipetakan ke UDM dengan kunci log_namespace. |
| log_source | target.resource.attribute.labels.value | Jika log_source ada, nilainya akan dipetakan ke UDM dengan kunci log_source. |
| msg | security_result.summary | Jika ada dan alasan kosong, nilai akan dipetakan ke UDM. |
| mampu bernalar | security_result.summary | Jika ada, nilai akan dipetakan ke UDM. |
| hasil | security_result.action_details AND security_result.action | Jika ada, nilai akan dipetakan ke security_result.action_details. "success" atau "SUCCESS" diterjemahkan ke security_result.action ALLOW, jika tidak, BLOCK. |
| server_section | target.resource.attribute.labels.value | Jika server_section ada, nilainya akan dipetakan ke UDM dengan kunci server_section. |
| server_section_ikey | target.resource.attribute.labels.value | Jika server_section_ikey ada, nilainya akan dipetakan ke UDM dengan kunci server_section_ikey. |
| status | security_result.action_details AND security_result.action | Jika ada, nilai akan dipetakan ke security_result.action_details. "Izinkan" diterjemahkan menjadi security_result.action ALLOW, "Tolak" diterjemahkan menjadi BLOCK. |
| timestamp | metadata.event_timestamp DAN event.timestamp | Nilai dikonversi menjadi stempel waktu dan dipetakan ke metadata.event_timestamp dan event.timestamp. |
| txid | metadata.product_log_id DAN network.session_id | Nilai ini dipetakan ke metadata.product_log_id dan network.session_id. |
| user.groups | target.user.group_identifiers | Semua nilai dalam array ditambahkan ke target.user.group_identifiers. |
| user.key | target.user.product_object_id | Jika ada, nilai akan dipetakan ke UDM. |
| user.name | target.user.userid | Jika ada, nilai akan dipetakan ke UDM. |
| nama pengguna | target.user.userid | Jika ada dan user.name tidak ada, nilai akan dipetakan ke UDM. event_type ditetapkan ke USER_LOGIN. |
| (Logika Parser) | metadata.vendor_name | Selalu ditetapkan ke "DUO_SECURITY". |
| (Logika Parser) | metadata.product_name | Selalu ditetapkan ke "MULTI-FACTOR_AUTHENTICATION". |
| (Logika Parser) | metadata.log_type | Diambil dari kolom log_type level teratas log mentah. |
| (Logika Parser) | extensions.auth.type | Selalu ditetapkan ke "SSO". |
access_device.key |
event.idm.read_only_udm.target.resource.product_object_id |
Dipetakan dari log perubahan |
access_device.browser_version |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
access_device.device_info_source |
event.idm.read_only_udm.principal.asset.attribute.labels |
Dipetakan dari log perubahan |
access_device.epkey |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
access_device.flash_version |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
access_device.is_encryption_enabled |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
access_device.is_firewall_enabled |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
trusted_endpoint_status |
event.idm.read_only_udm.principal.asset.attribute.labels |
Dipetakan dari log perubahan |
access_device.is_password_set |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
access_device.java_version |
event.idm.read_only_udm.principal.resource.attribute.labels |
Dipetakan dari log perubahan |
host |
event.idm.read_only_udm.target.hostname |
Dipetakan dari log perubahan |
host |
event.idm.read_only_udm.target.asset.hostname |
Dipetakan dari log perubahan |
application.name |
event.idm.read_only_udm.target.application |
Dipetakan dari log perubahan |
is_supported |
event.idm.read_only_udm.security_result.detection_fields |
Dipetakan dari log perubahan |
trusted_session_uuid |
event.idm.read_only_udm.security_result.detection_fields |
Dipetakan dari log perubahan |
passport_assessment_reason |
event.idm.read_only_udm.security_result.detection_fields |
Dipetakan dari log perubahan |
remembered_factor |
event.idm.read_only_udm.security_result.detection_fields |
Dipetakan dari log perubahan |
passport_assessment.is_potential |
event.idm.read_only_udm.security_result.detection_fields |
Dipetakan dari log perubahan |
access_device.os |
event.idm.read_only_udm.principal.platform |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.detected_attack_detectors |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.features_version |
security_result.detection_fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.model_version |
security_result.detection_fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.policy_enabled |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.preview_mode_enabled |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.reason |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.more_secure_auth.trust_level |
security_result.detection_fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.features_version |
security_result.detection_fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.model_version |
security_result.detection_fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.policy_enabled |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.preview_mode_enabled |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.reason |
additional.fields |
Dipetakan dari log perubahan |
adaptive_trust_assessments.remember_me.trust_level |
security_result.detection_fields |
Dipetakan dari log perubahan |
application.destination_name |
target.application |
Dipetakan dari log perubahan |
auth_stage |
metadata.product_event_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.