איסוף יומנים של הקשר משתמש ב-Duo
גרסת כלי הניתוח: 1.0
במאמר הזה מוסבר איך להטמיע יומני הקשר של משתמשי Duo ב-Google Security Operations באמצעות API. הכלי לניתוח נתונים מעבד נתוני JSON, ממפה את פרטי המשתמשים (כולל כינויים של שמות משתמשים לכתובות אימייל, לקבוצות, למספרי טלפון ולפרטי מכשירים) ל-UDM ומתעד את הסטטוס של חשבון המשתמש. בנוסף, הוא מטפל במבני נתונים מקוננים ומבצע כמה טרנספורמציות ומיזוגים של נתונים כדי ליצור את אירוע UDM הסופי.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- גישה עם הרשאות ללוח האדמין של Duo
הגדרת האפליקציה של Admin API וקבלת המפתחות
- נכנסים לDuo Admin Panel כאדמינים.
- בסרגל הצד השמאלי, לוחצים על Applications (אפליקציות) > Manage Applications (ניהול אפליקציות).
- לוחצים על הלחצן הוספת אפליקציה.
- בשדה החיפוש, כותבים Admin API ולוחצים על Add (הוספה) לצד Duo Admin API.
- במסך הבא מוצג המידע הבא:
- מפתח שילוב: (מחרוזת כמו
DIYYYYYYYYYYYYYY). - מפתח סודי: מחרוזת באורך 40 תווים.
- שם המארח של ה-API: לדוגמה,
api-abcd1234.duosecurity.com.
- מפתח שילוב: (מחרוזת כמו
- מעתיקים ושומרים את מפתח השילוב, המפתח הסודי ושם המארח של ה-API במקום מאובטח.
- גוללים אל הגדרות ומגדירים את ההרשאות למתן הרשאת קריאה למשאב.
- לוחצים על שמירת השינויים.
הגדרת פידים
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על + הוספת פיד חדש.
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Duo Users Logs). - בוחרים באפשרות Third Party API (API של צד שלישי) בתור Source type (סוג המקור).
- בוחרים את סוג היומן Duo User Context.
- לוחצים על הבא.
- מציינים ערכים לפרמטרים הבאים של הקלט:
- שם משתמש: מזינים את מפתח השילוב שהועתק קודם.
- Secret: מזינים את המפתח הסודי שהועתק קודם.
- שם המארח של ה-API: מזינים את כתובת ה-URL של שרת Duo API (לדוגמה,
api-abcd1234.duosecurity.com). - מרחב השמות של הנכס: מרחב השמות של הנכס.
- תוויות להוספה: התווית שמוחלת על האירועים מהפיד הזה.
- לוחצים על הבא.
- בודקים את הגדרות הפיד במסך סיום ולוחצים על שליחה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה access_device.browser או מהשדה surfaced_auth.access_device.browser אם השדה הראשון ריק. המפתח מוגדר כ-access_device browser. |
access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה access_device.browser_version או מהשדה surfaced_auth.access_device.browser_version אם השדה הראשון ריק. המפתח מוגדר כ-access_device browser_version. |
access_device.ip.address |
event.idm.entity.entity.ip |
הערך נלקח ישירות מהשדה access_device.ip.address או מהשדה surfaced_auth.access_device.ip אם השדה הראשון ריק. |
access_device.location.city |
event.idm.entity.entity.location.city |
הערך נלקח ישירות מהשדה access_device.location.city או מהשדה surfaced_auth.access_device.location.city אם השדה הראשון ריק. |
access_device.location.country |
event.idm.entity.entity.location.country_or_region |
הערך נלקח ישירות מהשדה access_device.location.country או מהשדה surfaced_auth.access_device.location.country אם השדה הראשון ריק. |
access_device.location.state |
event.idm.entity.entity.location.state |
הערך נלקח ישירות מהשדה access_device.location.state או מהשדה surfaced_auth.access_device.location.state אם השדה הראשון ריק. |
access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
הערך נגזר מהשדה access_device.os או surfaced_auth.access_device.os אם השדה הראשון ריק. אם הערך תואם (לא תלוי באותיות רישיות) ל-ios או ל-mac, השדה UDM מוגדר כ-MAC. אם הוא תואם ל-'windows', השדה UDM מוגדר ל-'WINDOWS'. אם הוא תואם ל-'linux', השדה UDM מוגדר ל-'LINUX'. |
access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
הערך נלקח ישירות מהשדה access_device.os_version או מהשדה surfaced_auth.access_device.os_version אם השדה הראשון ריק. |
action.details |
event.idm.entity.sec_result.action_details |
הערך נלקח מהשדה הזה אם השדה action ריק. |
action.name |
event.idm.entity.sec_result.detection_fields.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-action_name. |
activity_id |
event.idm.entity.sec_result.detection_fields.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-activity_id. |
actor.details.created |
event.idm.entity.entity.user.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'created'. |
actor.details.email |
event.idm.entity.entity.user.email_addresses |
הערך נלקח ישירות מהשדה. |
actor.details.groups.key |
event.idm.entity.entity.user.group_identifiers |
הערך נלקח ישירות מהשדה. |
actor.details.groups.name |
event.idm.entity.entity.user.group_identifiers |
הערך נלקח ישירות מהשדה. |
actor.details.last_login |
event.idm.entity.entity.user.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-last_login. |
actor.details.status |
event.idm.entity.entity.user.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'סטטוס'. |
actor.key |
event.idm.entity.entity.resource.product_object_id |
הערך נלקח ישירות מהשדה. |
actor.name |
event.idm.entity.entity.user.user_display_name |
הערך נלקח ישירות מהשדה או מ-surfaced_auth.user.name אם השדה ריק. |
actor.type |
event.idm.entity.entity.user.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'actor type'. |
akey |
event.idm.entity.metadata.product_entity_id |
הערך נלקח ישירות מהשדה, או sekey אם akey ריק. |
application |
event.idm.entity.entity.application |
הערך נלקח ישירות מהשדה. |
collection_time.seconds, create_time.seconds |
event.idm.entity.metadata.collected_timestamp.seconds, event.timestamp.seconds |
הערך הגדול מבין collection_time.seconds ו-create_time.seconds משמש גם ל-collected_timestamp.seconds וגם ל-timestamp.seconds ברמה העליונה. |
collection_time.nanos, create_time.nanos |
event.idm.entity.metadata.collected_timestamp.nanos, event.timestamp.nanos |
הערך בננו-שניות שמתאים לגדול מבין collection_time.seconds ו-create_time.seconds משמש גם ל-collected_timestamp.nanos וגם ל-timestamp.nanos ברמה העליונה. |
email |
event.idm.entity.entity.user.email_addresses |
הערך נלקח ישירות מהשדה. |
explanations |
event.idm.entity.entity.resource.attribute.labels |
צמדי המפתח/ערך בכל אובייקט במערך explanations מומרים לתוויות. לפני המפתח של כל תווית מופיע המחרוזת 'explanation '. |
firstname |
event.idm.entity.entity.user.first_name |
הערך נלקח ישירות מהשדה. |
from_common_netblock |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-from_common_netblock. |
from_new_user |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר לערך from_new_user. |
groups.N.name (N=0..10) |
event.idm.entity.entity.user.group_identifiers |
הערך נלקח ישירות מהשדה. |
lastname |
event.idm.entity.entity.user.last_name |
הערך נלקח ישירות מהשדה. |
low_risk_ip |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-low_risk_ip. |
phones.0.model |
event.idm.entity.relations.entity.asset.hardware.model |
הערך נלקח ישירות מהשדה. |
phones.0.number |
event.idm.entity.entity.user.phone_numbers |
הערך נלקח ישירות מהשדה. |
phones.0.phone_id |
event.idm.entity.relations.entity.asset.product_object_id |
הערך נלקח ישירות מהשדה. |
phones.0.platform |
event.idm.entity.relations.entity.asset.hardware.manufacturer |
הערך נלקח ישירות מהשדה. |
priority_event |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'priority_event'. |
realname |
event.idm.entity.entity.user.user_display_name |
הערך נלקח ישירות מהשדה. |
sekey |
event.idm.entity.metadata.product_entity_id |
הערך נלקח ישירות מהשדה אם akey ריק. |
state |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-state. |
status |
event.idm.entity.entity.user.attribute.labels.value, event.idm.entity.entity.user.user_authentication_status |
הערך נלקח ישירות מהשדה. המפתח של התווית מוגדר כ-'סטטוס'. הערך הזה משמש גם לקביעת user_authentication_status. הערכים 'פעיל' ו'עקיפה' ממופים לערך 'ACTIVE', הערכים 'מושבת' ו'ממתין למחיקה' ממופים לערך 'SUSPENDED', והערך 'נעול' ממופה לערך 'NO_ACTIVE_CREDENTIALS'. |
surfaced_auth.access_device.browser |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח מהשדה הזה אם השדה access_device.browser ריק. המפתח מוגדר כ-surfaced_auth access_device browser. |
surfaced_auth.access_device.browser_version |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח מהשדה הזה אם השדה access_device.browser_version ריק. המפתח מוגדר כ-surfaced_auth access_device browser_version. |
surfaced_auth.access_device.ip |
event.idm.entity.entity.ip |
הערך נלקח מהשדה הזה אם השדה access_device.ip.address ריק. |
surfaced_auth.access_device.location.city |
event.idm.entity.entity.location.city |
הערך נלקח מהשדה הזה אם השדה access_device.location.city ריק. |
surfaced_auth.access_device.location.country |
event.idm.entity.entity.location.country_or_region |
הערך נלקח מהשדה הזה אם השדה access_device.location.country ריק. |
surfaced_auth.access_device.location.state |
event.idm.entity.entity.location.state |
הערך נלקח מהשדה הזה אם השדה access_device.location.state ריק. |
surfaced_auth.access_device.os |
event.idm.entity.entity.asset.platform_software.platform |
הערך נלקח מהשדה הזה אם השדה access_device.os ריק. הלוגיקה של המיפוי לשדה UDM זהה ללוגיקה של access_device.os. |
surfaced_auth.access_device.os_version |
event.idm.entity.entity.asset.platform_software.platform_version |
הערך נלקח מהשדה הזה אם השדה access_device.os_version ריק. |
surfaced_auth.user.key |
event.idm.entity.entity.user.userid |
הערך נלקח מהשדה הזה אם השדה username ריק. |
surfaced_auth.user.name |
event.idm.entity.entity.user.user_display_name |
הערך נלקח מהשדה הזה אם השדה actor.name ריק. |
target.details.biometrics_status |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-biometrics_status. |
target.details.country_code |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-country_code. |
target.details.extension |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'extension'. |
target.details.manufacturer |
event.idm.entity.entity.asset.hardware.manufacturer |
הערך נלקח ישירות מהשדה. |
target.details.model |
event.idm.entity.entity.asset.hardware.model |
הערך נלקח ישירות מהשדה. |
target.details.number |
event.idm.entity.entity.user.phone_numbers |
הערך נלקח ישירות מהשדה. |
target.details.os |
event.idm.entity.entity.asset.software.name |
הערך נלקח ישירות מהשדה. |
target.details.os_version |
event.idm.entity.entity.asset.software.version |
הערך נלקח ישירות מהשדה. |
target.details.passcode_status |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-passcode_status. |
target.details.tampered_status |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-tampered_status. |
target.key |
event.idm.entity.entity.asset.asset_id |
הערך נלקח ישירות מהשדה. |
target.name |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'name'. |
target.type |
event.idm.entity.entity.asset.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'type'. |
triage_event_uri |
event.idm.entity.entity.url |
הערך נלקח ישירות מהשדה. |
triaged_as_interesting |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-triaged_as_interesting. |
ts |
event.timestamp.seconds, event.idm.entity.metadata.collected_timestamp.seconds |
חותמת הזמן מנותחת מהשדה הזה אם הוא קיים, באמצעות פורמט ISO8601 או RFC 3339. השניות והננו-שניות שחולצו משמשות גם ל-timestamp ברמה העליונה וגם ל-collected_timestamp. |
type |
event.idm.entity.entity.resource.attribute.labels.value |
הערך נלקח ישירות מהשדה. המפתח מוגדר כ-'type'. |
user_id |
event.idm.entity.metadata.product_entity_id |
הערך נלקח ישירות מהשדה. |
username |
event.idm.entity.entity.user.userid |
הערך נלקח ישירות מהשדה, או surfaced_auth.user.key אם username ריק. |
| (Parser Logic) | event.idm.entity.metadata.vendor_name |
ההגדרה מוצפנת כ-Duo. |
| (Parser Logic) | event.idm.entity.metadata.product_name |
מוגדר כ-Duo User Context (הקשר של משתמש Duo). |
| (Parser Logic) | event.idm.entity.metadata.entity_type |
נקבע על סמך נוכחות של שדות אחרים. אם user_present מוגדר כ-True, הערך שלו הוא USER. אם asset_mid_present הוא true, הערך מוגדר כ-ASSET. אם הערך של ip_present הוא true, הערך מוגדר כ-IP_ADDRESS. אם resource_present הוא true, הערך מוגדר כ-RESOURCE. אחרת, הערך הוא UNKNOWN_ENTITYTYPE. |
| (Parser Logic) | event.idm.entity.relations.entity_type |
אם phones[0] לא ריק, צריך להגדיר את הערך כ-ASSET. |
| (Parser Logic) | event.idm.entity.relations.relationship |
אם phones[0] לא ריק, צריך להגדיר את הערך כ-OWNS. |
| (Parser Logic) | event.idm.entity.relations.entity.asset.type |
אם phones[0] לא ריק, הערך שמוגדר הוא MOBILE. |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.