Recopila registros de Workday HCM
En este documento, se explica cómo transferir registros de Workday HCM a Google Security Operations configurando un feed con la API de terceros.
El analizador extrae los datos del usuario de Workday HCM de los registros con formato JSON. Controla varias transformaciones de datos, como cambiar el nombre de los campos, combinar objetos anidados, analizar fechas y completar campos de 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:
- 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 Minutos de tiempo de espera de la sesión 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 System Users exempt from password expiration.
Crea un grupo de seguridad de integración
- En la barra de búsqueda, escribe Create Security Group y selecciona la tarea.
- Busca 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 para 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) de la lista Source Security Group. - Haz clic en Aceptar.
- Ve a Permisos de la política de seguridad del dominio.
Agrega acceso 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 asignación 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 comentario (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 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:
- Nombre del cliente: 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 /workersy/workers/{id}/historyextremosInformación de contacto Campos de correo electrónico y teléfono del trabajo que muestra /workers(se usan para la correlación de UDM)Time Off and Leave Extremo /workers/{id}/timeOffEntriesOrganizaciones y roles Extremo /supervisoryOrganizationsNo configurable por el usuario Cualquier cliente de API de OAuth 2.0 (integración a nivel del sistema y rotación de tokens)
- Nombre del cliente: 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 Manage Refresh Tokens for Integrations y selecciónala.
- Haz clic en Generar un nuevo token de actualización.
- En el campo Workday Account, 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 las 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). - Endpoint de 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 el ISU tenga los permisos necesarios para los extremos 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 debería devolver el estado HTTP 200. Si algún extremo devuelve 403, consulta la sección Solución de problemas que aparece más abajo.
Configura un feed en Google SecOps para transferir datos de Workday HCM
Configura el feed
- Ve a Configuración > Administración de datos > Feeds. Si estás en una plataforma solo de SIEM, ve a Configuración > Feeds.
- Haz clic en Agregar feed nuevo.
- En la página siguiente, 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 Tipo de fuente.
- Selecciona Workday 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).Inquilino: Es el último elemento de la ruta de acceso del extremo de API de REST de Workday que identifica tu instancia de Workday.
Token de acceso: Es el token de acceso de OAuth que se generó 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 configuración de tu feed de noticias nuevo en la pantalla Finalizar y, luego, haz clic en Enviar.
Soluciona problemas
Error 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 |
Agrega acceso GET para los dominios Worker Data: Time Off (Time Off Balances) y Worker Data: Time Off (Time Off Balances Manager View). Agrega el permiso Tiempo libre y licencia al cliente de API. |
/workers/{id}/history |
Agrega acceso GET para el dominio Worker Data: Historical Staffing Information. Verifica que el permiso Staffing esté asignado al cliente de API. |
/supervisoryOrganizations |
Agrega acceso GET para el dominio Manage: Supervisory Organization o View: Supervisory Organization. Agrega el permiso Organizaciones y roles al cliente de API. |
Después de realizar cambios en los permisos, haz lo siguiente:
- Ejecuta Activate Pending Security Policy Changes en Workday.
- Si agregaste permisos nuevos al cliente de API, genera un token de actualización nuevo a través de Administra tokens de actualización para integraciones y, luego, genera un token de acceso nuevo.
- Actualiza la configuración del feed con el nuevo token de acceso si cambió.
Errores de autenticación
- 401 No autorizado: 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 de cliente 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 Manage Refresh Tokens for Integrations.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
entity_host_name |
entity.asset.hostname |
Asignada directamente |
location.descriptor |
entity.location.city |
Asignada directamente |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignada directamente |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignada directamente |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
Asignada directamente |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Asignada directamente |
href |
entity.url |
Asignada directamente |
CONT_START_DTE |
entity.user.attribute.labels.value |
Asignada directamente |
EMPL_TYPE |
entity.user.attribute.labels.value |
Asignada directamente |
EXEC_CD |
entity.user.attribute.labels.value |
Asignada directamente |
EXEC_DESCR |
entity.user.attribute.labels.value |
Asignada directamente |
HR_Status |
entity.user.attribute.labels.value |
Asignada directamente |
Is_Active |
entity.user.attribute.labels.value |
Asignada directamente |
Is_Manager |
entity.user.attribute.labels.value |
Asignada directamente |
JOB_CODE |
entity.user.attribute.labels.value |
Asignada directamente |
ORG_CD |
entity.user.attribute.labels.value |
Asignada directamente |
ORG_Container |
entity.user.attribute.labels.value |
Asignada directamente |
ORG_Container_Name |
entity.user.attribute.labels.value |
Asignada directamente |
PER_Status |
entity.user.attribute.labels.value |
Asignada directamente |
POSITION_NBR |
entity.user.attribute.labels.value |
Asignada directamente |
PS_ELID |
entity.user.attribute.labels.value |
Asignada directamente |
REG_TEMP |
entity.user.attribute.labels.value |
Asignada directamente |
WB_LOGON_ID |
entity.user.attribute.labels.value |
Asignada 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 |
Asignada directamente |
Employee_ID |
entity.user.employee_id |
Asignada directamente |
First_Name |
entity.user.first_name |
Asignada directamente |
Legal_Name_First_Name |
entity.user.first_name |
Asignada directamente |
HIRE_DATE |
entity.user.hire_date |
Analizado como RFC 3339 |
Hire_Date |
entity.user.hire_date |
Analizado como RFC 3339 |
Last_Name |
entity.user.last_name |
Asignada directamente |
Legal_Name_Last_Name |
entity.user.last_name |
Asignada directamente |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
Combinado |
Reports_To_EMPLID |
entity.user.managers.employee_id |
Asignada 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 |
Asignada 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 |
Analizado como RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
Asignada directamente |
timeoff.date |
entity.user.time_off.interval.start_time |
Analizado como RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
Asignada directamente |
Job_Profile |
entity.user.title |
Asignada directamente |
businessTitle |
entity.user.title |
Asignada directamente |
Full_Name |
entity.user.user_display_name |
Asignada directamente |
descriptor |
entity.user.user_display_name |
Asignada directamente |
udm_metadata |
metadata |
Se cambió el nombre o se asignó |
metadata_entity_type |
metadata.entity_type |
Asignada directamente |
actual_completed_date_and_time |
metadata.event_timestamp |
Analizado como MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
Analizado como UNIX_MS |
requestTime |
metadata.event_timestamp |
Analizado como RFC 3339 |
timestamp |
metadata.event_timestamp |
Analizado como RFC 3339 |
EMPLID |
metadata.product_entity_id |
Asignada directamente |
Employee_ID |
metadata.product_entity_id |
Asignada directamente |
id |
metadata.product_entity_id |
Asignada directamente |
Source_Name |
metadata.product_name |
Asignada directamente |
userAgent |
network.http.parsed_user_agent |
Se cambió el nombre o se asignó |
userAgent |
network.http.user_agent |
Asignada directamente |
sessionId |
network.session_id |
Asignada directamente |
ipAddress |
principal.ip |
Combinado |
taskId |
principal.process.pid |
Asignada directamente |
activityAction_label |
principal.resource.attribute.labels |
Combinado |
body.event.Submitted_By |
principal.user.userid |
Asignada directamente |
body.event.Response_Message |
security_result.action_details |
Asignada directamente |
body.event.Messages |
security_result.description |
Asignada 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 |
Asignada directamente |
body.event.Integration_System |
target.application |
Asignada directamente |
target_data.id |
target.resource.product_object_id |
Asignada directamente |
deviceType |
target.resource.resource_subtype |
Asignada directamente |
deviceType |
target.resource.type |
Asignado: (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
Asignada directamente |
systemAccount |
target.user.userid |
Asignada 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.