Collecter les journaux Workday HCM

Compatible avec :

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

  1. Connectez-vous à Workday avec des droits d'administrateur.
  2. 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.
  3. Saisissez un nom d'utilisateur (par exemple, ISU_SecOps_HCM).
  4. Définissez un mot de passe.
  5. Définissez Session Timeout Minutes (Délai avant expiration de la session en minutes) sur 0 pour éviter que l'ISU n'expire.
  6. Activez l'option Ne pas autoriser les sessions d'interface utilisateur pour renforcer la sécurité en limitant les connexions à l'interface utilisateur.
  7. Accédez à la tâche Maintain Password Rules (Gérer les règles relatives aux mots de passe).
  8. 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

  1. Dans la barre de recherche, saisissez Create Security Group (Créer un groupe de sécurité), puis sélectionnez la tâche.
  2. 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).
  3. Donnez un Nom au groupe de sécurité (par exemple, ISG_SecOps_HCM).
  4. Cliquez sur OK.
  5. Cliquez sur Modifier pour le groupe de sécurité que vous venez de créer.
  6. Attribuez l'utilisateur du système d'intégration de l'étape précédente au groupe de sécurité.
  7. 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.

  1. 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.
  2. Dans la liste Groupe de sécurité source, sélectionnez le groupe de sécurité que vous avez créé (par exemple, ISG_SecOps_HCM).
  3. Cliquez sur OK.
  4. Accédez à Autorisations relatives aux règles de sécurité du domaine.
  5. 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 actuel Worker Data: Public Worker Reports, Worker Data: Current Staffing Information, Person Data: Work Contact Information
    /workers/{id}/timeOffEntries : soldes de congés Worker Data: Time Off (Time Off Balances), Worker Data: Time Off (Time Off Balances Manager View)
    /workers/{id}/history : historique des effectifs Worker Data: Current Staffing Information
    /supervisoryOrganizations : structure organisationnelle Worker Data: Organization Information
  6. Cliquez sur OK.

  7. Cliquez sur OK pour enregistrer les modifications.

Activer les modifications apportées à la stratégie de sécurité

  1. 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.
  2. Saisissez un motif pour la modification dans le champ de commentaire (par exemple, Granting API access for Google SecOps HCM integration).
  3. Cliquez sur OK.
  4. Sélectionnez Confirmer, puis cliquez sur OK.

Enregistrer un client API pour les intégrations

  1. Dans la barre de recherche, saisissez Register API Client for Integrations (Enregistrer le client API pour les intégrations), puis sélectionnez-le.
  2. Cliquez sur Créer.
  3. 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 /workers et /workers/{id}/history
      Coordonné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}/timeOffEntries point de terminaison
      Organisations et rôles /supervisoryOrganizations point de terminaison
      Locataire non configurable Tout client d'API OAuth 2.0 (intégration au niveau du système et rotation des jetons)
  4. Cliquez sur Enregistrer.

  5. Cliquez sur OK.

  6. Copiez et enregistrez immédiatement l'ID client et le code secret du client.

Générer un jeton d'actualisation OAuth 2.0

  1. Dans la barre de recherche, saisissez Gérer les jetons d'actualisation pour les intégrations, puis sélectionnez-le.
  2. Cliquez sur Générer un jeton d'actualisation.
  3. Dans le champ Compte Workday, recherchez et sélectionnez l'utilisateur du système d'intégration (par exemple, ISU_SecOps_HCM).
  4. Sélectionnez le client API que vous avez créé, puis cliquez sur OK.
  5. Copiez et enregistrez le jeton d'actualisation.

Obtenir les URL des points de terminaison de l'API

  1. Dans la barre de recherche, saisissez Afficher les clients API et sélectionnez-le.
  2. Sous Clients API pour les intégrations, recherchez le client que vous avez créé (par exemple, Google SecOps HCM Client).
  3. 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).

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

  1. Accédez à Paramètres SIEM> Flux.
  2. Cliquez sur Add New Feed (Ajouter un flux).
  3. Sur la page suivante, cliquez sur Configurer un seul flux.
  4. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Workday HCM).
  5. Sélectionnez API tierce comme Type de source.
  6. Sélectionnez Workday comme type de journal.
  7. 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 :

  1. Cliquez sur Suivant.
  2. 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 :

  1. Exécutez Activate Pending Security Policy Changes (Activer les modifications en attente de la stratégie de sécurité) dans Workday.
  2. 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.
  3. 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.