Collecter les journaux Workday HCM
Ce document explique comment ingérer des journaux Workday HCM dans Google Security Operations en configurant un flux à l'aide de l'API tierce.
L'analyseur extrait les données utilisateur Workday HCM des journaux au format JSON. Il gère diverses transformations de données, y compris le renommage de champs, la fusion d'objets imbriqués, l'analyse de dates et le remplissage de champs UDM pour les attributs utilisateur, les informations sur l'emploi et la structure organisationnelle.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Une instance Google SecOps.
- Accès privilégié à Workday avec les autorisations Administrateur de la sécurité ou équivalentes.
Configurer l'authentification de l'API Workday
Créer un utilisateur du système d'intégration
- Connectez-vous à Workday avec des droits d'administrateur.
- Dans la barre de recherche, saisissez Create Integration System User (Créer un utilisateur du système d'intégration), puis sélectionnez la tâche.
- Saisissez un nom d'utilisateur (par exemple,
ISU_SecOps_HCM). - Définissez un mot de passe.
- Définissez Session Timeout Minutes (Délai avant expiration de la session en minutes) sur
0pour éviter que l'ISU n'expire. - Activez l'option Ne pas autoriser les sessions d'interface utilisateur pour renforcer la sécurité en limitant les connexions à l'interface utilisateur.
- Accédez à la tâche Maintain Password Rules (Gérer les règles relatives aux mots de passe).
- Ajoutez l'utilisateur du système d'intégration au champ Utilisateurs système exemptés de l'expiration du mot de passe.
Créer un groupe de sécurité pour l'intégration
- Dans la barre de recherche, saisissez Create Security Group (Créer un groupe de sécurité), puis sélectionnez la tâche.
- Localisez le champ Type de groupe de sécurité locataire et sélectionnez Groupe de sécurité du système d'intégration (sans contrainte).
- Donnez un Nom au groupe de sécurité (par exemple,
ISG_SecOps_HCM). - Cliquez sur OK.
- Cliquez sur Modifier pour le groupe de sécurité que vous venez de créer.
- Attribuez l'utilisateur du système d'intégration de l'étape précédente au groupe de sécurité.
- Cliquez sur OK.
Accorder l'accès au domaine au groupe de sécurité
Le flux Google SecOps récupère les données de quatre points de terminaison de l'API REST Workday. Chaque point de terminaison nécessite que des autorisations spécifiques concernant la stratégie de sécurité du domaine soient accordées au groupe de sécurité de l'intégration.
- Dans la barre de recherche, saisissez Maintain Permissions for Security Group (Gérer les autorisations pour le groupe de sécurité), puis sélectionnez la tâche.
- Dans la liste Groupe de sécurité source, sélectionnez le groupe de sécurité que vous avez créé (par exemple,
ISG_SecOps_HCM). - Cliquez sur OK.
- Accédez à Autorisations relatives aux règles de sécurité du domaine.
Ajoutez l'accès GET pour chacun des domaines suivants :
Point de terminaison de l'API Règles de sécurité de domaine requises /workers: liste des nœuds de calcul, profils et personnel actuelWorker Data: Public Worker Reports,Worker Data: Current Staffing Information,Person Data: Work Contact Information/workers/{id}/timeOffEntries: soldes de congésWorker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history: historique des effectifsWorker Data: Current Staffing Information/supervisoryOrganizations: structure organisationnelleWorker Data: Organization InformationCliquez sur OK.
Cliquez sur OK pour enregistrer les modifications.
Activer les modifications apportées à la stratégie de sécurité
- Dans la barre de recherche, saisissez Activate Pending Security Policy Changes (Activer les modifications en attente de la stratégie de sécurité), puis sélectionnez la tâche.
- Saisissez un motif pour la modification dans le champ de commentaire (par exemple,
Granting API access for Google SecOps HCM integration). - Cliquez sur OK.
- Sélectionnez Confirmer, puis cliquez sur OK.
Enregistrer un client API pour les intégrations
- Dans la barre de recherche, saisissez Register API Client for Integrations (Enregistrer le client API pour les intégrations), puis sélectionnez-le.
- Cliquez sur Créer.
Fournissez les informations de configuration suivantes :
- Nom du client : saisissez un nom (par exemple,
Google SecOps HCM Client). - Utilisateur système : sélectionnez l'utilisateur système d'intégration que vous avez créé (par exemple,
ISU_SecOps_HCM). Champ d'application : sélectionnez les champs d'application suivants :
Champ d'application Obligatoire pour Personnel Points de terminaison /workerset/workers/{id}/historyCoordonnées Champs d'adresse e-mail et de numéro de téléphone professionnels renvoyés par /workers(utilisés pour la corrélation UDM)Congés et absences /workers/{id}/timeOffEntriespoint de terminaisonOrganisations et rôles /supervisoryOrganizationspoint de terminaisonLocataire non configurable Tout client d'API OAuth 2.0 (intégration au niveau du système et rotation des jetons)
- Nom du client : saisissez un nom (par exemple,
Cliquez sur Enregistrer.
Cliquez sur OK.
Copiez et enregistrez immédiatement l'ID client et le code secret du client.
Générer un jeton d'actualisation OAuth 2.0
- Dans la barre de recherche, saisissez Gérer les jetons d'actualisation pour les intégrations, puis sélectionnez-le.
- Cliquez sur Générer un jeton d'actualisation.
- Dans le champ Compte Workday, recherchez et sélectionnez l'utilisateur du système d'intégration (par exemple,
ISU_SecOps_HCM). - Sélectionnez le client API que vous avez créé, puis cliquez sur OK.
- Copiez et enregistrez le jeton d'actualisation.
Obtenir les URL des points de terminaison de l'API
- Dans la barre de recherche, saisissez Afficher les clients API et sélectionnez-le.
- Sous Clients API pour les intégrations, recherchez le client que vous avez créé (par exemple,
Google SecOps HCM Client). Copiez et enregistrez les informations suivantes :
- Point de terminaison du jeton : URL permettant d'obtenir un jeton d'accès (par exemple,
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token). - Point de terminaison de l'API REST Workday : URL de base pour les appels d'API (par exemple,
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT).
- Point de terminaison du jeton : URL permettant d'obtenir un jeton d'accès (par exemple,
Générer un jeton d'accès OAuth
Utilisez curl ou un client HTTP similaire pour envoyer une requête POST au point de terminaison du jeton :
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"
Un jeton d'accès est renvoyé (par exemple, "access_token": "abcd1234"). Copiez et enregistrez le jeton d'accès.
Vérifier l'accès à l'API
Avant de configurer le flux, vérifiez que l'ISU dispose des autorisations requises pour les points de terminaison clés. Remplacez les variables par vos valeurs réelles :
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"
Chaque test doit renvoyer l'état HTTP 200. Si un point de terminaison renvoie 403, consultez la section Dépannage ci-dessous.
Configurer un flux dans Google SecOps pour ingérer les données Workday HCM
Configurer le flux
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
Workday HCM). - Sélectionnez API tierce comme Type de source.
- Sélectionnez Workday comme type de journal.
- Cliquez sur Suivant.
Configurer les paramètres du flux
Spécifiez les valeurs des paramètres d'entrée suivants :
Nom d'hôte de l'API : nom de domaine complet de votre point de terminaison de l'API REST Workday (par exemple,
wd2-impl-services1.workday.com).Locataire : dernier élément de chemin d'accès de votre point de terminaison de l'API REST Workday qui identifie votre instance Workday.
Jeton d'accès : jeton d'accès OAuth généré dans la section précédente.
Options avancées :
- Espace de noms de l'élément : espace de noms de l'élément.
- Libellés d'ingestion : libellé à appliquer aux événements de ce flux.
- Cliquez sur Suivant.
- Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Dépannage
403 : accès interdit sur des points de terminaison spécifiques
Si le flux signale des erreurs ou si les commandes curl de validation renvoient 403 pour des points de terminaison spécifiques, cela signifie que l'utilisateur du système d'intégration ne dispose pas des autorisations requises.
| Point de terminaison défaillant | Corriger |
|---|---|
/workers/{id}/timeOffEntries |
Ajoutez l'accès GET pour les domaines Worker Data: Time Off (Time Off Balances) et Worker Data: Time Off (Time Off Balances Manager View). Ajoutez le champ d'application Congés et absences au client API. |
/workers/{id}/history |
Ajoutez l'accès GET pour le domaine Worker Data: Historical Staffing Information. Vérifiez que le champ d'application Staffing est attribué au client API. |
/supervisoryOrganizations |
Ajoutez l'accès GET pour le domaine Manage: Supervisory Organization ou View: Supervisory Organization. Ajoutez le champ d'application Organisations et rôles au client API. |
Après avoir modifié les autorisations :
- Exécutez Activate Pending Security Policy Changes (Activer les modifications en attente de la stratégie de sécurité) dans Workday.
- Si vous avez ajouté des niveaux d'accès au client API, générez un jeton d'actualisation via Gérer les jetons d'actualisation pour les intégrations, puis générez un jeton d'accès.
- Mettez à jour la configuration du flux avec le nouveau jeton d'accès, le cas échéant.
Erreurs d'authentification
- 401 Non autorisé : le jeton d'accès a expiré. Générez un nouveau jeton à l'aide du jeton d'actualisation et mettez à jour le flux.
- Client non valide : vérifiez que l'ID client et le code secret du client sont corrects.
- Jeton d'actualisation non valide : le jeton d'actualisation a peut-être été révoqué. Générez-en un nouveau via Gérer les jetons d'actualisation pour les intégrations.
Table de mappage UDM
| Champ du journal | Mappage UDM | Logique |
|---|---|---|
entity_host_name |
entity.asset.hostname |
Mappé directement |
location.descriptor |
entity.location.city |
Mappé directement |
AU_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappé directement |
COMPANY_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappé directement |
ORIG_HIRE_DT |
entity.resource.attribute.labels.value |
Mappé directement |
STATUS_EFFECTIVE_DATE |
entity.resource.attribute.labels.value |
Mappé directement |
href |
entity.url |
Mappé directement |
CONT_START_DTE |
entity.user.attribute.labels.value |
Mappé directement |
EMPL_TYPE |
entity.user.attribute.labels.value |
Mappé directement |
EXEC_CD |
entity.user.attribute.labels.value |
Mappé directement |
EXEC_DESCR |
entity.user.attribute.labels.value |
Mappé directement |
HR_Status |
entity.user.attribute.labels.value |
Mappé directement |
Is_Active |
entity.user.attribute.labels.value |
Mappé directement |
Is_Manager |
entity.user.attribute.labels.value |
Mappé directement |
JOB_CODE |
entity.user.attribute.labels.value |
Mappé directement |
ORG_CD |
entity.user.attribute.labels.value |
Mappé directement |
ORG_Container |
entity.user.attribute.labels.value |
Mappé directement |
ORG_Container_Name |
entity.user.attribute.labels.value |
Mappé directement |
PER_Status |
entity.user.attribute.labels.value |
Mappé directement |
POSITION_NBR |
entity.user.attribute.labels.value |
Mappé directement |
PS_ELID |
entity.user.attribute.labels.value |
Mappé directement |
REG_TEMP |
entity.user.attribute.labels.value |
Mappé directement |
WB_LOGON_ID |
entity.user.attribute.labels.value |
Mappé directement |
ORG_DESCR |
entity.user.department |
Fusionné |
primarySupervisoryOrganization.descriptor |
entity.user.department |
Fusionné |
Email |
entity.user.email_addresses |
Fusionné |
Work_Email |
entity.user.email_addresses |
Fusionné |
primaryWorkEmail |
entity.user.email_addresses |
Fusionné |
EMPLID |
entity.user.employee_id |
Mappé directement |
Employee_ID |
entity.user.employee_id |
Mappé directement |
First_Name |
entity.user.first_name |
Mappé directement |
Legal_Name_First_Name |
entity.user.first_name |
Mappé directement |
HIRE_DATE |
entity.user.hire_date |
Analysé en tant que RFC 3339 |
Hire_Date |
entity.user.hire_date |
Analysé en tant que RFC 3339 |
Last_Name |
entity.user.last_name |
Mappé directement |
Legal_Name_Last_Name |
entity.user.last_name |
Mappé directement |
gopher-supervisor.primaryWorkEmail |
entity.user.managers.email_addresses |
Fusionné |
Reports_To_EMPLID |
entity.user.managers.employee_id |
Mappé directement |
gopher-supervisor.id |
entity.user.managers.product_object_id |
Renommé/Mappé |
Reports_To_Name |
entity.user.managers.user_display_name |
Mappé directement |
gopher-supervisor.descriptor |
entity.user.managers.user_display_name |
Renommé/Mappé |
primaryWorkPhone |
entity.user.phone_numbers |
Fusionné |
Termination_Date |
entity.user.termination_date |
Analysé en tant que RFC 3339 |
timeoff.descriptor |
entity.user.time_off.description |
Mappé directement |
timeoff.date |
entity.user.time_off.interval.start_time |
Analysé en tant que RFC 3339 |
HR_JOB_TITLE |
entity.user.title |
Mappé directement |
Job_Profile |
entity.user.title |
Mappé directement |
businessTitle |
entity.user.title |
Mappé directement |
Full_Name |
entity.user.user_display_name |
Mappé directement |
descriptor |
entity.user.user_display_name |
Mappé directement |
udm_metadata |
metadata |
Renommé/Mappé |
metadata_entity_type |
metadata.entity_type |
Mappé directement |
actual_completed_date_and_time |
metadata.event_timestamp |
Analysé en tant que MM/dd/yyyy HH:mm:ss a |
body.time |
metadata.event_timestamp |
Analysé en tant que UNIX_MS |
requestTime |
metadata.event_timestamp |
Analysé en tant que RFC 3339 |
timestamp |
metadata.event_timestamp |
Analysé en tant que RFC 3339 |
EMPLID |
metadata.product_entity_id |
Mappé directement |
Employee_ID |
metadata.product_entity_id |
Mappé directement |
id |
metadata.product_entity_id |
Mappé directement |
Source_Name |
metadata.product_name |
Mappé directement |
userAgent |
network.http.parsed_user_agent |
Renommé/Mappé |
userAgent |
network.http.user_agent |
Mappé directement |
sessionId |
network.session_id |
Mappé directement |
ipAddress |
principal.ip |
Fusionné |
taskId |
principal.process.pid |
Mappé directement |
activityAction_label |
principal.resource.attribute.labels |
Fusionné |
body.event.Submitted_By |
principal.user.userid |
Mappé directement |
body.event.Response_Message |
security_result.action_details |
Mappé directement |
body.event.Messages |
security_result.description |
Mappé directement |
actual_start_date_and_time_label |
security_result.detection_fields |
Fusionné |
background_process_is_running_label |
security_result.detection_fields |
Fusionné |
by_person_label |
security_result.detection_fields |
Fusionné |
created_from_trigger_label |
security_result.detection_fields |
Fusionné |
items_processed_label |
security_result.detection_fields |
Fusionné |
percent_complete_label |
security_result.detection_fields |
Fusionné |
processing_time_label |
security_result.detection_fields |
Fusionné |
scheduled_start_date_and_time_label |
security_result.detection_fields |
Fusionné |
sent_on_label |
security_result.detection_fields |
Fusionné |
total_duration_label |
security_result.detection_fields |
Fusionné |
body.event.Integration_Event_Status |
security_result.summary |
Mappé directement |
body.event.Integration_System |
target.application |
Mappé directement |
target_data.id |
target.resource.product_object_id |
Mappé directement |
deviceType |
target.resource.resource_subtype |
Mappé directement |
deviceType |
target.resource.type |
Mappé : (?i)(Desktop/Laptop/Mobile) → DEVICE |
user_display_name |
target.user.user_display_name |
Mappé directement |
systemAccount |
target.user.userid |
Mappé directement |
| 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 |
Journal des modifications
Afficher le journal des modifications pour ce parseur
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.