Recopila registros de Workday HCM
En este documento, se explica cómo transferir registros de HCM de Workday a Google Security Operations configurando un feed con la API de terceros.
El analizador extrae datos de usuarios de HCM de Workday de registros con formato JSON. Maneja varias transformaciones de datos, como el cambio de nombre de los campos, la combinación de objetos anidados, el análisis de fechas y la propagación de campos del UDM para los atributos del usuario, los detalles de empleo y la estructura organizativa.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Es una instancia de Google SecOps.
- Acceso con privilegios a Workday con permisos de administrador de seguridad o equivalentes
Configura la autenticación de la API de Workday
Crea un usuario del sistema de integración (ISU)
- Accede a Workday con privilegios de administrador.
- En la barra de búsqueda, escribe Create Integration System User y selecciona la tarea.
- Ingresa un Nombre de usuario (por ejemplo,
ISU_SecOps_HCM). - Establece una contraseña.
- Establece Session Timeout Minutes en
0para evitar que se agote el tiempo de espera de la ISU. - Habilita Do Not Allow UI Sessions para mejorar la seguridad restringiendo los accesos a la IU.
- Ve a la tarea Maintain Password Rules.
- Agrega el usuario del sistema de integración al campo Usuarios del sistema exentos del vencimiento de contraseñas.
Crea un grupo de seguridad de integración
- En la barra de búsqueda, escribe Create Security Group y selecciona la tarea.
- Ubica el campo Type of Tenanted Security Group y selecciona Integration System Security Group (Unconstrained).
- Proporciona un Nombre para el grupo de seguridad (por ejemplo,
ISG_SecOps_HCM). - Haz clic en Aceptar.
- Haz clic en Editar en el grupo de seguridad recién creado.
- Asigna el usuario del sistema de integración del paso anterior al grupo de seguridad.
- Haz clic en Listo.
Otorga acceso al dominio al grupo de seguridad
El feed de Google SecOps recupera datos de cuatro extremos de la API de REST de Workday. Cada extremo requiere que se otorguen permisos específicos de la política de seguridad del dominio al grupo de seguridad de la integración.
- En la barra de búsqueda, escribe Maintain Permissions for Security Group y selecciona la tarea.
- Elige el grupo de seguridad que creaste (por ejemplo,
ISG_SecOps_HCM) en la lista Grupo de seguridad de origen. - Haz clic en Aceptar.
- Ve a Permisos de política de seguridad del dominio.
Agrega acceso de GET para cada uno de los siguientes dominios:
Extremo de API Políticas de seguridad de dominio obligatorias /workers: Lista de trabajadores, perfiles y personal actualWorker Data: Public Worker Reports,Worker Data: Current Staffing Information,Person Data: Work Contact Information/workers/{id}/timeOffEntries: Saldos de tiempo libreWorker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history: Historial de personal de trabajadoresWorker Data: Current Staffing Information/supervisoryOrganizations: Estructura de la organizaciónWorker Data: Organization InformationHaz clic en Aceptar.
Haz clic en Listo para guardar los cambios.
Activa los cambios en la política de seguridad
- En la barra de búsqueda, escribe Activate Pending Security Policy Changes y selecciona la tarea.
- Ingresa un motivo para el cambio en el campo de comentarios (por ejemplo,
Granting API access for Google SecOps HCM integration). - Haz clic en Aceptar.
- Selecciona Confirmar y, luego, haz clic en Aceptar.
Registra el cliente de la API para las integraciones
- En la barra de búsqueda, escribe Register API Client for Integrations y selecciónala.
- Haz clic en Crear.
Proporciona los siguientes detalles de configuración:
- Client Name: Ingresa un nombre (por ejemplo,
Google SecOps HCM Client). - Usuario del sistema: Selecciona el usuario del sistema de integración que creaste (por ejemplo,
ISU_SecOps_HCM). Permiso: Selecciona los siguientes permisos:
Alcance Necesario para Dotación de personal Extremos de /workersy/workers/{id}/historyInformación de contacto Campos de correo electrónico y teléfono del trabajo que devuelve /workers(se usan para la correlación de UDM)Ausencias y licencias Extremo /workers/{id}/timeOffEntriesOrganizaciones y roles Extremo /supervisoryOrganizationsTenant Non-Configurable Cualquier cliente de API de OAuth 2.0 (integración a nivel del sistema y rotación de tokens)
- Client Name: Ingresa un nombre (por ejemplo,
Haz clic en Guardar.
Haz clic en Aceptar.
Copia y guarda el ID de cliente y el secreto del cliente de inmediato.
Genera un token de actualización de OAuth 2.0
- En la barra de búsqueda, escribe Administrar tokens de actualización para integraciones y selecciónalo.
- Haz clic en Generate New Refresh Token.
- En el campo Cuenta de Workday, busca y selecciona el usuario del sistema de integración (por ejemplo,
ISU_SecOps_HCM). - Selecciona el cliente de API que creaste y haz clic en Aceptar.
- Copia y guarda el token de actualización.
Obtén URLs de extremo de API
- En la barra de búsqueda, escribe View API Clients y selecciona la opción.
- En Clientes de API para integraciones, busca el cliente que creaste (por ejemplo,
Google SecOps HCM Client). Copia y guarda los siguientes detalles:
- Extremo del token: Es la URL para obtener un token de acceso (por ejemplo,
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token). - Extremo de la API de REST de Workday: Es la URL base para las llamadas a la API (por ejemplo,
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT).
- Extremo del token: Es la URL para obtener un token de acceso (por ejemplo,
Genera un token de acceso de OAuth
Usa curl o un cliente HTTP similar para enviar una solicitud POST al extremo de 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"
Esto devuelve un token de acceso (por ejemplo, "access_token": "abcd1234"). Copia y guarda el token de acceso.
Verifica el acceso a la API
Antes de configurar el feed, verifica que la ISU tenga los permisos necesarios para los endpoints clave. Reemplaza las variables por tus valores reales:
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"
Cada prueba debe devolver el estado HTTP 200. Si algún extremo devuelve 403, consulta la sección Solución de problemas a continuación.
Configura un feed en Google SecOps para transferir datos de HCM de Workday
Configura el feed
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Workday HCM). - Selecciona API de terceros como el Tipo de origen.
- Selecciona Día laboral como el Tipo de registro.
- Haz clic en Siguiente.
Configura los parámetros del feed
Especifica valores para los siguientes parámetros de entrada:
Nombre de host de la API: Es el nombre de dominio completamente calificado de tu extremo de API de REST de Workday (por ejemplo,
wd2-impl-services1.workday.com).Tenant: Es el último elemento de la ruta de acceso de tu extremo de API de REST de Workday que identifica tu instancia de Workday.
Token de acceso: Es el token de acceso de OAuth generado en la sección anterior.
Opciones avanzadas:
- Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
- Haz clic en Siguiente.
- Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Soluciona problemas
403 Prohibido en extremos específicos
Si el feed informa errores o los comandos curl de verificación devuelven 403 para extremos específicos, significa que el usuario del sistema de integración no tiene permisos.
| Extremo con errores | Corregir |
|---|---|
/workers/{id}/timeOffEntries |
Se agregó acceso de GET para los dominios Worker Data: Time Off (Time Off Balances) y Worker Data: Time Off (Time Off Balances Manager View). Agrega el alcance de Time Off and Leave al cliente de la API. |
/workers/{id}/history |
Agrega acceso de GET para el dominio Worker Data: Historical Staffing Information. Verifica que el alcance Staffing esté asignado al cliente de la API. |
/supervisoryOrganizations |
Agrega acceso de GET para el dominio Manage: Supervisory Organization o View: Supervisory Organization. Agrega el permiso Organizaciones y roles al cliente de API. |
Después de cambiar los permisos, haz lo siguiente:
- Ejecuta Activate Pending Security Policy Changes en Workday.
- Si agregaste nuevos permisos al cliente de API, genera un nuevo token de actualización a través de Administrar tokens de actualización para integraciones y, luego, genera un nuevo token de acceso.
- Actualiza la configuración del feed con el nuevo token de acceso si se cambió.
Errores de autenticación
- 401 Unauthorized: El token de acceso venció. Genera un token nuevo con el token de actualización y actualiza el feed.
- Cliente no válido: Verifica que el ID y el secreto del cliente sean correctos.
- Token de actualización no válido: Es posible que se haya revocado el token de actualización. Genera uno nuevo a través de Administrar tokens de actualización para integraciones.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
entity_host_name |
entity.asset.hostname |
Asignado directamente |
location.descriptor |
entity.location.city |
Asignado directamente |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignado directamente |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignado directamente |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
Asignado directamente |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignado directamente |
href |
entity.url |
Asignado directamente |
CONT_START_DTE |
entity.user.attribute.labels.value |
Asignado directamente |
EMPL_TYPE |
entity.user.attribute.labels.value |
Asignado directamente |
EXEC_CD |
entity.user.attribute.labels.value |
Asignado directamente |
EXEC_DESCR |
entity.user.attribute.labels.value |
Asignado directamente |
HR_Status |
entity.user.attribute.labels.value |
Asignado directamente |
Is_Active |
entity.user.attribute.labels.value |
Asignado directamente |
Is_Manager |
entity.user.attribute.labels.value |
Asignado directamente |
JOB_CODE |
entity.user.attribute.labels.value |
Asignado directamente |
ORG_CD |
entity.user.attribute.labels.value |
Asignado directamente |
ORG_Container |
entity.user.attribute.labels.value |
Asignado directamente |
ORG_Container_Name |
entity.user.attribute.labels.value |
Asignado directamente |
PER_Status |
entity.user.attribute.labels.value |
Asignado directamente |
POSITION_NBR |
entity.user.attribute.labels.value |
Asignado directamente |
PS_ELID |
entity.user.attribute.labels.value |
Asignado directamente |
REG_TEMP |
entity.user.attribute.labels.value |
Asignado directamente |
WB_LOGON_ID |
entity.user.attribute.labels.value |
Asignado directamente |
ORG_DESCR |
entity.user.department |
Combinado |
primarySupervisoryOrganization.descriptor |
entity.user.department |
Combinado |
Email |
entity.user.email_addresses |
Combinado |
Work_Email |
entity.user.email_addresses |
Combinado |
primaryWorkEmail |
entity.user.email_addresses |
Combinado |
EMPLID |
entity.user.employee_id |
Asignado directamente |
Employee_ID |
entity.user.employee_id |
Asignado directamente |
First_Name |
entity.user.first_name |
Asignado directamente |
Legal_Name_First_Name |
entity.user.first_name |
Asignado directamente |
HIRE_DATE |
entity.user.hire_date |
Se analizó como RFC 3339 |
Hire_Date |
entity.user.hire_date |
Se analizó como RFC 3339 |
Last_Name |
entity.user.last_name |
Asignado directamente |
Legal_Name_Last_Name |
entity.user.last_name |
Asignado directamente |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
Combinado |
Reports_To_EMPLID |
entity.user.managers.employee_id |
Asignado directamente |
gopher-supervisor.id |
entity.user.managers.product_object_id |
Se cambió el nombre o se asignó |
Reports_To_Name |
entity.user.managers.user_display_name |
Asignado directamente |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
Se cambió el nombre o se asignó |
primaryWorkPhone |
entity.user.phone_numbers |
Combinado |
Termination_Date |
entity.user.termination_date |
Se analizó como RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
Asignado directamente |
timeoff.date |
entity.user.time_off.interval.start_time |
Se analizó como RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
Asignado directamente |
Job_Profile |
entity.user.title |
Asignado directamente |
businessTitle |
entity.user.title |
Asignado directamente |
Full_Name |
entity.user.user_display_name |
Asignado directamente |
descriptor |
entity.user.user_display_name |
Asignado directamente |
udm_metadata |
metadata |
Se cambió el nombre o se asignó |
metadata_entity_type |
metadata.entity_type |
Asignado directamente |
actual_completed_date_and_time |
metadata.event_timestamp |
Se analizó como MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
Se analizó como UNIX_MS |
requestTime |
metadata.event_timestamp |
Se analizó como RFC 3339 |
timestamp |
metadata.event_timestamp |
Se analizó como RFC 3339 |
EMPLID |
metadata.product_entity_id |
Asignado directamente |
Employee_ID |
metadata.product_entity_id |
Asignado directamente |
id |
metadata.product_entity_id |
Asignado directamente |
Source_Name |
metadata.product_name |
Asignado directamente |
userAgent |
network.http.parsed_user_agent |
Se cambió el nombre o se asignó |
userAgent |
network.http.user_agent |
Asignado directamente |
sessionId |
network.session_id |
Asignado directamente |
ipAddress |
principal.ip |
Combinado |
taskId |
principal.process.pid |
Asignado directamente |
activityAction_label |
principal.resource.attribute.labels |
Combinado |
body.event.Submitted_By |
principal.user.userid |
Asignado directamente |
body.event.Response_Message |
security_result.action_details |
Asignado directamente |
body.event.Messages |
security_result.description |
Asignado directamente |
actual_start_date_and_time_label |
security_result.detection_fields |
Combinado |
background_process_is_running_label |
security_result.detection_fields |
Combinado |
by_person_label |
security_result.detection_fields |
Combinado |
created_from_trigger_label |
security_result.detection_fields |
Combinado |
items_processed_label |
security_result.detection_fields |
Combinado |
percent_complete_label |
security_result.detection_fields |
Combinado |
processing_time_label |
security_result.detection_fields |
Combinado |
scheduled_start_date_and_time_label |
security_result.detection_fields |
Combinado |
sent_on_label |
security_result.detection_fields |
Combinado |
total_duration_label |
security_result.detection_fields |
Combinado |
body.event.Integration_Event_Status |
security_result.summary |
Asignado directamente |
body.event.Integration_System |
target.application |
Asignado directamente |
target_data.id |
target.resource.product_object_id |
Asignado directamente |
deviceType |
target.resource.resource_subtype |
Asignado directamente |
deviceType |
target.resource.type |
Asignado: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
Asignado directamente |
systemAccount |
target.user.userid |
Asignado directamente |
| N/A | entity.resource.attribute.labels.key |
Constante: COMPANY_EFFECTIVE_DATE |
| N/A | entity.user.attribute.labels.key |
Constante: ORG_Container |
| N/A | metadata.product_name |
Constante: HCM |
| N/A | metadata.vendor_name |
Constante: Workday |
| N/A | target.resource.type |
Constante: DEVICE |
Registro de cambios
Consulta el registro de cambios de este analizador
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.