Collecter les journaux de contexte Microsoft Azure AD

Compatible avec:

Ce document explique comment collecter des journaux Microsoft Azure Active Directory (AD) en configurant un flux Google Security Operations.

Azure Active Directory (AZURE_AD) s'appelle désormais Microsoft Entra ID. Les journaux d'audit Azure AD (AZURE_AD_AUDIT) sont désormais des journaux d'audit Microsoft Entra ID.

Pour en savoir plus, consultez Ingestion de données dans Google Security Operations.

Un libellé d'ingestion identifie l'analyseur qui normalise les données de journal brutes au format UDM structuré.

Avant de commencer

Pour effectuer les tâches de cette page, assurez-vous de disposer des éléments suivants:

  • Un abonnement Azure auquel vous pouvez vous connecter.
  • Rôle d'administrateur global ou d'administrateur Azure AD.
  • Un locataire Azure AD dans Azure.

Configurer Azure AD

  1. Connectez-vous au portail Azure.
  2. Accédez à Accueil > Enregistrement d'application, sélectionnez une application enregistrée ou enregistrez-en une si vous n'en avez pas encore créé.
  3. Pour enregistrer une application, dans la section Enregistrement de l'application, cliquez sur Nouvel enregistrement.
  4. Dans le champ Nom, indiquez le nom à afficher pour votre application.
  5. Dans la section Types de comptes compatibles, sélectionnez l'option requise pour spécifier qui peut utiliser l'application ou accéder à l'API.
  6. Cliquez sur S'inscrire.
  7. Accédez à la page Vue d'ensemble, puis copiez l'ID de l'application (client) et l'ID du répertoire (locataire), qui sont nécessaires pour configurer le flux Google Security Operations.
  8. Cliquez sur Autorisations des API.
  9. Cliquez sur Ajouter une autorisation, puis sélectionnez Microsoft Graph dans le nouveau volet.
  10. Cliquez sur Autorisations de l'application.
  11. Sélectionnez les autorisations AuditLog.Read.All, Directory.Read.All et SecurityEvents.Read.All. Assurez-vous que les autorisations sont des autorisations d'application et non des autorisations déléguées.
  12. Cliquez sur Accorder le consentement administrateur pour l'annuaire par défaut. Les applications sont autorisées à appeler des API lorsqu'elles reçoivent des autorisations de la part des utilisateurs ou des administrateurs dans le cadre du processus de consentement.
  13. Accédez à Paramètres > Gérer.
  14. Cliquez sur Certificats et secrets.
  15. Cliquez sur Nouvelle clé secrète client. Dans le champ Valeur, le code secret du client s'affiche.
  16. Copiez la valeur du code secret du client. Cette valeur ne s'affiche qu'au moment de la création. Elle est requise pour l'enregistrement de l'application Azure et pour configurer le flux Google Security Operations.

Configurer un flux dans Google Security Operations pour ingérer les journaux de contexte Azure AD

  1. Sélectionnez Paramètres du SIEM > Flux.
  2. Cliquez sur Ajouter.
  3. Saisissez un nom unique pour le nom du flux.
  4. Sélectionnez API tierce comme type de source.
  5. Sélectionnez Contexte organisationnel Azure AD comme Type de journal.
  6. Cliquez sur Suivant.
  7. Configurez les paramètres d'entrée obligatoires suivants :
    • ID client OAuth: spécifiez l'ID client que vous avez obtenu précédemment.
    • Code secret du client OAuth: spécifiez le code secret du client que vous avez obtenu précédemment.
    • ID de locataire: spécifiez l'ID de locataire que vous avez obtenu précédemment.
  8. Cliquez sur Suivant, puis sur Envoyer.

Pour en savoir plus sur les flux Google Security Operations, consultez la documentation sur les flux Google Security Operations. Pour en savoir plus sur les exigences de chaque type de flux, consultez la section Configuration des flux par type. Si vous rencontrez des problèmes lors de la création de flux, contactez l'assistance Google Security Operations.

Référence du mappage de champs

