איסוף יומנים של Workday HCM
במאמר הזה מוסבר איך להטמיע יומני רישום של Workday HCM ב-Google Security Operations באמצעות הגדרת פיד דרך Third Party API.
הכלי לניתוח מחלץ נתוני משתמשים מ-Workday HCM מיומנים בפורמט JSON. הכלי מטפל בהמרות שונות של נתונים, כולל שינוי שמות של שדות, מיזוג של אובייקטים מוטמעים, ניתוח תאריכים ואכלוס של שדות UDM במאפייני משתמש, בפרטי העסקה ובמבנה הארגוני.
לפני שמתחילים
חשוב לוודא שמתקיימות דרישות הסף הבאות:
- מופע של Google SecOps.
- גישה עם הרשאות מיוחדות ל-Workday עם Security Administrator או הרשאות שוות ערך.
הגדרת אימות של 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). - System User: בוחרים את משתמש מערכת השילוב שיצרתם (לדוגמה,
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), מחפשים את חשבון ה-ISU ובוחרים אותו (לדוגמה,
ISU_SecOps_HCM). - בוחרים את לקוח ה-API שיצרתם ולוחצים על OK.
- מעתיקים את טוקן הרענון ושומרים אותו.
קבלת כתובות URL של נקודות קצה ל-API
- בסרגל החיפוש, מקלידים View API Clients (הצגת לקוחות API) ובוחרים באפשרות הזו.
- בקטע 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: רכיב הנתיב האחרון של נקודת קצה ל-API בארכיטקטורת REST של Workday שמזהה את מופע 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.