Raccogliere gli audit log di Azure DevOps

Supportato in:

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

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo.
  3. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Log di Azure Devops).
  4. Seleziona Webhook come Tipo di origine.
  5. Seleziona Azure Devops come Tipo di log.
  6. Fai clic su Avanti.
  7. (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.
  8. Fai clic su Avanti.
  9. Controlla la configurazione del feed nella schermata Concludi e poi fai clic su Invia.
  10. Fai clic su Genera chiave segreta per generare una chiave segreta per autenticare questo feed.
  11. 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.
  12. Nella scheda Dettagli, copia l'URL dell'endpoint del feed dal campo Informazioni sull'endpoint. Devi specificare questo URL endpoint nell'applicazione client.
  13. Fai clic su Fine.

Crea una chiave API per il feed webhook

  1. Vai alla console Google Cloud > Credenziali.

    Vai a credenziali

  2. Fai clic su Crea credenziali e poi seleziona Chiave API.

  3. Limita l'accesso della chiave API all'API Google Security Operations.

Specifica l'URL dell'endpoint

  1. Nell'applicazione client, specifica l'URL dell'endpoint HTTPS fornito nel feed webhook.
  2. 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

  1. Accedi alla tua organizzazione (https://dev.azure.com/{yourorganization}).
  2. Seleziona l'icona a forma di ingranaggio per Impostazioni dell'organizzazione.
  3. Seleziona Norme in Sicurezza.
  4. Imposta il pulsante Registra eventi di controllo su ON.

Configurare un argomento Event Grid in Azure

  1. Accedi al portale di Azure.
  2. Cerca Event Grid e accedi.
  3. Individua Argomenti in Eventi personalizzati.
  4. Fai clic su + Crea.
  5. Seleziona l'abbonamento e il gruppo di risorse. Fornisci un nome (ad esempio DevopsAuditLog) e seleziona la regione. Fai clic su Rivedi e crea.
  6. Accedi al nuovo argomento e copia l'URL endpoint dell'argomento.
  7. Vai a Impostazioni > Chiavi di accesso e copia Chiave 1.

Configurare lo stream di log di Azure Devops in Event Grid

  1. Accedi alla tua organizzazione (https://dev.azure.com/{yourorganization}).
  2. Seleziona l'icona a forma di ingranaggio per le Impostazioni dell'organizzazione.
  3. Seleziona Controllo.
  4. Vai alla scheda Stream e seleziona Nuovo stream > Event Grid.
  5. 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

  1. Nel portale di Azure, cerca Event Grid e accedi.
  2. Seleziona l'argomento creato in precedenza.
  3. Vai a Entità > Abbonamento evento.
  4. Fai clic su + Abbonamento evento.
  5. Fornisci un nome descrittivo (ad es.Integrazione di Google SecOps).
  6. Seleziona Web hook e fai clic su Configura un endpoint.
  7. 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.
  8. 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