Raccogliere i log del contesto di Microsoft Azure AD
Questo documento descrive come raccogliere i log di Microsoft Azure Active Directory (AD) impostando un feed di Google Security Operations.
Azure Active Directory (AZURE_AD
) ora si chiama Microsoft Entra ID. Gli audit log di Azure AD
(AZURE_AD_AUDIT
) ora sono audit log di Microsoft Entra ID.
Per ulteriori informazioni, consulta Importazione dei dati in Google Security Operations.
Un'etichetta di importazione identifica l'analizzatore sintattico che normalizza i dati dei log non elaborati in formato UDM strutturato.
Prima di iniziare
Per completare le attività in questa pagina, assicurati di disporre di quanto segue:
- Un abbonamento Azure a cui puoi accedere.
- Un ruolo di amministratore globale o di amministratore di Azure AD.
- Un tenant Azure AD in Azure.
Configurare Azure AD
- Accedi al portale Azure.
- Vai a Home > Registrazione app, seleziona un'applicazione registrata o registra un'applicazione se non ne hai ancora creata una.
- Per registrare un'applicazione, nella sezione Registrazione app, fai clic su Nuova registrazione.
- Nel campo Nome, fornisci il nome visualizzato per l'applicazione.
- Nella sezione Tipi di account supportati, seleziona l'opzione richiesta per specificare chi può utilizzare l'applicazione o accedere all'API.
- Fai clic su Registrati.
- Vai alla pagina Panoramica e copia l'ID applicazione (client) e l'ID directory (tenant), necessari per configurare il feed di Google Security Operations.
- Fai clic su Autorizzazioni API.
- Fai clic su Aggiungi un'autorizzazione e seleziona Microsoft Graph nel nuovo riquadro.
- Fai clic su Autorizzazioni applicazione.
- Seleziona le autorizzazioni AuditLog.Read.All, Directory.Read.All e SecurityEvents.Read.All. Assicurati che le autorizzazioni siano Autorizzazioni app e non Autorizzazioni delegate.
- Fai clic su Concedi il consenso amministratore per la directory predefinita. Le applicazioni sono autorizzate a chiamare le API quando gli utenti o gli amministratori concedono le autorizzazioni nell'ambito della procedura di consenso.
- Vai a Impostazioni > Gestisci.
- Fai clic su Certificati e secret.
- Fai clic su Nuovo segreto client. Nel campo Valore viene visualizzato il client secret.
- Copia il valore del client secret. Il valore viene visualizzato solo al momento della creazione ed è necessario per la registrazione dell'app Azure e per configurare il feed di Google Security Operations.
Configura un feed in Google Security Operations per importare i log di contesto di Azure AD
- Seleziona Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Inserisci un nome univoco per il nome del feed.
- Seleziona API di terze parti come Tipo di origine.
- Seleziona Contesto organizzativo Azure AD come Tipo di log.
- Fai clic su Avanti.
- Configura i seguenti parametri di input obbligatori:
- ID client OAuth: specifica l'ID client ottenuto in precedenza.
- Client secret OAuth: specifica il client secret ottenuto in precedenza.
- ID tenant: specifica l'ID tenant ottenuto in precedenza.
- Fai clic su Avanti e poi su Invia.
Per saperne di più sui feed di Google Security Operations, consulta la documentazione dei feed di Google Security Operations. Per informazioni sui requisiti per ciascun tipo di feed, consulta Configurazione dei feed per tipo. Se riscontri problemi durante la creazione dei feed, contatta l'assistenza di Google Security Operations.
Riferimento alla mappatura dei campi
Questo codice dell'analizzatore sintattico trasforma i log non elaborati in formato JSON di Azure Active Directory in un modello dei dati unificato (UDM). Estrae informazioni su utenti e gestori, inclusi attributi, ruoli, relazioni ed etichette, gestendo al contempo varie incoerenze nei dati e arricchendo l'output con campi standardizzati.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
businessPhones | user.phone_numbers | Mappato direttamente dal campo businessPhones nel log non elaborato. Più numeri di telefono vengono estratti e mappati come voci separate. |
city | user.personal_address.city | Mappato direttamente dal campo city nel log non elaborato. |
companyName | user.company_name | Mappato direttamente dal campo companyName nel log non elaborato. |
country | user.personal_address.country_or_region | Mappato direttamente dal campo country nel log non elaborato. Se country è vuoto, il valore viene preso da usageLocation . |
createdDateTime | user.attribute.creation_time | Convertito in un timestamp dal campo createdDateTime nel log non elaborato utilizzando il formato RFC3339. |
reparto | user.department | Mappato direttamente dal campo department nel log non elaborato. Più reparti vengono estratti e mappati come voci separate. |
displayName | user.user_display_name | Mappato direttamente dal campo displayName nel log non elaborato. |
employeeId | user.employee_id | Mappato direttamente dal campo employeeId nel log non elaborato. Se employeeId è vuoto, il valore viene preso da extension_employeeNumber . |
employeeType | user.attribute.labels.value (chiave: employeeType) | Mappato direttamente dal campo employeeType nel log non elaborato e aggiunto come etichetta con la chiave employeeType . |
extension_employeeNumber | user.employee_id | Mappato a user.employee_id se employeeId è vuoto. |
extension_wfc_AccountType | event.idm.entity.entity.labels.value (chiave: wfc_AccountType) | Mappato direttamente dal campo extension_wfc_AccountType nel log non elaborato e aggiunto come etichetta con la chiave wfc_AccountType . |
extension_wfc_AccountingUnitName | event.idm.entity.entity.labels.value (chiave: extension_wfc_AccountingUnitName) | Mappato direttamente dal campo extension_wfc_AccountingUnitName nel log non elaborato e aggiunto come etichetta con la chiave extension_wfc_AccountingUnitName . |
extension_wfc_execDescription | event.idm.entity.entity.labels.value (chiave: extension_wfc_execDescription) | Mappato direttamente dal campo extension_wfc_execDescription nel log non elaborato e aggiunto come etichetta con la chiave extension_wfc_execDescription . |
extension_wfc_groupDescription | event.idm.entity.entity.labels.value (chiave: extension_wfc_groupDescription) | Mappato direttamente dal campo extension_wfc_groupDescription nel log non elaborato e aggiunto come etichetta con la chiave extension_wfc_groupDescription . |
extension_wfc_orgDescription | event.idm.entity.entity.labels.value (chiave: extension_wfc_orgDescription) | Mappato direttamente dal campo extension_wfc_orgDescription nel log non elaborato e aggiunto come etichetta con la chiave extension_wfc_orgDescription . |
givenName | user.first_name | Mappato direttamente dal campo givenName nel log non elaborato. |
gopher-devices | event.idm.entity.relations | Ogni dispositivo nell'array gopher-devices è mappato a una voce di relazione separata. deviceId viene mappato a product_object_id , operatingSystem e operatingSystemVersion vengono combinati per formare platform_version , model viene mappato direttamente e createdDateTime viene convertito in un timestamp e mappato a created_timestamp . La relazione è impostata su OWNS e la direzione su UNIDIRECTIONAL . |
gopher-groups | event.idm.entity.relations | Ogni gruppo nell'array gopher-groups è mappato a una voce di relazione separata. id è mappato a product_object_id e displayName è mappato a group_display_name . La relazione è impostata su MEMBER e la direzione su UNIDIRECTIONAL . |
gopher-manager.businessPhones | empmanager.phone_numbers | Mappato a empmanager.phone_numbers se manager è vuoto. |
gopher-manager.country | empmanager.personal_address.country_or_region | Mappato a empmanager.personal_address.country_or_region se manager è vuoto. Se sia gopher-manager.country sia gopher-manager.usageLocation sono vuoti, il campo viene lasciato vuoto. |
gopher-manager.department | empmanager.department | Mappato a empmanager.department se manager è vuoto. |
gopher-manager.displayName | empmanager.user_display_name | Mappato a empmanager.user_display_name se manager è vuoto. |
gopher-manager.employeeId | empmanager.employee_id | Mappato a empmanager.employee_id se manager è vuoto e gopher-manager.employeeId non è vuoto. |
gopher-manager.extension_employeeNumber | empmanager.employee_id | Mappato a empmanager.employee_id se manager e gopher-manager.employeeId sono vuoti e gopher-manager.extension_employeeNumber non è vuoto. |
gopher-manager.givenName | empmanager.first_name | Mappato a empmanager.first_name se manager è vuoto. |
gopher-manager.id | empmanager.product_object_id | Mappato a empmanager.product_object_id se manager è vuoto. |
gopher-manager.jobTitle | empmanager.title | Mappato a empmanager.title se manager è vuoto. |
gopher-manager.mail | empmanager.email_addresses | Mappato a empmanager.email_addresses se manager è vuoto. |
gopher-manager.onPremisesImmutableId | user.attribute.labels.value (chiave: gopher-manager onPremisesImmutableId) | Mappato come etichetta con la chiave gopher-manager onPremisesImmutableId . |
gopher-manager.onPremisesSamAccountName | empmanager.userid | Mappato a empmanager.userid se manager è vuoto. |
gopher-manager.onPremisesSecurityIdentifier | empmanager.windows_sid | Mappato a empmanager.windows_sid se manager è vuoto. |
gopher-manager.proxyAddresses | empmanager.email_addresses, empmanager.group_identifiers | Se manager è vuoto, ogni indirizzo nell'array gopher-manager.proxyAddresses viene mappato a empmanager.email_addresses o empmanager.group_identifiers a seconda che inizi con "smtp" o "SMTP". |
gopher-manager.refreshTokensValidFromDateTime | empmanager.attribute.labels.value (chiave: refreshTokensValidFromDateTime) | Mappato come etichetta con la chiave refreshTokensValidFromDateTime se manager è vuoto. |
gopher-manager.streetAddress | empmanager.personal_address.name | Mappato a empmanager.personal_address.name se manager è vuoto. |
gopher-manager.surname | empmanager.last_name | Mappato a empmanager.last_name se manager è vuoto. |
gopher-manager.usageLocation | user.attribute.labels.value (chiave: manager_src_usageLocation) | Mappato come etichetta con la chiave manager_src_usageLocation . |
gopher-manager.userType | empmanager.attribute.roles.name | Mappato a empmanager.attribute.roles.name se manager è vuoto. |
ID | user.product_object_id | Mappato direttamente dal campo id nel log non elaborato. |
identità | user.attribute.labels.value (chiave: signInType), user.attribute.labels.value (chiave: userPrincipalName) | signInType è mappato come etichetta con la chiave signInType . Se signInType e userPrincipalName non sono vuoti, vengono combinati e mappati come etichetta con la chiave userPrincipalName . |
jobTitle | user.title | Mappato direttamente dal campo jobTitle nel log non elaborato. |
posta | user.email_addresses | Mappato direttamente dal campo mail nel log non elaborato. Se mail inizia con "svc-", user_role.type viene impostato su SERVICE_ACCOUNT . |
mailNickname | user.attribute.labels.value (chiave: mailNickname) | Mappato direttamente dal campo mailNickname nel log non elaborato e aggiunto come etichetta con la chiave mailNickname . |
manager.businessPhones | empmanager.phone_numbers | Mappato a empmanager.phone_numbers se gopher-manager è vuoto. |
manager.city | empmanager.personal_address.city | Mappato a empmanager.personal_address.city se gopher-manager è vuoto. |
manager.companyName | empmanager.company_name | Mappato a empmanager.company_name se gopher-manager è vuoto. |
manager.country | empmanager.personal_address.country_or_region | Mappato a empmanager.personal_address.country_or_region se gopher-manager è vuoto. Se sia manager.country sia manager.usageLocation sono vuoti, il campo viene lasciato vuoto. |
manager.department | empmanager.department | Mappato a empmanager.department se gopher-manager è vuoto. |
manager.displayName | empmanager.user_display_name | Mappato a empmanager.user_display_name se gopher-manager è vuoto. |
manager.employeeId | empmanager.employee_id | Mappato a empmanager.employee_id se gopher-manager è vuoto e manager.employeeId non è vuoto. |
manager.extension_employeeNumber | empmanager.employee_id | Mappato a empmanager.employee_id se gopher-manager e manager.employeeId sono vuoti e manager.extension_employeeNumber non è vuoto. |
manager.givenName | empmanager.first_name | Mappato a empmanager.first_name se gopher-manager è vuoto. |
manager.id | empmanager.product_object_id | Mappato a empmanager.product_object_id se gopher-manager è vuoto. |
manager.jobTitle | empmanager.title | Mappato a empmanager.title se gopher-manager è vuoto. |
manager.mail | empmanager.email_addresses | Mappato a empmanager.email_addresses se gopher-manager è vuoto. |
manager.onPremisesSamAccountName | empmanager.userid | Mappato a empmanager.userid se gopher-manager è vuoto. |
manager.onPremisesSecurityIdentifier | empmanager.windows_sid | Mappato a empmanager.windows_sid se gopher-manager è vuoto. |
manager.proxyAddresses | empmanager.email_addresses, empmanager.group_identifiers | Se gopher-manager è vuoto, ogni indirizzo nell'array manager.proxyAddresses viene mappato a empmanager.email_addresses o empmanager.group_identifiers a seconda che inizi con "smtp" o "SMTP". |
manager.refreshTokensValidFromDateTime | empmanager.attribute.labels.value (chiave: refreshTokensValidFromDateTime) | Mappato come etichetta con la chiave refreshTokensValidFromDateTime se gopher-manager è vuoto. |
manager.state | empmanager.personal_address.state | Mappato a empmanager.personal_address.state se gopher-manager è vuoto. |
manager.streetAddress | empmanager.personal_address.name | Mappato a empmanager.personal_address.name se gopher-manager è vuoto. |
manager.surname | empmanager.last_name | Mappato a empmanager.last_name se gopher-manager è vuoto. |
manager.usageLocation | user.attribute.labels.value (chiave: manager_src_usageLocation), empmanager.personal_address.country_or_region | Mappato come etichetta con la chiave manager_src_usageLocation . Se manager.country è vuoto, il valore viene mappato anche a empmanager.personal_address.country_or_region . |
manager.userType | empmanager.attribute.roles.name | Mappato a empmanager.attribute.roles.name se gopher-manager è vuoto. |
onPremisesDistinguishedName | user.attribute.labels.value (chiave: onPremisesDistinguishedName), user.attribute.labels.value (chiave: dati onPremisesDistinguishedName-OU) | Il nome distinto completo viene mappato come etichetta con la chiave onPremisesDistinguishedName . La parte OU del nome distinto viene estratta e mappata come etichetta con la chiave onPremisesDistinguishedName-OU data . Se la parte OU contiene "Amministratore", user_role.type è impostato su ADMINISTRATOR . Se contiene "Account di servizio", user_role.type è impostato su SERVICE_ACCOUNT . |
onPremisesDomainName | user.group_identifiers, user.attribute.labels.value (chiave: onPremisesDomainName) | Mappato direttamente a user.group_identifiers e aggiunto come etichetta con la chiave onPremisesDomainName . |
onPremisesImmutableId | user.attribute.labels.value (chiave: onPremisesImmutableId) | Mappato direttamente dal campo onPremisesImmutableId nel log non elaborato e aggiunto come etichetta con la chiave onPremisesImmutableId . |
onPremisesSamAccountName | user.userid, user.attribute.labels.value (chiave: onPremisesSamAccountName) | Mappato a user.userid se sAMAccountName è vuoto. È stato aggiunto anche come etichetta con la chiave onPremisesSamAccountName . |
onPremisesSecurityIdentifier | user.windows_sid | Mappato direttamente dal campo onPremisesSecurityIdentifier nel log non elaborato. |
proxyAddresses | user.email_addresses, user.group_identifiers | Ogni indirizzo nell'array proxyAddresses è mappato a user.email_addresses o user.group_identifiers a seconda che inizi con "smtp" o "SMTP". Se l'indirizzo inizia con "smtp" o "SMTP", il prefisso "smtp:" o "SMTP:" viene rimosso e l'indirizzo email rimanente viene estratto e mappato a user.email_addresses . |
refreshTokensValidFromDateTime | user.attribute.labels.value (chiave: refreshTokensValidFromDateTime) | Mappato direttamente dal campo refreshTokensValidFromDateTime nel log non elaborato e aggiunto come etichetta con la chiave refreshTokensValidFromDateTime . |
sAMAccountName | user.userid | Mappato direttamente dal campo sAMAccountName nel log non elaborato. |
state | user.personal_address.state | Mappato direttamente dal campo state nel log non elaborato. |
streetAddress | user.personal_address.name | Mappato direttamente dal campo streetAddress nel log non elaborato. |
surname | user.last_name | Mappato direttamente dal campo surname nel log non elaborato. |
usageLocation | user.personal_address.country_or_region | Se country è vuoto, il valore viene mappato a user.personal_address.country_or_region . |
userPrincipalName | user.email_addresses | Mappato direttamente dal campo userPrincipalName nel log non elaborato. Se userPrincipalName inizia con "svc-", user_role.type viene impostato su SERVICE_ACCOUNT . |
userType | user.attribute.roles.name | Mappato direttamente dal campo userType nel log non elaborato e aggiunto a user.attribute.roles.name . |
Logica del parser | Mappatura UDM | Logica |
N/D | event.idm.entity.metadata.vendor_name | Imposta su "Microsoft". |
N/D | event.idm.entity.metadata.product_name | Imposta su "Azure Active Directory". |
N/D | event.idm.entity.metadata.entity_type | Imposta su "USER". |
N/D | event.idm.entity.metadata.collected_timestamp | Imposta il campo create_time dal log non elaborato. |
accountEnabled | user.user_authentication_status, user.attribute.labels.value (chiave: accountEnabled) | Se accountEnabled è true, user.user_authentication_status viene impostato su "ACTIVE" e viene aggiunta un'etichetta con la chiave accountEnabled e il valore "true". In caso contrario, viene aggiunta un'etichetta con la chiave accountEnabled e il valore "false". |
empmanager-src.accountEnabled | user.user_authentication_status, user.attribute.labels.value (chiave: accountEnabled) | Se manager è vuoto e empmanager-src.accountEnabled è "true", user.user_authentication_status viene impostato su "ACTIVE" e viene aggiunta un'etichetta con la chiave accountEnabled e il valore "true". In caso contrario, viene aggiunta un'etichetta con la chiave accountEnabled e il valore "false". |
onPremisesDistinguishedName | user_role.type | Se la parte OU del nome distinto contiene "Amministratore", user_role.type viene impostato su ADMINISTRATOR . Se contiene "Account di servizio", user_role.type è impostato su SERVICE_ACCOUNT . |
userPrincipalName | user_role.type | Se userPrincipalName inizia con "svc-", user_role.type viene impostato su SERVICE_ACCOUNT . |
empmanager-src.onPremisesDistinguishedName | manager_role.type | Se gopher-manager è vuoto e la parte OU del nome distinto del gestore contiene "Utenti", manager_role.type viene impostato su ADMINISTRATOR . Se contiene "Account di servizio", manager_role.type è impostato su SERVICE_ACCOUNT . |
empmanager-src.userPrincipalName | manager_role.type | Se gopher-manager è vuoto e empmanager-src.userPrincipalName inizia con "svc-", manager_role.type viene impostato su SERVICE_ACCOUNT . |
posta | user_role.type | Se mail inizia con "svc-", user_role.type viene impostato su SERVICE_ACCOUNT . |
Modifiche
2024-04-29
- "officeLocation" è stato mappato a "entity.location.name".
- Sono stati mappati "extension_wfc_groupDescription", "extension_wfc_execDescription", "extension_wfc_orgDescription", "extension_wfc_AccountingUnitName" ed "extension_wfc_AccountType" a "entity.labels".
2024-05-02
Correzione di bug:
- Sono stati aggiunti controlli per il campo "accountEnabled" per analizzare il valore corretto nel campo "entity.user.attribute.labels.value".
2024-03-14
- "onPremisesImmutableId" è stato mappato a "entity.user.attribute.labels".
- "gopher-manager.onPremisesImmutableId" è stato mappato a "entity.user.attribute.labels".
2024-01-12
Correzione di bug:
- È stata modificata la mappatura di "empmanager-src.usageLocation" da "entity.user.personal_address.country_or_region" a "entity.user.attribute.labels".
2023-11-24
Miglioramento
- L'attributo "employeeType" è stato mappato a "entity.user.attribute.labels".
- Sono stati eliminati i log JSON non validi con il tag "TAG_MALFORMED_MESSAGE".
2023-10-25
Correzione di bug
- Sono stati aggiunti controlli null e un controllo "on_error" per i valori mancanti.
2023-09-25
Miglioramento
- È stata aggiunta la funzione di rinominazione anziché di sostituzione per mappare "group.displayName" a "relation_entity.entity.group.group_display_name".
- "country" è stato mappato a "user.personal_address.country_or_region". Se "country" non è presente, "usageLocation" è stato mappato a "user.personal_address.country_or_region".
2023-02-09
Miglioramento
- È stato aggiunto il controllo null prima della mappatura dei dati per il campo "onPremisesDistinguishedName".
- È stata aggiunta la funzione gsub per estrarre l'indirizzo email dal campo "proxyAddresses".
2023-01-23
- "onPremisesExtensionAttributes.extensionAttribute4" è stato mappato a "entity.entity.user.attribute.labels" se "onPremisesExtensionAttributes.extensionAttribute4" è "Employee".
- È stato aggiunto gsub per "onPremisesDistinguishedName" per rimuovere le barre di sbarramento aggiuntive.
2022-12-15
Correzione di bug:
- "mailNickname" è stato mappato a "entity.user.attribute.labels".
- È stato mappato solo "country_n_code" a "user.manager.personal_address.country_or_region" se "empmanager-src.usageLocation" è null.
2022-09-19
- Correzione di bug:
- "entity.user.attribute.roles" è stato mappato a "ADMINISTRATOR" se il gruppo di organizzazioni include "Amministratore"
2022-08-11
- "accountEnabled" è stato mappato a "user.attribute.labels"
2022-05-16
- sono state aggiunte mappature per i seguenti campi:
- 'createdDateTime' mappato a 'entity.user.attribute.creation_time'
- "accountEnabled" mappato a "entity.user.user_authentication_status"
2022-05-09
- Miglioramento: i campi mappati che iniziano con extension_GUID_sbuxXXXXXXX a user.attribute.labels o manager.attribute.labels, a seconda della relativa occorrenza nel log.
2022-03-24
- Miglioramento: sono stati aggiunti alcuni campi mancanti
- onPremisesSamAccountName, onPremisesDomainName, onPremisesDistinguishedName mappati a entity.user.attribute.labels.
- Per signInType, userPrincipalName è stato mappato a entity.user.attribute.labels.