איסוף יומנים של Workday HCM
במאמר הזה מוסבר איך להטמיע יומני רישום של Workday HCM ב-Google Security Operations באמצעות הגדרת פיד דרך Third Party API.
הכלי לניתוח מחלץ נתוני משתמשים מ-Workday HCM מיומנים בפורמט JSON. הוא מטפל בטרנספורמציות שונות של נתונים, כולל שינוי שמות של שדות, מיזוג של אובייקטים מוטמעים, ניתוח תאריכים ואכלוס של שדות UDM עבור מאפייני משתמש, פרטי העסקה ומבנה ארגוני.
לפני שמתחילים
חשוב לוודא שמתקיימות דרישות הסף הבאות:
- מופע של Google SecOps.
- גישה עם הרשאות מיוחדות ל-Workday עם הרשאות אדמין אבטחה או הרשאות שוות ערך.
הגדרת אימות של Workday API
יצירת משתמש מערכת שילוב (ISU)
- נכנסים ל-Workday עם הרשאות אדמין.
- בסרגל החיפוש, כותבים Create Integration System User ובוחרים את המשימה.
- מזינים שם משתמש (לדוגמה,
ISU_SecOps_HCM). - מגדירים סיסמה.
- מגדירים את Session Timeout Minutes (הזמן הקצוב לתפוגה של סשן בדקות) לערך
0כדי למנוע את התפוגה של ISU. - כדי לשפר את האבטחה, מפעילים את האפשרות Do Not Allow UI Sessions כדי להגביל את הכניסות לחשבון דרך ממשק המשתמש.
- עוברים למשימה Maintain Password Rules (תחזוקת כללי הסיסמאות).
- מוסיפים את משתמש המערכת לשילוב לשדה משתמשי מערכת שפטורים מתפוגת סיסמה.
יצירת קבוצת אבטחה לשילוב
- בסרגל החיפוש, כותבים Create Security Group ובוחרים את המשימה.
- מאתרים את השדה Type of Tenanted Security Group (סוג קבוצת אבטחה בדייר) ובוחרים באפשרות Integration System Security Group (Unconstrained) (קבוצת אבטחה של מערכת שילוב (ללא הגבלות)).
- מזינים שם לקבוצת האבטחה (לדוגמה,
ISG_SecOps_HCM). - לוחצים על OK.
- לוחצים על עריכה ליד קבוצת האבטחה החדשה שנוצרה.
- מקצים את משתמש המערכת לשילוב מהשלב הקודם לקבוצת האבטחה.
- לוחצים על סיום.
הענקת גישה לדומיין לקבוצת האבטחה
הפיד של Google SecOps מאחזר נתונים מארבע נקודות קצה ל-API בארכיטקטורת REST של Workday. לכל נקודת קצה צריך להעניק הרשאות ספציפיות של מדיניות אבטחת דומיין לקבוצת האבטחה של השילוב.
- בסרגל החיפוש, מקלידים Maintain Permissions for Security Group ובוחרים את המשימה.
- ברשימה Source Security Group (קבוצת אבטחה של המקור), בוחרים את קבוצת האבטחה שיצרתם (לדוגמה,
ISG_SecOps_HCM). - לוחצים על OK.
- עוברים אל הרשאות במדיניות האבטחה של הדומיין.
מוסיפים גישת GET לכל אחד מהדומיינים הבאים:
נקודת קצה ל-API מדיניות אבטחה נדרשת לדומיין /workers— רשימת העובדים, הפרופילים והצוות הנוכחיWorker Data: Public Worker Reports,Worker Data: Current Staffing Information,Person Data: Work Contact Information /workers/{id}/timeOffEntries— יתרות של ימי חופשהWorker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history— היסטוריית כוח האדםWorker Data: Current Staffing Information /supervisoryOrganizations— מבנה ארגוניWorker Data: Organization Informationלוחצים על OK.
לוחצים על סיום כדי לשמור את השינויים.
הפעלת שינויים במדיניות האבטחה
- בסרגל החיפוש, כותבים Activate Pending Security Policy Changes ובוחרים את המשימה.
- בשדה ההערה, מזינים את הסיבה לשינוי (לדוגמה,
Granting API access for Google SecOps HCM integration). - לוחצים על OK.
- לוחצים על אישור ואז על אישור.
רישום לקוח API לשילובים
- בסרגל החיפוש, מקלידים Register API Client for Integrations ובוחרים באפשרות הזו.
- לוחצים על יצירה.
מספקים את פרטי ההגדרה הבאים:
- שם הלקוח: מזינים שם (לדוגמה,
Google SecOps HCM Client). - משתמש מערכת: בוחרים את משתמש מערכת השילוב שיצרתם (לדוגמה,
ISU_SecOps_HCM). היקף: בוחרים את היקפי ההרשאות הבאים:
היקף חובה בשביל Staffing נקודות קצה של /workersושל/workers/{id}/historyפרטים ליצירת קשר שדות של כתובת אימייל ומספר טלפון בעבודה שמוחזרים על ידי /workers(משמשים להתאמה ב-UDM)חופשה /workers/{id}/timeOffEntriesנקודת קצהארגונים ותפקידים /supervisoryOrganizationsנקודת קצהTenant Non-Configurable כל לקוח API של OAuth 2.0 (שילוב ברמת המערכת ורוטציה של אסימונים)
- שם הלקוח: מזינים שם (לדוגמה,
לוחצים על Save.
לוחצים על OK.
מעתיקים ושומרים מיד את מזהה הלקוח ואת הסוד של הלקוח.
יצירת טוקן רענון מסוג OAuth 2.0
- בסרגל החיפוש, מקלידים Manage Refresh Tokens for Integrations (ניהול טוקנים לרענון שילובים) ובוחרים את האפשרות.
- לוחצים על יצירת טוקן רענון חדש.
- בשדה Workday Account (חשבון Workday), מחפשים את Integration System User (משתמש מערכת שילוב) ובוחרים אותו (לדוגמה,
ISU_SecOps_HCM). - בוחרים את לקוח ה-API שיצרתם ולוחצים על OK.
- מעתיקים את טוקן הרענון ושומרים אותו.
קבלת כתובות URL של נקודות קצה ל-API
- בסרגל החיפוש, מקלידים View API Clients ובוחרים באפשרות הזו.
- בקטע API Clients for Integrations (לקוחות API לשילובים), מאתרים את הלקוח שיצרתם (לדוגמה,
Google SecOps HCM Client). מעתיקים ושומרים את הפרטים הבאים:
- נקודת קצה של טוקן: כתובת ה-URL לקבלת טוקן גישה (לדוגמה,
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token). - Workday REST API Endpoint: כתובת ה-URL הבסיסית לקריאות API בארכיטקטורת REST (לדוגמה,
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT).
- נקודת קצה של טוקן: כתובת ה-URL לקבלת טוקן גישה (לדוגמה,
יצירת אסימון גישה מסוג OAuth
משתמשים ב-curl או בלקוח HTTP דומה כדי לשלוח בקשת POST לנקודת הקצה של האסימון:
curl -X POST "https://HOSTNAME/ccx/oauth2/TENANT/token" \
-d "grant_type=refresh_token" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "refresh_token=YOUR_REFRESH_TOKEN"
הפעולה הזו מחזירה טוקן גישה (לדוגמה, "access_token": "abcd1234"). מעתיקים ושומרים את טוקן הגישה.
אימות הגישה ל-API
לפני שמגדירים את הפיד, צריך לוודא של-ISU יש את ההרשאות הנדרשות לנקודות הקצה של המפתח. מחליפים את המשתנים בערכים בפועל:
TOKEN="your-access-token"
HOST="your-workday-host"
TENANT="your-tenant"
# Test 1: Workers (should return worker list)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers?limit=1"
# Test 2: Time off entries (replace WORKER_ID with an ID from Test 1)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/timeOffEntries"
# Test 3: Worker history (replace WORKER_ID with an ID from Test 1)
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/history"
# Test 4: Supervisory organizations
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $TOKEN" \
"https://$HOST/ccx/api/v1/$TENANT/supervisoryOrganizations"
כל בדיקה צריכה להחזיר סטטוס HTTP 200. אם נקודת קצה כלשהי מחזירה 403, אפשר לעיין בקטע פתרון בעיות בהמשך.
הגדרה של פיד ב-Google SecOps להטמעה של נתוני Workday HCM
הגדרת הפיד
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- בדף הבא, לוחצים על הגדרת פיד יחיד.
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Workday HCM). - בוחרים באפשרות Third Party API (API של צד שלישי) בתור Source type (סוג המקור).
- בוחרים באפשרות Workday בתור סוג היומן.
- לוחצים על הבא.
הגדרת פרמטרים של פיד
מציינים ערכים לפרמטרים הבאים של הקלט:
API Hostname (שם המארח של ה-API): שם דומיין שמוגדר במלואו של נקודת קצה ל-API בארכיטקטורת REST של Workday (לדוגמה,
wd2-impl-services1.workday.com).Tenant: רכיב הנתיב האחרון של נקודת הקצה של Workday REST API שמזהה את מופע Workday שלכם.
אסימון גישה: אסימון הגישה מסוג OAuth שנוצר בקטע הקודם.
אפשרויות מתקדמות:
- מרחב השמות של הנכס: מרחב השמות של הנכס.
- תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה.
- לוחצים על הבא.
- בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.
פתרון בעיות
403 Forbidden בנקודות קצה ספציפיות
אם בפיד מדווח על שגיאות או שפקודות ה-curl לאימות מחזירות 403 לנקודות קצה ספציפיות, סימן שלמשתמש של מערכת השילוב חסרות הרשאות.
| נקודת קצה שנכשלה | תיקון |
|---|---|
/workers/{id}/timeOffEntries |
מוסיפים גישת GET לדומיינים Worker Data: Time Off (Time Off Balances) ו-Worker Data: Time Off (Time Off Balances Manager View). מוסיפים את ההיקף Time Off and Leave ללקוח ה-API. |
/workers/{id}/history |
מוסיפים גישת GET לדומיין Worker Data: Historical Staffing Information. מוודאים שההיקף Staffing מוקצה ללקוח ה-API. |
/supervisoryOrganizations |
מוסיפים גישת GET לדומיין Manage: Supervisory Organization או View: Supervisory Organization. מוסיפים את ההיקף Organizations and Roles (ארגונים ותפקידים) ללקוח ה-API. |
אחרי שמבצעים שינויים בהרשאות:
- מריצים את Activate Pending Security Policy Changes ב-Workday.
- אם הוספתם היקפי הרשאה חדשים ללקוח ה-API, צריך ליצור אסימון רענון חדש באמצעות ניהול אסימוני רענון לשילובים ואז ליצור אסימון גישה חדש.
- אם אסימון הגישה השתנה, מעדכנים את ההגדרה של הפיד עם אסימון הגישה החדש.
שגיאות אימות
- 401 Unauthorized: תוקף אסימון הגישה פג. יוצרים טוקן חדש באמצעות טוקן הרענון ומעדכנים את הפיד.
- לקוח לא תקין: צריך לוודא שמזהה הלקוח והסוד של הלקוח נכונים.
- Invalid refresh token: יכול להיות שאסימון הרענון בוטל. אפשר ליצור טוקן חדש באמצעות ניהול טוקנים לרענון לשילובים.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
entity_host_name |
entity.asset.hostname |
מיפוי ישיר |
location.descriptor |
entity.location.city |
מיפוי ישיר |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
מיפוי ישיר |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
מיפוי ישיר |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
מיפוי ישיר |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
מיפוי ישיר |
href |
entity.url |
מיפוי ישיר |
CONT_START_DTE |
entity.user.attribute.labels.value |
מיפוי ישיר |
EMPL_TYPE |
entity.user.attribute.labels.value |
מיפוי ישיר |
EXEC_CD |
entity.user.attribute.labels.value |
מיפוי ישיר |
EXEC_DESCR |
entity.user.attribute.labels.value |
מיפוי ישיר |
HR_Status |
entity.user.attribute.labels.value |
מיפוי ישיר |
Is_Active |
entity.user.attribute.labels.value |
מיפוי ישיר |
Is_Manager |
entity.user.attribute.labels.value |
מיפוי ישיר |
JOB_CODE |
entity.user.attribute.labels.value |
מיפוי ישיר |
ORG_CD |
entity.user.attribute.labels.value |
מיפוי ישיר |
ORG_Container |
entity.user.attribute.labels.value |
מיפוי ישיר |
ORG_Container_Name |
entity.user.attribute.labels.value |
מיפוי ישיר |
PER_Status |
entity.user.attribute.labels.value |
מיפוי ישיר |
POSITION_NBR |
entity.user.attribute.labels.value |
מיפוי ישיר |
PS_ELID |
entity.user.attribute.labels.value |
מיפוי ישיר |
REG_TEMP |
entity.user.attribute.labels.value |
מיפוי ישיר |
WB_LOGON_ID |
entity.user.attribute.labels.value |
מיפוי ישיר |
ORG_DESCR |
entity.user.department |
ממוזג |
primarySupervisoryOrganization.descriptor |
entity.user.department |
ממוזג |
Email |
entity.user.email_addresses |
ממוזג |
Work_Email |
entity.user.email_addresses |
ממוזג |
primaryWorkEmail |
entity.user.email_addresses |
ממוזג |
EMPLID |
entity.user.employee_id |
מיפוי ישיר |
Employee_ID |
entity.user.employee_id |
מיפוי ישיר |
First_Name |
entity.user.first_name |
מיפוי ישיר |
Legal_Name_First_Name |
entity.user.first_name |
מיפוי ישיר |
HIRE_DATE |
entity.user.hire_date |
ניתוח הכתובות שברשימה: RFC 3339 |
Hire_Date |
entity.user.hire_date |
ניתוח הכתובות שברשימה: RFC 3339 |
Last_Name |
entity.user.last_name |
מיפוי ישיר |
Legal_Name_Last_Name |
entity.user.last_name |
מיפוי ישיר |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
ממוזג |
Reports_To_EMPLID |
entity.user.managers.employee_id |
מיפוי ישיר |
gopher-supervisor.id |
entity.user.managers.product_object_id |
שם שונה/מיפוי |
Reports_To_Name |
entity.user.managers.user_display_name |
מיפוי ישיר |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
שם שונה/מיפוי |
primaryWorkPhone |
entity.user.phone_numbers |
ממוזג |
Termination_Date |
entity.user.termination_date |
ניתוח הכתובות שברשימה: RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
מיפוי ישיר |
timeoff.date |
entity.user.time_off.interval.start_time |
ניתוח הכתובות שברשימה: RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
מיפוי ישיר |
Job_Profile |
entity.user.title |
מיפוי ישיר |
businessTitle |
entity.user.title |
מיפוי ישיר |
Full_Name |
entity.user.user_display_name |
מיפוי ישיר |
descriptor |
entity.user.user_display_name |
מיפוי ישיר |
udm_metadata |
metadata |
שם שונה/מיפוי |
metadata_entity_type |
metadata.entity_type |
מיפוי ישיר |
actual_completed_date_and_time |
metadata.event_timestamp |
ניתוח הכתובות שברשימה: MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
ניתוח הכתובות שברשימה: UNIX_MS |
requestTime |
metadata.event_timestamp |
ניתוח הכתובות שברשימה: RFC 3339 |
timestamp |
metadata.event_timestamp |
ניתוח הכתובות שברשימה: RFC 3339 |
EMPLID |
metadata.product_entity_id |
מיפוי ישיר |
Employee_ID |
metadata.product_entity_id |
מיפוי ישיר |
id |
metadata.product_entity_id |
מיפוי ישיר |
Source_Name |
metadata.product_name |
מיפוי ישיר |
userAgent |
network.http.parsed_user_agent |
שם שונה/מיפוי |
userAgent |
network.http.user_agent |
מיפוי ישיר |
sessionId |
network.session_id |
מיפוי ישיר |
ipAddress |
principal.ip |
ממוזג |
taskId |
principal.process.pid |
מיפוי ישיר |
activityAction_label |
principal.resource.attribute.labels |
ממוזג |
body.event.Submitted_By |
principal.user.userid |
מיפוי ישיר |
body.event.Response_Message |
security_result.action_details |
מיפוי ישיר |
body.event.Messages |
security_result.description |
מיפוי ישיר |
actual_start_date_and_time_label |
security_result.detection_fields |
ממוזג |
background_process_is_running_label |
security_result.detection_fields |
ממוזג |
by_person_label |
security_result.detection_fields |
ממוזג |
created_from_trigger_label |
security_result.detection_fields |
ממוזג |
items_processed_label |
security_result.detection_fields |
ממוזג |
percent_complete_label |
security_result.detection_fields |
ממוזג |
processing_time_label |
security_result.detection_fields |
ממוזג |
scheduled_start_date_and_time_label |
security_result.detection_fields |
ממוזג |
sent_on_label |
security_result.detection_fields |
ממוזג |
total_duration_label |
security_result.detection_fields |
ממוזג |
body.event.Integration_Event_Status |
security_result.summary |
מיפוי ישיר |
body.event.Integration_System |
target.application |
מיפוי ישיר |
target_data.id |
target.resource.product_object_id |
מיפוי ישיר |
deviceType |
target.resource.resource_subtype |
מיפוי ישיר |
deviceType |
target.resource.type |
מיפוי: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
מיפוי ישיר |
systemAccount |
target.user.userid |
מיפוי ישיר |
| לא רלוונטי | entity.resource.attribute.labels.key |
קבוע: COMPANY_EFFECTIVE_DATE |
| לא רלוונטי | entity.user.attribute.labels.key |
קבוע: ORG_Container |
| לא רלוונטי | metadata.product_name |
קבוע: HCM |
| לא רלוונטי | metadata.vendor_name |
קבוע: Workday |
| לא רלוונטי | target.resource.type |
קבוע: DEVICE |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.