Ce code d'analyseur transforme les journaux bruts au format JSON d'Azure Active Directory en modèle de données unifié (UDM). Il extrait des informations sur les utilisateurs et les administrateurs, y compris les attributs, les rôles, les relations et les libellés, tout en gérant diverses incohérences de données et en enrichissant la sortie avec des champs standardisés.

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
businessPhones user.phone_numbers Mappé directement à partir du champ businessPhones dans le journal brut. Plusieurs numéros de téléphone sont extraits et mappés en tant qu'entrées distinctes.
city user.personal_address.city Mappé directement à partir du champ city dans le journal brut.
companyName user.company_name Mappé directement à partir du champ companyName dans le journal brut.
country user.personal_address.country_or_region Mappé directement à partir du champ country dans le journal brut. Si country est vide, la valeur est extraite de usageLocation.
createdDateTime user.attribute.creation_time Converti en code temporel à partir du champ createdDateTime du journal brut au format RFC3339.
department user.department Mappé directement à partir du champ department dans le journal brut. Plusieurs services sont extraits et mappés en tant qu'entrées distinctes.
displayName user.user_display_name Mappé directement à partir du champ displayName dans le journal brut.
employeeId user.employee_id Mappé directement à partir du champ employeeId dans le journal brut. Si employeeId est vide, la valeur est extraite de extension_employeeNumber.
employeeType user.attribute.labels.value (clé: employeeType) Mappé directement à partir du champ employeeType dans le journal brut et ajouté en tant que libellé avec la clé employeeType.
extension_employeeNumber user.employee_id Mappé sur user.employee_id si employeeId est vide.
extension_wfc_AccountType event.idm.entity.entity.labels.value (clé: wfc_AccountType) Mappé directement à partir du champ extension_wfc_AccountType dans le journal brut et ajouté en tant que libellé avec la clé wfc_AccountType.
extension_wfc_AccountingUnitName event.idm.entity.entity.labels.value (clé: extension_wfc_AccountingUnitName) Mappé directement à partir du champ extension_wfc_AccountingUnitName dans le journal brut et ajouté en tant que libellé avec la clé extension_wfc_AccountingUnitName.
extension_wfc_execDescription event.idm.entity.entity.labels.value (clé: extension_wfc_execDescription) Mappé directement à partir du champ extension_wfc_execDescription dans le journal brut et ajouté en tant que libellé avec la clé extension_wfc_execDescription.
extension_wfc_groupDescription event.idm.entity.entity.labels.value (clé: extension_wfc_groupDescription) Mappé directement à partir du champ extension_wfc_groupDescription dans le journal brut et ajouté en tant que libellé avec la clé extension_wfc_groupDescription.
extension_wfc_orgDescription event.idm.entity.entity.labels.value (clé: extension_wfc_orgDescription) Mappé directement à partir du champ extension_wfc_orgDescription dans le journal brut et ajouté en tant que libellé avec la clé extension_wfc_orgDescription.
givenName user.first_name Mappé directement à partir du champ givenName dans le journal brut.
gopher-devices event.idm.entity.relations Chaque appareil du tableau gopher-devices est mappé sur une entrée de relation distincte. deviceId est mappé sur product_object_id, operatingSystem et operatingSystemVersion sont combinés pour former platform_version, model est mappé directement, et createdDateTime est converti en code temporel et mappé sur created_timestamp. La relation est définie sur OWNS et la direction sur UNIDIRECTIONAL.
gopher-groups event.idm.entity.relations Chaque groupe du tableau gopher-groups est mappé sur une entrée de relation distincte. id est mappé sur product_object_id et displayName sur group_display_name. La relation est définie sur MEMBER et la direction sur UNIDIRECTIONAL.
gopher-manager.businessPhones empmanager.phone_numbers Mappé sur empmanager.phone_numbers si manager est vide.
gopher-manager.country empmanager.personal_address.country_or_region Mappé sur empmanager.personal_address.country_or_region si manager est vide. Si gopher-manager.country et gopher-manager.usageLocation sont tous deux vides, le champ reste vide.
gopher-manager.department empmanager.department Mappé sur empmanager.department si manager est vide.
gopher-manager.displayName empmanager.user_display_name Mappé sur empmanager.user_display_name si manager est vide.
gopher-manager.employeeId empmanager.employee_id Mappé sur empmanager.employee_id si manager est vide et que gopher-manager.employeeId n'est pas vide.
gopher-manager.extension_employeeNumber empmanager.employee_id Mappé sur empmanager.employee_id si manager et gopher-manager.employeeId sont vides, et si gopher-manager.extension_employeeNumber ne l'est pas.
gopher-manager.givenName empmanager.first_name Mappé sur empmanager.first_name si manager est vide.
gopher-manager.id empmanager.product_object_id Mappé sur empmanager.product_object_id si manager est vide.
gopher-manager.jobTitle empmanager.title Mappé sur empmanager.title si manager est vide.
gopher-manager.mail empmanager.email_addresses Mappé sur empmanager.email_addresses si manager est vide.
gopher-manager.onPremisesImmutableId user.attribute.labels.value (clé: gopher-manager onPremisesImmutableId) Mappé en tant que libellé avec la clé gopher-manager onPremisesImmutableId.
gopher-manager.onPremisesSamAccountName empmanager.userid Mappé sur empmanager.userid si manager est vide.
gopher-manager.onPremisesSecurityIdentifier empmanager.windows_sid Mappé sur empmanager.windows_sid si manager est vide.
gopher-manager.proxyAddresses empmanager.email_addresses, empmanager.group_identifiers Si manager est vide, chaque adresse du tableau gopher-manager.proxyAddresses est mappée sur empmanager.email_addresses ou empmanager.group_identifiers, selon qu'elle commence par "smtp" ou "SMTP".
gopher-manager.refreshTokensValidFromDateTime empmanager.attribute.labels.value (clé: refreshTokensValidFromDateTime) Mappé en tant que libellé avec la clé refreshTokensValidFromDateTime si manager est vide.
gopher-manager.streetAddress empmanager.personal_address.name Mappé sur empmanager.personal_address.name si manager est vide.
gopher-manager.surname empmanager.last_name Mappé sur empmanager.last_name si manager est vide.
gopher-manager.usageLocation user.attribute.labels.value (clé: manager_src_usageLocation) Mappé en tant que libellé avec la clé manager_src_usageLocation.
gopher-manager.userType empmanager.attribute.roles.name Mappé sur empmanager.attribute.roles.name si manager est vide.
id user.product_object_id Mappé directement à partir du champ id dans le journal brut.
identités user.attribute.labels.value (clé: signInType), user.attribute.labels.value (clé: userPrincipalName) signInType est mappé en tant que libellé avec la clé signInType. Si signInType et userPrincipalName ne sont pas vides, ils sont combinés et mappés en tant que libellé avec la clé userPrincipalName.
jobTitle user.title Mappé directement à partir du champ jobTitle dans le journal brut.
mail user.email_addresses Mappé directement à partir du champ mail dans le journal brut. Si mail commence par "svc-", user_role.type est défini sur SERVICE_ACCOUNT.
mailNickname user.attribute.labels.value (clé: mailNickname) Mappé directement à partir du champ mailNickname dans le journal brut et ajouté en tant que libellé avec la clé mailNickname.
manager.businessPhones empmanager.phone_numbers Mappé sur empmanager.phone_numbers si gopher-manager est vide.
manager.city empmanager.personal_address.city Mappé sur empmanager.personal_address.city si gopher-manager est vide.
manager.companyName empmanager.company_name Mappé sur empmanager.company_name si gopher-manager est vide.
manager.country empmanager.personal_address.country_or_region Mappé sur empmanager.personal_address.country_or_region si gopher-manager est vide. Si manager.country et manager.usageLocation sont tous deux vides, le champ reste vide.
manager.department empmanager.department Mappé sur empmanager.department si gopher-manager est vide.
manager.displayName empmanager.user_display_name Mappé sur empmanager.user_display_name si gopher-manager est vide.
manager.employeeId empmanager.employee_id Mappé sur empmanager.employee_id si gopher-manager est vide et que manager.employeeId n'est pas vide.
manager.extension_employeeNumber empmanager.employee_id Mappé sur empmanager.employee_id si gopher-manager et manager.employeeId sont vides, et si manager.extension_employeeNumber ne l'est pas.
manager.givenName empmanager.first_name Mappé sur empmanager.first_name si gopher-manager est vide.
manager.id empmanager.product_object_id Mappé sur empmanager.product_object_id si gopher-manager est vide.
manager.jobTitle empmanager.title Mappé sur empmanager.title si gopher-manager est vide.
manager.mail empmanager.email_addresses Mappé sur empmanager.email_addresses si gopher-manager est vide.
manager.onPremisesSamAccountName empmanager.userid Mappé sur empmanager.userid si gopher-manager est vide.
manager.onPremisesSecurityIdentifier empmanager.windows_sid Mappé sur empmanager.windows_sid si gopher-manager est vide.
manager.proxyAddresses empmanager.email_addresses, empmanager.group_identifiers Si gopher-manager est vide, chaque adresse du tableau manager.proxyAddresses est mappée sur empmanager.email_addresses ou empmanager.group_identifiers, selon qu'elle commence par "smtp" ou "SMTP".
manager.refreshTokensValidFromDateTime empmanager.attribute.labels.value (clé: refreshTokensValidFromDateTime) Mappé en tant que libellé avec la clé refreshTokensValidFromDateTime si gopher-manager est vide.
manager.state empmanager.personal_address.state Mappé sur empmanager.personal_address.state si gopher-manager est vide.
manager.streetAddress empmanager.personal_address.name Mappé sur empmanager.personal_address.name si gopher-manager est vide.
manager.surname empmanager.last_name Mappé sur empmanager.last_name si gopher-manager est vide.
manager.usageLocation user.attribute.labels.value (clé: manager_src_usageLocation), empmanager.personal_address.country_or_region Mappé en tant que libellé avec la clé manager_src_usageLocation. Si manager.country est vide, la valeur est également mappée sur empmanager.personal_address.country_or_region.
manager.userType empmanager.attribute.roles.name Mappé sur empmanager.attribute.roles.name si gopher-manager est vide.
onPremisesDistinguishedName user.attribute.labels.value (clé: onPremisesDistinguishedName), user.attribute.labels.value (clé: données onPremisesDistinguishedName-OU) Le nom distinctif complet est mappé en tant que libellé avec la clé onPremisesDistinguishedName. La partie UO du nom distinctif est extraite et mappée en tant que libellé avec la clé onPremisesDistinguishedName-OU data. Si la partie de l'UO contient "Admin", user_role.type est défini sur ADMINISTRATOR. S'il contient "Comptes de service", user_role.type est défini sur SERVICE_ACCOUNT.
onPremisesDomainName user.group_identifiers, user.attribute.labels.value (clé: onPremisesDomainName) Mappé directement sur user.group_identifiers et ajouté en tant que libellé avec la clé onPremisesDomainName.
onPremisesImmutableId user.attribute.labels.value (clé: onPremisesImmutableId) Mappé directement à partir du champ onPremisesImmutableId dans le journal brut et ajouté en tant que libellé avec la clé onPremisesImmutableId.
onPremisesSamAccountName user.userid, user.attribute.labels.value (clé: onPremisesSamAccountName) Mappé sur user.userid si sAMAccountName est vide. Également ajouté en tant que libellé avec la clé onPremisesSamAccountName.
onPremisesSecurityIdentifier user.windows_sid Mappé directement à partir du champ onPremisesSecurityIdentifier dans le journal brut.
proxyAddresses user.email_addresses, user.group_identifiers Chaque adresse du tableau proxyAddresses est mappée sur user.email_addresses ou user.group_identifiers selon qu'elle commence par "smtp" ou "SMTP". Si l'adresse commence par "smtp" ou "SMTP", le préfixe "smtp:" ou "SMTP:" est supprimé, et l'adresse e-mail restante est extraite et mappée sur user.email_addresses.
refreshTokensValidFromDateTime user.attribute.labels.value (clé: refreshTokensValidFromDateTime) Mappé directement à partir du champ refreshTokensValidFromDateTime dans le journal brut et ajouté en tant que libellé avec la clé refreshTokensValidFromDateTime.
sAMAccountName user.userid Mappé directement à partir du champ sAMAccountName dans le journal brut.
state user.personal_address.state Mappé directement à partir du champ state dans le journal brut.
streetAddress user.personal_address.name Mappé directement à partir du champ streetAddress dans le journal brut.
surname user.last_name Mappé directement à partir du champ surname dans le journal brut.
usageLocation user.personal_address.country_or_region Si country est vide, la valeur est mappée sur user.personal_address.country_or_region.
userPrincipalName user.email_addresses Mappé directement à partir du champ userPrincipalName dans le journal brut. Si userPrincipalName commence par "svc-", user_role.type est défini sur SERVICE_ACCOUNT.
userType user.attribute.roles.name Mappé directement à partir du champ userType dans le journal brut et ajouté à user.attribute.roles.name.
Logique de l'analyseur Mappage UDM Logique
N/A event.idm.entity.metadata.vendor_name Défini sur "Microsoft".
N/A event.idm.entity.metadata.product_name Définissez-le sur "Azure Active Directory".
N/A event.idm.entity.metadata.entity_type Définissez-le sur "USER".
N/A event.idm.entity.metadata.collected_timestamp Définissez-le sur le champ create_time du journal brut.
accountEnabled user.user_authentication_status, user.attribute.labels.value (clé: accountEnabled) Si accountEnabled est défini sur "true", user.user_authentication_status est défini sur "ACTIVE" et un libellé avec la clé accountEnabled et la valeur "true" est ajouté. Sinon, un libellé avec la clé accountEnabled et la valeur "false" est ajouté.
empmanager-src.accountEnabled user.user_authentication_status, user.attribute.labels.value (clé: accountEnabled) Si manager est vide et que empmanager-src.accountEnabled est défini sur "true", user.user_authentication_status est défini sur "ACTIVE" et un libellé avec la clé accountEnabled et la valeur "true" est ajouté. Sinon, un libellé avec la clé accountEnabled et la valeur "false" est ajouté.
onPremisesDistinguishedName user_role.type Si la partie UO du nom distinctif contient "Admin", user_role.type est défini sur ADMINISTRATOR. S'il contient "Comptes de service", user_role.type est défini sur SERVICE_ACCOUNT.
userPrincipalName user_role.type Si userPrincipalName commence par "svc-", user_role.type est défini sur SERVICE_ACCOUNT.
empmanager-src.onPremisesDistinguishedName manager_role.type Si gopher-manager est vide et que la partie UO du nom distinctif du gestionnaire contient "Users", manager_role.type est défini sur ADMINISTRATOR. S'il contient "Comptes de service", manager_role.type est défini sur SERVICE_ACCOUNT.
empmanager-src.userPrincipalName manager_role.type Si gopher-manager est vide et que empmanager-src.userPrincipalName commence par "svc-", manager_role.type est défini sur SERVICE_ACCOUNT.
mail user_role.type Si mail commence par "svc-", user_role.type est défini sur SERVICE_ACCOUNT.

