Raccogliere gli audit log di Azure DevOps
Panoramica
Questo parser gestisce i log di controllo di Azure DevOps in formato JSON. Estrae i campi dalle strutture JSON nidificate e di primo livello, mappandoli all'UDM. La logica condizionale basata su valori di campo specifici classifica gli eventi e arricchisce l'output con informazioni di sicurezza pertinenti. Il parser gestisce anche i messaggi non in formato JSON tentando di estrarre un payload JSON utilizzando i pattern grok.
Prima di iniziare
- Assicurati di avere un'istanza Google SecOps.
- Assicurati di avere un'organizzazione Azure DevOps attiva.
- Assicurati di disporre dell'accesso privilegiato all'organizzazione Azure DevOps e ad Azure.
Configura un feed in Google SecOps per importare i log di Azure Devops
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log di Azure Devops).
- Seleziona Webhook come Tipo di origine.
- Seleziona Azure Devops come Tipo di log.
- Fai clic su Avanti.
- (Facoltativo) Specifica i valori per i seguenti parametri di input:
- Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio
\n
. - Spazio dei nomi degli asset: lo spazio dei nomi degli asset.
- Etichette di importazione: l'etichetta applicata agli eventi di questo feed.
- Delimitatore di split: il delimitatore utilizzato per separare le righe di log, ad esempio
- Fai clic su Avanti.
- Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
- Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
- Copia e memorizza la chiave segreta. Non potrai più visualizzare questa chiave segreta. Se necessario, puoi rigenerare una nuova chiave segreta, ma questa azione rende obsoleta la chiave segreta precedente.
- Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL endpoint nell'applicazione client.
- Fai clic su Fine.
Crea una chiave API per il feed webhook
Vai alla console Google Cloud > Credenziali.
Fai clic su Crea credenziali e poi seleziona Chiave API.
Limita l'accesso della chiave API all'API Google Security Operations.
Specifica l'URL dell'endpoint
- Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
Attiva l'autenticazione specificando la chiave API e la chiave segreta nell'intestazione personalizzata nel seguente formato:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Consiglio: specifica la chiave API come intestazione anziché nell'URL. Se il client webhook non supporta le intestazioni personalizzate, puoi specificare la chiave API e la chiave segreta utilizzando parametri di ricerca nel seguente formato:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Sostituisci quanto segue:
ENDPOINT_URL
: l'URL dell'endpoint del feed.API_KEY
: la chiave API per l'autenticazione in Google Security Operations.SECRET
: la chiave segreta che hai generato per autenticare il feed.
Configura la funzionalità di controllo in Azure Devops
- Accedi alla tua organizzazione (
https://dev.azure.com/{yourorganization}
). - Seleziona l'icona a forma di ingranaggio per Impostazioni dell'organizzazione.
- Seleziona Norme in Sicurezza.
- Imposta il pulsante Registra eventi di controllo su ON.
Configurare un argomento Event Grid in Azure
- Accedi al portale di Azure.
- Cerca Event Grid e accedi.
- Individua Argomenti in Eventi personalizzati.
- Fai clic su + Crea.
- Seleziona l'abbonamento e il gruppo di risorse. Fornisci un nome (ad esempio DevopsAuditLog) e seleziona la regione. Fai clic su Rivedi e crea.
- Accedi al nuovo argomento e copia l'URL endpoint dell'argomento.
- Vai a Impostazioni > Chiavi di accesso e copia Chiave 1.
Configurare lo stream di log di Azure Devops in Event Grid
- Accedi alla tua organizzazione (
https://dev.azure.com/{yourorganization}
). - Seleziona l'icona a forma di ingranaggio per le Impostazioni dell'organizzazione.
- Seleziona Controllo.
- Vai alla scheda Stream e seleziona Nuovo stream > Event Grid.
- Inserisci l'endpoint dell'argomento e la chiave di accesso creati in Configurare un argomento Event Grid in Azure.
Configurare un webhook in Azure DevOps per Google SecOps
- Nel portale di Azure, cerca Event Grid e accedi.
- Seleziona l'argomento creato in precedenza.
- Vai a Entità > Abbonamento evento.
- Fai clic su + Abbonamento evento.
- Fornisci un nome descrittivo (ad es.Integrazione di Google SecOps).
- Seleziona Web hook e fai clic su Configura un endpoint.
- Configura l'endpoint:
- Endpoint dell'abbonato: inserisci l'URL dell'endpoint API Google SecOps.
- Aggiungi
?key=<API_KEY>&secret=<SECRET_KEY>
all'URL del payload. - Imposta l'intestazione Content-Type su application/json.
- Fai clic su Crea.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logica |
---|---|---|
ActivityId |
metadata.product_log_id |
Mappato direttamente dal campo Id nel log non elaborato quando il campo records non è presente o dal campo ActivityId all'interno dell'oggetto data quando records è presente. |
ActionId |
metadata.product_event_type |
Mappato direttamente dal campo ActionId all'interno dell'oggetto data . |
ActorCUID |
additional.fields |
Incluso come campo aggiuntivo con chiave "CUID attore". |
ActorDisplayName |
principal.user.user_display_name |
Mappato direttamente dal campo ActorDisplayName se non è "Azure DevOps Service". Se si tratta di "Servizio Azure DevOps", viene aggiunto come etichetta a principal.resource.attribute.labels . |
ActorUPN |
principal.user.email_addresses |
Mappato direttamente dal campo ActorUPN se corrisponde a un pattern di indirizzo email. |
ActorUserId |
principal.user.userid |
Mappato direttamente dal campo ActorUserId . |
Area |
target.application |
Utilizzato per creare il campo target.application anteponendo "DevOps " al valore Area . |
AuthenticationMechanism |
extensions.auth.auth_details , security_result.rule_id |
Analizzati per estrarre i dettagli di autenticazione e l'ID regola. I dettagli di autenticazione sono mappati a extensions.auth.auth_details . L'ID regola estratto è mappato a security_result.rule_id . |
CategoryDisplayName |
security_result.action_details |
Mappato direttamente a security_result.action_details . |
City |
principal.location.city |
Mappato direttamente dal campo City . |
Conditions |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Condizioni". |
Country |
principal.location.country_or_region |
Mappato direttamente dal campo Country . |
Data.* |
Vari | I campi all'interno dell'oggetto Data vengono mappati a diversi campi UDM in base ai relativi nomi e contesti. Di seguito sono riportati alcuni esempi specifici. |
Data.AccessLevel |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "AccessLevel". |
Data.AgentId |
target.resource.product_object_id |
Mappato a target.resource.product_object_id se PipelineId e AuthorizationId non sono presenti. |
Data.AgentName |
target.resource.name |
Mappato a target.resource.name se PipelineName , NamespaceName e DisplayName non sono presenti. |
Data.AuthorizationId |
target.resource.product_object_id |
Mappato a target.resource.product_object_id se PipelineId non è presente. |
Data.CallerProcedure |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "CallerProcedure". |
Data.CheckSuiteId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "CheckSuiteId". |
Data.CheckSuiteStatus |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "CheckSuiteStatus". |
Data.ConnectionId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ConnectionId". |
Data.ConnectionName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ConnectionName". |
Data.ConnectionType |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ConnectionType". |
Data.DefinitionId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "DefinitionId". |
Data.DeploymentResult |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "DeploymentResult". |
Data.DisplayName |
target.resource.name |
Mappato a target.resource.name se PipelineName e NamespaceName non sono presenti. |
Data.EndpointIdList |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "EndpointIdList". |
Data.EnvironmentName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "EnvironmentName". |
Data.Filter.continuationToken |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "continuation_token". |
Data.Filter.endTime |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "filter_end_time". |
Data.Filter.startTime |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "filter_start_time". |
Data.FinishTime |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "FinishTime". |
Data.GroupId |
target.group.product_object_id |
Mappato direttamente a target.group.product_object_id quando Data.Updates.0.GroupId non è presente. |
Data.GroupName |
target.group.group_display_name |
Mappato direttamente a target.group.group_display_name . |
Data.JobName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "JobName". |
Data.MemberId |
target.user.userid |
Mappato direttamente a target.user.userid quando Data.Updates.0.MemberId non è presente. |
Data.MemberDisplayName |
target.user.user_display_name |
Mappato direttamente a target.user.user_display_name . |
Data.NamespaceId |
target.resource.product_object_id |
Mappato a target.resource.product_object_id se PipelineId , AuthorizationId e AgentId non sono presenti. |
Data.NamespaceName |
target.resource.name |
Mappato a target.resource.name se PipelineName non è presente. |
Data.ownerDetails |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "OwnerDetails". |
Data.OwnerId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "OwnerId". |
Data.PipelineId |
target.resource.product_object_id |
Mappato direttamente a target.resource.product_object_id . |
Data.PipelineName |
target.resource.name |
Mappato direttamente a target.resource.name . |
Data.PipelineRevision |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "PipelineRevision". |
Data.PipelineScope |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "PipelineScope". |
Data.PlanType |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "PlanType". |
Data.PreviousAccessLevel |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "PreviousAccessLevel". |
Data.PublisherName |
target.resource.attribute.labels |
Aggiunto come etichetta con la chiave "PublisherName". |
Data.Reason |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Motivo". |
Data.ReleaseId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ReleaseId". |
Data.ReleaseName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ReleaseName". |
Data.RequesterId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "RequesterId". |
Data.RetentionLeaseId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "RetentionLeaseId". |
Data.RetentionOwnerId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "RetentionOwnerId". |
Data.RunName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "RunName". |
Data.Scopes |
target.resource.attribute.labels |
Aggiunto come etichette con la chiave "Ambito". |
Data.StageName |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "StageName". |
Data.StartTime |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "StartTime". |
Data.TargetUser |
target.user.userid |
Mappato direttamente a target.user.userid . |
Data.Timestamp |
metadata.event_timestamp |
Analizzati e mappati a metadata.event_timestamp . |
Data.TokenType |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "TokenType". |
Data.Updates.0.GroupId |
target.group.product_object_id |
Mappato direttamente a target.group.product_object_id . |
Data.Updates.0.MemberId |
target.user.userid |
Mappato direttamente a target.user.userid . |
Data.ValidFrom |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "ValidFrom". |
Data.ValidTo |
target.resource.attribute.labels |
Aggiunto come etichetta con chiave "ValidTo". |
DewPoint |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "DewPoint". |
Details |
metadata.description |
Mappato direttamente a metadata.description . |
Humidity |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Umidità". |
Icon |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Icon". |
Id |
metadata.product_log_id |
Mappato direttamente a metadata.product_log_id . |
IpAddress |
principal.ip |
Mappato direttamente a principal.ip . |
MoonPhase |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "MoonPhase". |
Moonrise |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Moonrise". |
Moonset |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Luna tramontata". |
OperationName |
metadata.product_event_type |
Mappato direttamente a metadata.product_event_type . |
Precipitation |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Precipitazione". |
Pressure |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Pressione". |
ProjectId |
target.resource_ancestors.product_object_id |
Viene utilizzato per compilare il campo product_object_id in target.resource_ancestors quando l'antenato è di tipo CLOUD_PROJECT . |
ProjectName |
target.resource_ancestors.name , target.resource.attribute.labels |
Viene utilizzato per compilare il campo name in target.resource_ancestors quando l'antenato è di tipo CLOUD_PROJECT . È stato aggiunto anche come etichetta a target.resource.attribute.labels con la chiave "ProjectName". |
RoleLocation |
target.location.name |
Mappato direttamente a target.location.name . |
ScopeDisplayName |
target.resource_ancestors.name |
Viene utilizzato per compilare il campo name in target.resource_ancestors quando l'antenato è di tipo CLOUD_ORGANIZATION . |
ScopeId |
target.resource_ancestors.product_object_id |
Viene utilizzato per compilare il campo product_object_id in target.resource_ancestors quando l'antenato è di tipo CLOUD_ORGANIZATION . |
ScopeType |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "ScopeType". |
Sunrise |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Sunrise". |
Sunset |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Tramonto". |
Temperature |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Temperatura". |
TenantId |
metadata.product_deployment_id , additional.fields |
Mappato direttamente a metadata.product_deployment_id . È stato aggiunto anche come campo aggiuntivo con la chiave "TenantId". |
TimeGenerated |
metadata.event_timestamp |
Analizzati e mappati a metadata.event_timestamp . |
UserAgent |
network.http.user_agent , network.http.parsed_user_agent |
Mappato direttamente a network.http.user_agent . Inoltre, viene analizzato e mappato a network.http.parsed_user_agent . |
UVIndex |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "UVIndex". |
Visibility |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Visibilità". |
WindDirection |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "WindDirection". |
WindSpeed |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "Velocità vento". |
_Internal_WorkspaceResourceId |
additional.fields |
Aggiunto come campo aggiuntivo con chiave "workspace_resource_id". |
N/A | metadata.event_type |
Determinato da una logica basata su OperationName e altri campi. Il valore predefinito è "GENERIC_EVENT" se non viene trovata una corrispondenza per un tipo di evento specifico. I valori possibili includono "STATUS_SHUTDOWN", "RESOURCE_CREATION", "STATUS_UPDATE", "USER_RESOURCE_DELETION", "RESOURCE_READ", "RESOURCE_WRITTEN", "RESOURCE_DELETION" e "GROUP_MODIFICATION". |
N/A | metadata.vendor_name |
Imposta su "Microsoft". |
N/A | metadata.product_name |
Impostato su "Azure DevOps". |
N/A | metadata.log_type |
Impostato su "AZURE_DEVOPS". |
N/A | principal.user.account_type |
Imposta su "SERVICE_ACCOUNT_TYPE" se AuthenticationMechanism contiene "ServicePrincipal", altrimenti imposta su "CLOUD_ACCOUNT_TYPE". |
N/A | target.asset.attribute.cloud.environment |
Imposta su MICROSOFT_AZURE . |
N/A | security_result.action |
Imposta su "ALLOW" per le operazioni riuscite (Succeeded, Created, Modified, executed, updated, removed) e su "BLOCK" per le operazioni non riuscite (Failed, TimedOut). |
N/A | extensions.auth.mechanism |
Imposta su "USERNAME_PASSWORD" se summary è "UserAuthToken". |
N/A | target.resource.resource_type |
Impostato su "SETTING" se è presente pipeline_id , "CREDENTIAL" se è presente authorization_id , "DEVICE" se è presente agent_id o "DATABASE" se è presente namespace_id . In caso contrario, in alcuni casi viene impostato su "STORAGE_BUCKET" in base a operationName . |
N/A | target.resource.resource_subtype |
Impostato su "Pipeline" se è presente pipeline_id , su "Token" se è presente authorization_id , su "Agente" se è presente agent_id o su "Spazio dei nomi" se è presente namespace_id . |
Modifiche
2024-01-19
- È stato modificato il valore "metadata.eventtype" da "SERVICE*" a "USER_RESOURCE_UPDATE_CONTENT" se sono presenti i dati utente principali e i dati della risorsa di destinazione.
- La mappatura di "IpAddress" è stata modificata da "target.ip" a "principal.ip".
- È stata modificata la mappatura di "ActorCUID" da "principal.user.product_object_id" a "additional.fields".
- È stata modificata la mappatura di "ScopeId" da "principal.asset_id" a "resource_ancestors.product_object_id".
- È stata modificata la mappatura di "_Internal_WorkspaceResourceId" da "target.resource.product_object_id" a "additional.fields".
- La mappatura di "ProjectId" è stata modificata da "target.resource.attribute.labels" a "target.resource_ancestors.product_object_id".
- La mappatura di "AuthenticationMechanism" è stata modificata da "security_result.summary" a "extensions.auth.auth_details".
- È stata modificata la mappatura di "CorrelationId" da "network.session_id" ad "additional.fields".
- È stata modificata la mappatura di "ScopeDisplayName" da "additional.fields" a "target.resource_ancestors.name".
- È stata modificata la mappatura di "PipelineId" da "additional.fields" a "target.resource.product_object_id".
- È stata modificata la mappatura di "PipelineName" da "additional.fields" a "target.resource.name".
- È stata modificata la mappatura di "PipelineScope" da "additional.fields" a "target.resource.attribute.labels".
- È stata modificata la mappatura di "PipelineRevision" da "additional.fields" a "target.resource.attribute.labels".
- La mappatura di "ProjectId" è stata modificata da "target.resource.resource.attribute.labels" a "target.resource_ancestors.product_object_id".
- La mappatura di "Area" è stata modificata da "additional.fields" a "target.application".
- Il valore "MICROSOFT_AZURE" è stato mappato a "target.asset.attribute.cloud.environment".
- Se "AuthenticationMechanism" ha il valore "ServicePrincipal", imposta "SERVICE_ACCOUNT_TYPE" su "principal.user.account_type", altrimenti imposta "CLOUD_ACCOUNT_TYPE" su "principal.user.account_type".
- "Categoria" è stata mappata a "security_result.action_details".
- "ALLOW" o "BLOCK" è stato mappato a "security_result.action" in base al campo "Details".
- "ActivityId" è stato mappato a "additional.fields".
2024-01-09
- Sono stati aggiunti Grok e gsub per analizzare i log JSON non analizzati.
- "rec.correlationId", "properties.currentHealthStatus", "properties.previousHealthStatus", "properties.type", "properties.cause", "properties.title", "properties.details", "properties.recommendationType", "properties.recommendationCategory", "properties.recommendationImpact", "properties.recommendationName", "properties.recommendationResourceLink", "properties.recommendationSchemaVersion", "properties.eventCategory", "properties.hierarchy", "properties.message", "properties.entity", "identity.claims.xms.tcdt", "identity.claims.aio", "identity.claims.appid", "identity.claims.appidacr", "identity.claims.aud", "identity.claims.exp", "identity.claims.iat", "identity.claims.idtyp", "identity.claims.iss", "identity.claims.uti", "identity.claims.rh", "identity.claims.ver", "identity.claims.nbf", "identity.authorization.evidence.roleAssignmentId", "identity.authorization.evidence.principalType", "identity.authorization.evidence.principalId", "identity.authorization.evidence.roleAssignmentScope", "identity.authorization.evidence.roleDefinitionId" a "security_result.detection_fields".
- "resultSignature.label", "rec.resultType", "Visibilità", "Umidità", "Precipitazioni","FaseLunare", "AlbaLunare", "TramontoLunare", "Pressione", "VelocitàVento", "IndiceUV", "PuntoRogo", "DirezioneVento", "Alba", "Tramonto", "Temperatura", "Icona", "Condizioni" sono stati mappati a "additional.fields".
- "livello" è stato mappato a "security_result.severity".
- "NomeApp" è stato mappato a "target.application".
- "category.details" è stato mappato a "security.result.category.details".
- "rec.resourceId" è stato mappato a "target.resource.id".
- "res.extensionResourceName" è stato mappato a "principal.hostname".
2023-11-23
- È stato aggiunto il supporto di un nuovo pattern di log JSON.
- "data.TimeGenerated" è stato mappato a "metadata.event_timestamp".
- Quando "_Internal_WorkspaceResourceId" non è presente, mappa "topic" a "target.resource.product_object_id".
- "data.Data.ConnectionId" è stato mappato a "additional.fields".
- "data.Data.ownerDetails" è stato mappato a "additional.fields".
- "data.Data.DeploymentResult" è stato mappato a "additional.fields".
- "data.Data.EnvironmentName" è stato mappato a "additional.fields".
- "data.Data.JobName" è stato mappato a "additional.fields".
- "data.Data.StageName" è stato mappato a "additional.fields".
- "data.Data.RunName" è stato mappato a "additional.fields".
- "data.Data.RetentionLeaseId" è stato mappato a "additional.fields".
- "data.Data.CheckSuiteId" è stato mappato a "additional.fields".
- "data.Data.CheckSuiteStatus" è stato mappato a "additional.fields".
- "data.Data.ApprovalRequest" è stato mappato a "additional.fields".
- "data.Data.ApprovalType" è stato mappato a "additional.fields".
- "subject" è stato mappato a "additional.fields".
- "data.ActorUserId" è stato mappato a "principal.user.userid".
- "data.ActorDisplayName" è stato mappato a "principal.user.user_display_name".
- "data.ActorCUID" è stato mappato a "principal.user.product_object_id".
- "data.ActorUPN" è stato mappato a "principal.user.email_addresses".
- "data.ScopeId" è stato mappato a "principal.asset_id".
- "data.CorrelationId" è stato mappato a "network.session_id".
- "data.UserAgent" è stato mappato a "network.http.user_agent".
- "data.ProjectId" è stato mappato a "target.resource.attribute.labels".
- "data.ScopeType" è stato mappato a "additional.fields".
- "data.ProjectName" è stato mappato a "target.resource.attribute.labels".
- "data.Details" è stato mappato a "metadata.description".
- "data.CategoryDisplayName" è stato mappato a "security_result.rule_name".
- "data.Area" è stato mappato a "additional.fields".
- "data.Id" è stato mappato a "metadata.product_log_id".
- "data.ActionId" è stato mappato a "metadata.product_event_type".
- "data.Timestamp" è stato mappato a "metadata.event_timestamp".
2022-06-28
- Analizzatore appena creato