Mengumpulkan log konteks Pengguna Duo
Versi Parser: 1.0
Dokumen ini menjelaskan cara menyerap log konteks Duo User 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 mencatat status akun pengguna. Parser ini juga menangani struktur data bertingkat serta melakukan beberapa transformasi dan penggabungan data untuk membuat peristiwa UDM akhir.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Akses istimewa ke Duo Admin Panel
Mengonfigurasi aplikasi Admin API dan mendapatkan kunci
- Login ke Panel Admin Duo sebagai administrator.
- Di sidebar kiri, klik Applications > Manage Applications.
- Tekan tombol Add Application.
- Di kolom penelusuran, ketik Admin API dan klik Add 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 Settings dan tetapkan Permissions ke Grant read resource.
- Klik Simpan Perubahan.
Menyiapkan feed
- 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 Users Logs). - Pilih API Pihak Ketiga sebagai Jenis sumber.
- Pilih jenis log Duo User Context.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Username: Masukkan Integration Key yang disalin sebelumnya.
- Secret: Masukkan Secret Key yang disalin sebelumnya.
- API Hostname: Berikan URL server API Duo (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 Finalisasi, 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. Kunci 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. Kunci 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 pertama 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 pertama 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 nilainya 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 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. Kunci ditetapkan ke "action_name". |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
Nilai diambil langsung dari kolom. Kunci ditetapkan ke "activity_id". |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci ditetapkan ke "created". |
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. Kunci ditetapkan ke "last_login". |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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 tersebut kosong. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci ditetapkan ke "jenis pelaku". |
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 collection_time.seconds dan create_time.seconds yang lebih besar 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 nilai yang lebih besar dari collection_time.seconds dan create_time.seconds 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 |
Key-value pair 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. Kunci ditetapkan ke "from_common_netblock". |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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. Kunci 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. Kunci 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. Kunci 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 ditetapkan 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. Kunci 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 pemetaan ke kolom UDM sama dengan logika untuk 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. Kunci ditetapkan ke "biometrics_status". |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci ditetapkan ke "country_code". |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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. Kunci ditetapkan ke "passcode_status". |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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. Kunci ditetapkan ke "name". |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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. Kunci 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 dan collected_timestamp level teratas. |
type |
event.idm.entity.entity.resource.attribute.labels.value |
Nilai diambil langsung dari kolom. Kunci 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 |
Diprogram ke "Duo". |
| (Logika Parser) | event.idm.entity.metadata.product_name |
Diprogram ke "Duo User Context". |
| (Logika Parser) | event.idm.entity.metadata.entity_type |
Ditentukan berdasarkan keberadaan kolom lain. Jika user_present benar, nilai akan ditetapkan ke "USER". Jika asset_mid_present bernilai benar, kolom ini akan ditetapkan ke "ASSET". Jika ip_present benar, nilai akan ditetapkan ke "IP_ADDRESS". Jika resource_present bernilai benar, nilainya ditetapkan ke "RESOURCE". Jika tidak, nilai ini akan ditetapkan ke "UNKNOWN_ENTITYTYPE". |
| (Logika Parser) | event.idm.entity.relations.entity_type |
Tetapkan 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 |
Tetapkan ke "MOBILE" jika phones[0] tidak kosong. |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.