Raccogliere i log di Workday HCM
Questo documento spiega come importare i log di Workday HCM in Google Security Operations configurando un feed utilizzando l'API di terze parti.
Il parser estrae i dati utente di Workday HCM dai log in formato JSON. Gestisce varie trasformazioni dei dati, tra cui la ridenominazione dei campi, l'unione di oggetti nidificati, l'analisi delle date e il popolamento dei campi UDM per gli attributi utente, i dettagli sull'impiego e la struttura organizzativa.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps.
- Accesso con privilegi a Workday con autorizzazioni di Amministratore della sicurezza o equivalenti.
Configurare l'autenticazione API Workday
Crea un utente di sistema di integrazione (ISU)
- Accedi a Workday con privilegi amministrativi.
- Nella barra di ricerca, digita Create Integration System User (Crea utente di sistema di integrazione) e seleziona l'attività.
- Inserisci un Nome utente (ad esempio,
ISU_SecOps_HCM). - Imposta una password.
- Imposta Session Timeout Minutes su
0per evitare il timeout dell'ISU. - Abilita Do Not Allow UI Sessions (Non consentire sessioni UI) per migliorare la sicurezza limitando gli accessi alla UI.
- Vai all'attività Mantieni regole password.
- Aggiungi l'utente di sistema di integrazione al campo Utenti di sistema esenti dalla scadenza della password.
Crea un gruppo di sicurezza per l'integrazione
- Nella barra di ricerca, digita Crea gruppo di sicurezza e seleziona l'attività.
- Individua il campo Tipo di gruppo di sicurezza multi-tenant e seleziona Integration System Security Group (Unconstrained).
- Fornisci un nome per il gruppo di sicurezza (ad esempio,
ISG_SecOps_HCM). - Fai clic su OK.
- Fai clic su Modifica per il gruppo di sicurezza appena creato.
- Assegna l'utente di sistema di integrazione del passaggio precedente al gruppo di sicurezza.
- Fai clic su Fine.
Concedere l'accesso al dominio al gruppo di sicurezza
Il feed Google SecOps recupera i dati da quattro endpoint dell'API REST di Workday. Per ogni endpoint è necessario concedere autorizzazioni specifiche per le policy di sicurezza del dominio al gruppo di sicurezza dell'integrazione.
- Nella barra di ricerca, digita Maintain Permissions for Security Group (Mantieni autorizzazioni per il gruppo di sicurezza) e seleziona l'attività.
- Scegli il gruppo di sicurezza che hai creato (ad esempio
ISG_SecOps_HCM) dall'elenco Gruppo di sicurezza di origine. - Fai clic su OK.
- Vai ad Autorizzazioni per le norme di sicurezza del dominio.
Aggiungi l'accesso GET per ciascuno dei seguenti domini:
Endpoint API Policy di sicurezza del dominio richieste /workers: elenco dei lavoratori, profili e personale attualeWorker Data: Public Worker Reports,Worker Data: Current Staffing Information,Person Data: Work Contact Information/workers/{id}/timeOffEntries- Saldi ferieWorker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history- Cronologia dell'assegnazione dei lavoratoriWorker Data: Current Staffing Information/supervisoryOrganizations- Struttura dell'organizzazioneWorker Data: Organization InformationFai clic su OK.
Fai clic su Fine per salvare le modifiche.
Attiva le modifiche al criterio di sicurezza
- Nella barra di ricerca, digita Activate Pending Security Policy Changes (Attiva modifiche in attesa dei criteri di sicurezza) e seleziona l'attività.
- Inserisci un motivo per la modifica nel campo del commento (ad esempio,
Granting API access for Google SecOps HCM integration). - Fai clic su OK.
- Seleziona Conferma e poi fai clic su Ok.
Registra il client API per le integrazioni
- Nella barra di ricerca, digita Register API Client for Integrations (Registra client API per le integrazioni) e selezionalo.
- Fai clic su Crea.
Fornisci i seguenti dettagli di configurazione:
- Nome client: inserisci un nome (ad esempio,
Google SecOps HCM Client). - Utente di sistema: seleziona l'utente di sistema di integrazione che hai creato (ad esempio,
ISU_SecOps_HCM). Ambito: seleziona i seguenti ambiti:
Ambito Obbligatorio per Personale Endpoint /workerse/workers/{id}/historyDati di contatto Campi email e telefono di lavoro restituiti da /workers(utilizzati per la correlazione UDM)Tempo libero e congedo /workers/{id}/timeOffEntriesendpointOrganizzazioni e ruoli /supervisoryOrganizationsendpointTenant non configurabile Qualsiasi client API OAuth 2.0 (integrazione a livello di sistema e rotazione dei token)
- Nome client: inserisci un nome (ad esempio,
Fai clic su Salva.
Fai clic su OK.
Copia e salva immediatamente l'ID client e il client secret.
Genera il token di aggiornamento OAuth 2.0
- Nella barra di ricerca, digita Gestisci token di aggiornamento per le integrazioni e selezionalo.
- Fai clic su Genera nuovo token di aggiornamento.
- Nel campo Account Workday, cerca e seleziona l'utente del sistema di integrazione (ad esempio,
ISU_SecOps_HCM). - Seleziona il client API che hai creato e fai clic su Ok.
- Copia e salva il token di aggiornamento.
Recuperare gli URL degli endpoint API
- Nella barra di ricerca, digita Visualizza client API e selezionalo.
- In Client API per le integrazioni, individua il client che hai creato (ad esempio,
Google SecOps HCM Client). Copia e salva i seguenti dettagli:
- Endpoint token: l'URL per ottenere un token di accesso (ad esempio,
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token). - Endpoint API REST Workday: l'URL di base per le chiamate API (ad esempio,
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT).
- Endpoint token: l'URL per ottenere un token di accesso (ad esempio,
Generare un token di accesso OAuth
Utilizza curl o un client HTTP simile per inviare una richiesta POST all'endpoint token:
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"
Viene restituito un token di accesso (ad esempio, "access_token": "abcd1234"). Copia e salva il token di accesso.
Verificare l'accesso API
Prima di configurare il feed, verifica che l'ISU disponga delle autorizzazioni richieste per gli endpoint chiave. Sostituisci le variabili con i tuoi valori effettivi:
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"
Ogni test deve restituire lo stato HTTP 200. Se un endpoint restituisce 403, consulta la sezione Risoluzione dei problemi di seguito.
Configura un feed in Google SecOps per importare i dati di Workday HCM
Configurare il feed
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Workday HCM). - Seleziona API di terze parti come Tipo di origine.
- Seleziona Workday come Tipo di log.
- Fai clic su Avanti.
Configurare i parametri del feed
Specifica i valori per i seguenti parametri di input:
Nome host API: il nome di dominio completo dell'endpoint API REST di Workday (ad esempio,
wd2-impl-services1.workday.com).Tenant: l'ultimo elemento del percorso dell'endpoint API REST Workday che identifica la tua istanza Workday.
Token di accesso: il token di accesso OAuth generato nella sezione precedente.
Opzioni avanzate:
- Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Risoluzione dei problemi
403 Forbidden su endpoint specifici
Se il feed segnala errori o i comandi curl di verifica restituiscono 403 per endpoint specifici, l'utente di sistema di integrazione non dispone delle autorizzazioni.
| Endpoint non riuscito | Correggi |
|---|---|
/workers/{id}/timeOffEntries |
Aggiungi l'accesso GET per i domini Worker Data: Time Off (Time Off Balances) e Worker Data: Time Off (Time Off Balances Manager View). Aggiungi l'ambito Time Off and Leave al client API. |
/workers/{id}/history |
Aggiungi l'accesso GET per il dominio Worker Data: Historical Staffing Information. Verifica che l'ambito Staffing sia assegnato al client API. |
/supervisoryOrganizations |
Aggiungi l'accesso GET per il dominio Manage: Supervisory Organization o View: Supervisory Organization. Aggiungi l'ambito Organizzazioni e ruoli al client API. |
Dopo aver apportato modifiche alle autorizzazioni:
- Esegui Attiva modifiche ai criteri di sicurezza in attesa in Workday.
- Se hai aggiunto nuovi ambiti al client API, genera un nuovo token di aggiornamento tramite Gestisci token di aggiornamento per le integrazioni e poi genera un nuovo token di accesso.
- Aggiorna la configurazione del feed con il nuovo token di accesso, se modificato.
Errori di autenticazione
- 401 - Non autorizzato: il token di accesso è scaduto. Genera un nuovo token utilizzando il token di aggiornamento e aggiorna il feed.
- Client non valido: verifica che l'ID client e il client secret siano corretti.
- Token di aggiornamento non valido: il token di aggiornamento potrebbe essere stato revocato. Generane uno nuovo tramite Gestisci token di aggiornamento per le integrazioni.
Tabella di mappatura UDM
| Campo log | mapping UDM | Logica |
|---|---|---|
entity_host_name |
entity.asset.hostname |
Mappato direttamente |
location.descriptor |
entity.location.city |
Mappato direttamente |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappato direttamente |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappato direttamente |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
Mappato direttamente |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappato direttamente |
href |
entity.url |
Mappato direttamente |
CONT_START_DTE |
entity.user.attribute.labels.value |
Mappato direttamente |
EMPL_TYPE |
entity.user.attribute.labels.value |
Mappato direttamente |
EXEC_CD |
entity.user.attribute.labels.value |
Mappato direttamente |
EXEC_DESCR |
entity.user.attribute.labels.value |
Mappato direttamente |
HR_Status |
entity.user.attribute.labels.value |
Mappato direttamente |
Is_Active |
entity.user.attribute.labels.value |
Mappato direttamente |
Is_Manager |
entity.user.attribute.labels.value |
Mappato direttamente |
JOB_CODE |
entity.user.attribute.labels.value |
Mappato direttamente |
ORG_CD |
entity.user.attribute.labels.value |
Mappato direttamente |
ORG_Container |
entity.user.attribute.labels.value |
Mappato direttamente |
ORG_Container_Name |
entity.user.attribute.labels.value |
Mappato direttamente |
PER_Status |
entity.user.attribute.labels.value |
Mappato direttamente |
POSITION_NBR |
entity.user.attribute.labels.value |
Mappato direttamente |
PS_ELID |
entity.user.attribute.labels.value |
Mappato direttamente |
REG_TEMP |
entity.user.attribute.labels.value |
Mappato direttamente |
WB_LOGON_ID |
entity.user.attribute.labels.value |
Mappato direttamente |
ORG_DESCR |
entity.user.department |
Unita |
primarySupervisoryOrganization.descriptor |
entity.user.department |
Unita |
Email |
entity.user.email_addresses |
Unita |
Work_Email |
entity.user.email_addresses |
Unita |
primaryWorkEmail |
entity.user.email_addresses |
Unita |
EMPLID |
entity.user.employee_id |
Mappato direttamente |
Employee_ID |
entity.user.employee_id |
Mappato direttamente |
First_Name |
entity.user.first_name |
Mappato direttamente |
Legal_Name_First_Name |
entity.user.first_name |
Mappato direttamente |
HIRE_DATE |
entity.user.hire_date |
Analizzato come RFC 3339 |
Hire_Date |
entity.user.hire_date |
Analizzato come RFC 3339 |
Last_Name |
entity.user.last_name |
Mappato direttamente |
Legal_Name_Last_Name |
entity.user.last_name |
Mappato direttamente |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
Unita |
Reports_To_EMPLID |
entity.user.managers.employee_id |
Mappato direttamente |
gopher-supervisor.id |
entity.user.managers.product_object_id |
Rinominate/mappate |
Reports_To_Name |
entity.user.managers.user_display_name |
Mappato direttamente |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
Rinominate/mappate |
primaryWorkPhone |
entity.user.phone_numbers |
Unita |
Termination_Date |
entity.user.termination_date |
Analizzato come RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
Mappato direttamente |
timeoff.date |
entity.user.time_off.interval.start_time |
Analizzato come RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
Mappato direttamente |
Job_Profile |
entity.user.title |
Mappato direttamente |
businessTitle |
entity.user.title |
Mappato direttamente |
Full_Name |
entity.user.user_display_name |
Mappato direttamente |
descriptor |
entity.user.user_display_name |
Mappato direttamente |
udm_metadata |
metadata |
Rinominate/mappate |
metadata_entity_type |
metadata.entity_type |
Mappato direttamente |
actual_completed_date_and_time |
metadata.event_timestamp |
Analizzato come MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
Analizzato come UNIX_MS |
requestTime |
metadata.event_timestamp |
Analizzato come RFC 3339 |
timestamp |
metadata.event_timestamp |
Analizzato come RFC 3339 |
EMPLID |
metadata.product_entity_id |
Mappato direttamente |
Employee_ID |
metadata.product_entity_id |
Mappato direttamente |
id |
metadata.product_entity_id |
Mappato direttamente |
Source_Name |
metadata.product_name |
Mappato direttamente |
userAgent |
network.http.parsed_user_agent |
Rinominate/mappate |
userAgent |
network.http.user_agent |
Mappato direttamente |
sessionId |
network.session_id |
Mappato direttamente |
ipAddress |
principal.ip |
Unita |
taskId |
principal.process.pid |
Mappato direttamente |
activityAction_label |
principal.resource.attribute.labels |
Unita |
body.event.Submitted_By |
principal.user.userid |
Mappato direttamente |
body.event.Response_Message |
security_result.action_details |
Mappato direttamente |
body.event.Messages |
security_result.description |
Mappato direttamente |
actual_start_date_and_time_label |
security_result.detection_fields |
Unita |
background_process_is_running_label |
security_result.detection_fields |
Unita |
by_person_label |
security_result.detection_fields |
Unita |
created_from_trigger_label |
security_result.detection_fields |
Unita |
items_processed_label |
security_result.detection_fields |
Unita |
percent_complete_label |
security_result.detection_fields |
Unita |
processing_time_label |
security_result.detection_fields |
Unita |
scheduled_start_date_and_time_label |
security_result.detection_fields |
Unita |
sent_on_label |
security_result.detection_fields |
Unita |
total_duration_label |
security_result.detection_fields |
Unita |
body.event.Integration_Event_Status |
security_result.summary |
Mappato direttamente |
body.event.Integration_System |
target.application |
Mappato direttamente |
target_data.id |
target.resource.product_object_id |
Mappato direttamente |
deviceType |
target.resource.resource_subtype |
Mappato direttamente |
deviceType |
target.resource.type |
Mappato: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
Mappato direttamente |
systemAccount |
target.user.userid |
Mappato direttamente |
| N/D | entity.resource.attribute.labels.key |
Costante: COMPANY_EFFECTIVE_DATE |
| N/D | entity.user.attribute.labels.key |
Costante: ORG_Container |
| N/D | metadata.product_name |
Costante: HCM |
| N/D | metadata.vendor_name |
Costante: Workday |
| N/D | target.resource.type |
Costante: DEVICE |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.