Mengumpulkan log konteks Pengguna Duo
Dokumen ini menjelaskan cara menyerap log konteks Pengguna Duo ke Google Security Operations menggunakan API. Parser memproses data JSON, memetakan informasi pengguna (termasuk membuat alias nama pengguna ke alamat email, grup, nomor telepon, dan detail perangkat) ke UDM dan merekam status akun pengguna. Selain itu, UDM juga menangani struktur data bertingkat dan melakukan beberapa transformasi serta penggabungan data untuk membuat peristiwa UDM akhir.
Sebelum memulai
Pastikan Anda memenuhi prasyarat berikut:
- Instance Google SecOps
- Akses istimewa ke Panel Admin Duo
Mengonfigurasi aplikasi Admin API dan mendapatkan kunci
- Login ke Panel Admin Duo sebagai administrator.
- Di sidebar kiri, klik Aplikasi > Kelola Aplikasi.
- Tekan tombol Add Application.
- Di kolom penelusuran, ketik Admin API, lalu klik Tambahkan di samping Duo Admin API.
- Di layar berikutnya, informasi berikut akan ditampilkan:
- Kunci Integrasi: (string seperti
DIYYYYYYYYYYYYYY
). - Secret Key: string 40 karakter.
- Nama host API: Misalnya,
api-abcd1234.duosecurity.com
.
- Kunci Integrasi: (string seperti
- Salin dan simpan Integration Key, Secret Key, dan API hostname ke lokasi yang aman.
- Scroll ke Setelan dan tetapkan Izin ke Berikan akses baca resource.
- Klik Simpan Perubahan.
Menyiapkan feed
- Buka Setelan SIEM > Feed.
- Klik + Tambahkan Feed Baru.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Duo Users Logs
). - Pilih Third Party API sebagai Source type.
- Pilih jenis log Konteks Pengguna Duo.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Nama pengguna: Masukkan Kunci Integrasi yang disalin sebelumnya.
- Secret: Masukkan Secret Key yang disalin sebelumnya.
- Nama Host API: Berikan URL server Duo API (misalnya,
api-abcd1234.duosecurity.com
). - Namespace aset: Namespace aset.
- Label penyerapan: Label yang diterapkan ke peristiwa dari feed ini.
- Klik Berikutnya.
- Tinjau konfigurasi feed di layar Selesaikan, lalu klik Kirim.
Tabel Pemetaan UDM
Kolom Log | Pemetaan UDM | Logika |
---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom access_device.browser atau surfaced_auth.access_device.browser jika kolom sebelumnya kosong. Kuncinya ditetapkan ke "access_device browser". |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom access_device.browser_version atau surfaced_auth.access_device.browser_version jika kolom sebelumnya kosong. Kuncinya ditetapkan ke "access_device browser_version". |
access_device.ip.address |
event.idm.entity.entity.ip |
Nilai diambil langsung dari kolom access_device.ip.address atau surfaced_auth.access_device.ip jika kolom sebelumnya kosong. |
access_device.location.city |
event.idm.entity.entity.location.city |
Nilai diambil langsung dari kolom access_device.location.city atau surfaced_auth.access_device.location.city jika kolom sebelumnya kosong. |
access_device.location.country |
event.idm.entity.entity.location.country_or_region |
Nilai diambil langsung dari kolom access_device.location.country atau surfaced_auth.access_device.location.country jika kolom sebelumnya kosong. |
access_device.location.state |
event.idm.entity.entity.location.state |
Nilai diambil langsung dari kolom access_device.location.state atau surfaced_auth.access_device.location.state jika kolom sebelumnya kosong. |
access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
Nilai ini berasal dari kolom access_device.os atau surfaced_auth.access_device.os jika kolom sebelumnya kosong. Jika nilai cocok (tidak peka huruf besar/kecil) dengan "ios" atau "mac", kolom UDM akan ditetapkan ke "MAC". Jika cocok dengan "windows", kolom UDM akan ditetapkan ke "WINDOWS". Jika cocok dengan "linux", kolom UDM akan ditetapkan ke "LINUX". |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
Nilai diambil langsung dari kolom access_device.os_version atau surfaced_auth.access_device.os_version jika kolom sebelumnya kosong. |
action.details |
event.idm.entity.sec_result.action_details |
Nilai diambil dari kolom ini jika action kosong. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci disetel ke "dibuat". |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
Nilai diambil langsung dari kolom. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
Nilai diambil langsung dari kolom. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
Nilai diambil langsung dari kolom. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "status". |
actor.key |
event.idm.entity.entity.resource.product_object_id |
Nilai diambil langsung dari kolom. |
actor.name |
event.idm.entity.entity.user.user_display_name |
Nilai diambil langsung dari kolom atau surfaced_auth.user.name jika kolom kosong. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "actor type". |
akey |
event.idm.entity.metadata.product_entity_id |
Nilai diambil langsung dari kolom, atau sekey jika akey kosong. |
application |
event.idm.entity.entity.application |
Nilai diambil langsung dari kolom. |
collection_time.seconds , create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds , event.timestamp.seconds |
Nilai yang lebih besar dari collection_time.seconds dan create_time.seconds digunakan untuk collected_timestamp.seconds dan timestamp.seconds tingkat teratas. |
collection_time.nanos , create_time.nanos |
event.idm.entity.metadata.collected_timestamp.nanos , event.timestamp.nanos |
Nilai nanodetik yang sesuai dengan collection_time.seconds dan create_time.seconds yang lebih besar digunakan untuk collected_timestamp.nanos dan timestamp.nanos tingkat teratas. |
email |
event.idm.entity.entity.user.email_addresses |
Nilai diambil langsung dari kolom. |
explanations |
event.idm.entity.entity.resource.attribute.labels |
Pasangan nilai kunci dalam setiap objek di array explanations dikonversi menjadi label. Kunci untuk setiap label diawali dengan "explanation ". |
firstname |
event.idm.entity.entity.user.first_name |
Nilai diambil langsung dari kolom. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "from_new_user". |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
Nilai diambil langsung dari kolom. |
lastname |
event.idm.entity.entity.user.last_name |
Nilai diambil langsung dari kolom. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "low_risk_ip". |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
Nilai diambil langsung dari kolom. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
Nilai diambil langsung dari kolom. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
Nilai diambil langsung dari kolom. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
Nilai diambil langsung dari kolom. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "priority_event". |
realname |
event.idm.entity.entity.user.user_display_name |
Nilai diambil langsung dari kolom. |
sekey |
event.idm.entity.metadata.product_entity_id |
Nilai diambil langsung dari kolom jika akey kosong. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "state". |
status |
event.idm.entity.entity.user.attribute.labels.value , event.idm.entity.entity.user.user_authentication_status |
Nilai diambil langsung dari kolom. Kunci untuk label disetel ke "status". Nilai ini juga digunakan untuk menentukan user_authentication_status . "active" dan "bypass" dipetakan ke "ACTIVE", "disabled" dan "pending deletion" dipetakan ke "SUSPENDED", dan "locked out" dipetakan ke "NO_ACTIVE_CREDENTIALS". |
surfaced_auth.access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil dari kolom ini jika access_device.browser kosong. Kunci ditetapkan ke "surfaced_auth access_device browser". |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil dari kolom ini jika access_device.browser_version kosong. Kuncinya ditetapkan ke "surfaced_auth access_device browser_version". |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
Nilai diambil dari kolom ini jika access_device.ip.address kosong. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
Nilai diambil dari kolom ini jika access_device.location.city kosong. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
Nilai diambil dari kolom ini jika access_device.location.country kosong. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
Nilai diambil dari kolom ini jika access_device.location.state kosong. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
Nilai diambil dari kolom ini jika access_device.os kosong. Logika untuk memetakan ke kolom UDM sama dengan access_device.os . |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
Nilai diambil dari kolom ini jika access_device.os_version kosong. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
Nilai diambil dari kolom ini jika username kosong. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
Nilai diambil dari kolom ini jika actor.name kosong. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "extension". |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
Nilai diambil langsung dari kolom. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
Nilai diambil langsung dari kolom. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
Nilai diambil langsung dari kolom. |
target.details.os |
event.idm.entity.entity.asset.software.name |
Nilai diambil langsung dari kolom. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
Nilai diambil langsung dari kolom. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "tampered_status". |
target.key |
event.idm.entity.entity.asset.asset_id |
Nilai diambil langsung dari kolom. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "type". |
triage_event_uri |
event.idm.entity.entity.url |
Nilai diambil langsung dari kolom. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "triaged_as_interesting". |
ts |
event.timestamp.seconds , event.idm.entity.metadata.collected_timestamp.seconds |
Stempel waktu diuraikan dari kolom ini jika ada, menggunakan format ISO8601 atau RFC 3339. Detik dan nanodetik yang diekstrak digunakan untuk timestamp tingkat teratas dan collected_timestamp . |
type |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kuncinya ditetapkan ke "type". |
user_id |
event.idm.entity.metadata.product_entity_id |
Nilai diambil langsung dari kolom. |
username |
event.idm.entity.entity.user.userid |
Nilai diambil langsung dari kolom, atau surfaced_auth.user.key jika username kosong. |
(Logika Parser) | event.idm.entity.metadata.vendor_name |
Dikodekan secara permanen ke "Duo". |
(Logika Parser) | event.idm.entity.metadata.product_name |
Dikodekan secara permanen ke "Konteks Pengguna Duo". |
(Logika Parser) | event.idm.entity.metadata.entity_type |
Ditentukan berdasarkan keberadaan kolom lain. Jika user_present benar, setel ke "USER". Jika asset_mid_present benar, maka akan ditetapkan ke "ASSET". Jika ip_present benar, maka akan ditetapkan ke "IP_ADDRESS". Jika resource_present benar, maka akan disetel ke "RESOURCE". Jika tidak, nilai ini akan ditetapkan ke "UNKNOWN_ENTITYTYPE". |
(Logika Parser) | event.idm.entity.relations.entity_type |
Setel ke "ASSET" jika phones[0] tidak kosong. |
(Logika Parser) | event.idm.entity.relations.relationship |
Tetapkan ke "OWNS" jika phones[0] tidak kosong. |
(Logika Parser) | event.idm.entity.relations.entity.asset.type |
Ditetapkan ke "MOBILE" jika phones[0] tidak kosong. |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.