Modifications

2024-04-29

  • Mappage de "officeLocation" sur "entity.location.name".
  • Mappage de "extension_wfc_groupDescription", "extension_wfc_execDescription", "extension_wfc_orgDescription", "extension_wfc_AccountingUnitName" et "extension_wfc_AccountType" sur "entity.labels".

2024-05-02

Correction de bug:

  • Ajout de vérifications pour le champ "accountEnabled" afin d'analyser la valeur correcte dans le champ "entity.user.attribute.labels.value".

2024-03-14

  • Mappage de "onPremisesImmutableId" sur "entity.user.attribute.labels".
  • Mappage de "gopher-manager.onPremisesImmutableId" sur "entity.user.attribute.labels".

2024-01-12

Correction de bug:

  • La mise en correspondance "empmanager-src.usageLocation" est passée de "entity.user.personal_address.country_or_region" à "entity.user.attribute.labels".

2023-11-24

Amélioration

  • Mappage de l'attribut "employeeType" sur "entity.user.attribute.labels".
  • Suppression des journaux JSON incorrects avec la balise "TAG_MALFORMED_MESSAGE".

2023-10-25

Correction de bugs

  • Ajout de vérifications de valeurs nulles et d'une vérification "on_error" pour les valeurs manquantes.

2023-09-25

Amélioration

  • Ajout de la fonction de renommage au lieu de la fonction de remplacement pour mapper "group.displayName" sur "relation_entity.entity.group.group_display_name".
  • Mappage de "country" sur "user.personal_address.country_or_region". Si "country" n'est pas présent, "usageLocation" a été mappé sur "user.personal_address.country_or_region".

2023-02-09

Amélioration

  • Ajout d'une vérification de valeur nulle avant le mappage des données pour le champ "onPremisesDistinguishedName".
  • Ajout de gsub pour extraire l'adresse e-mail du champ "proxyAddresses".

2023-01-23

  • Mappage de "onPremisesExtensionAttributes.extensionAttribute4" sur "entity.entity.user.attribute.labels" si "onPremisesExtensionAttributes.extensionAttribute4" est "Employee".
  • Ajout d'une fonction gsub pour "onPremisesDistinguishedName" afin de supprimer les barres obliques arrière supplémentaires.

2022-12-15

Correction de bug:

  • "mailNickname" a été mappé sur "entity.user.attribute.labels".
  • Mappage uniquement de "country_n_code" sur "user.manager.personal_address.country_or_region" si "empmanager-src.usageLocation" est nul.

2022-09-19

  • Correction de bug:
  • Mappage de "entity.user.attribute.roles" sur "ADMINISTRATOR" lorsque l'OU inclut "Admin"

2022-08-11

  • Mappage de "accountEnabled" sur "user.attribute.labels"

2022-05-16

  • Ajout de mises en correspondance pour les champs suivants:
  • "createdDateTime" mappé sur "entity.user.attribute.creation_time"
  • "accountEnabled" mappé sur "entity.user.user_authentication_status"

2022-05-09

  • Amélioration : les champs mappés commençant par extension_GUID_sbuxXXXXXXX ont été mappés sur user.attribute.labels ou manager.attribute.labels, en fonction de leur occurrence dans le journal.

2022-03-24

  • Amélioration : ajout de quelques champs manquants
  • onPremisesSamAccountName, onPremisesDomainName et onPremisesDistinguishedName mappés sur entity.user.attribute.labels.
  • Pour "signInType", userPrincipalName a été mappé sur entity.user.attribute.labels.