Raccogliere i log delle risorse Microsoft Azure
Questo documento spiega come raccogliere i log delle risorse Microsoft Azure configurando un feed Google Security Operations utilizzando Microsoft Azure Blob Storage V2.
I log delle risorse Azure forniscono informazioni dettagliate sulle operazioni eseguite all'interno delle risorse Azure. Questi log acquisiscono informazioni dettagliate su operazioni, stato e metriche sul rendimento delle risorse. Il contenuto varia in base al tipo di risorsa e include dati come eventi di autenticazione, modifiche alla configurazione, tentativi di accesso e metriche operative.
Prima di iniziare
Assicurati di disporre dei seguenti prerequisiti:
- Un'istanza Google SecOps
Accesso con privilegi al portale Microsoft Azure con autorizzazioni per:
- Crea account di archiviazione
- Configura le impostazioni di diagnostica per le risorse Azure
- Gestire le chiavi di accesso
Configura l'account di archiviazione di Azure
Crea un account di archiviazione
- Nel portale Azure, cerca Account di archiviazione.
- Fai clic su + Crea.
Fornisci i seguenti dettagli di configurazione:
Impostazione Valore Abbonamento Seleziona il tuo abbonamento Azure Gruppo di risorse Seleziona un'opzione esistente o creane una nuova Nome account di archiviazione Inserisci un nome univoco (ad esempio, azureresourcelogs).Regione Seleziona la regione (ad esempio, East US)Prestazioni Standard (consigliato) Ridondanza GRS (archiviazione con ridondanza geografica) o LRS (archiviazione con ridondanza locale) Fai clic su Review + create (Rivedi e crea).
Controlla la panoramica dell'account e fai clic su Crea.
Attendi il completamento del deployment.
Recuperare le credenziali dell'account di archiviazione
- Vai all'account di archiviazione che hai appena creato.
- Nel riquadro di navigazione a sinistra, seleziona Chiavi di accesso in Sicurezza e networking.
- Fai clic su Mostra chiavi.
Copia e salva i seguenti dati per utilizzarli in un secondo momento:
- Nome dell'account di archiviazione:
azureresourcelogs - Chiave 1 o Chiave 2: la chiave di accesso condivisa (una stringa casuale di 512 bit con codifica Base64)
- Nome dell'account di archiviazione:
Ottieni l'endpoint del servizio Blob
- Nello stesso account di archiviazione, seleziona Endpoint nel menu di navigazione a sinistra.
- Copia e salva l'URL dell'endpoint Blob service.
- Esempio:
https://azureresourcelogs.blob.core.windows.net/
- Esempio:
Configura le impostazioni di diagnostica delle risorse di Azure
I log delle risorse Azure non vengono raccolti per impostazione predefinita. Devi creare un'impostazione di diagnostica per ogni risorsa Azure per indirizzare i log all'account di archiviazione.
- Nel portale Azure, vai alla risorsa Azure che vuoi monitorare.
- Nel menu di navigazione a sinistra, seleziona Impostazioni di diagnostica in Monitoraggio.
- Fai clic su + Aggiungi impostazione di diagnostica.
- Fornisci i seguenti dettagli di configurazione:
- Nome impostazione diagnostica: inserisci un nome descrittivo (ad esempio
export-to-secops). - Nella sezione Log, seleziona le categorie di log che vuoi raccogliere. Le categorie disponibili variano in base al tipo di risorsa. Le categorie più comuni includono:
- Amministrativo (per i log delle attività)
- Sicurezza (per i log delle attività)
- AuditEvent (per Key Vault)
- ApplicationGatewayAccessLog (per Application Gateway)
- ApplicationGatewayFirewallLog (per Application Gateway)
- NetworkSecurityGroupEvent (per i gruppi di sicurezza di rete)
- Nella sezione Metriche (facoltativa), seleziona AllMetrics per inviare le metriche della piattaforma all'account di archiviazione.
- Nella sezione Dettagli destinazione, seleziona la casella di controllo Archivia in un account di archiviazione.
- Abbonamento: seleziona l'abbonamento contenente il tuo account di archiviazione.
- Account di archiviazione: seleziona l'account di archiviazione che hai creato (ad esempio,
azureresourcelogs).
- Nome impostazione diagnostica: inserisci un nome descrittivo (ad esempio
- Fai clic su Salva.
Dopo la configurazione, i log vengono esportati automaticamente nei container nell'account di archiviazione. Azure crea container utilizzando il pattern di denominazione insights-logs-<log-category-name>. Ad esempio:
- Log di controllo di Key Vault:
insights-logs-auditevent - Log di accesso di Application Gateway:
insights-logs-applicationgatewayaccesslog - Log del firewall di Application Gateway:
insights-logs-applicationgatewayfirewalllog Eventi del gruppo di sicurezza di rete:
insights-logs-networksecuritygroupevent
Configura un feed in Google SecOps per importare i log delle risorse Azure
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Azure Resource Logs - Key Vault). - Seleziona Microsoft Azure Blob Storage V2 come Tipo di origine.
- Seleziona Risorsa Microsoft Azure come Tipo di log.
- Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
- URI di Azure: inserisci l'URL dell'endpoint del servizio BLOB con il percorso del container:
https://azureresourcelogs.blob.core.windows.net/insights-logs-auditevent/- Sostituisci quanto segue:
azureresourcelogs: il nome del tuo account di archiviazione Azure.insights-logs-auditevent: il nome del contenitore blob in cui sono archiviati i log (varia in base al tipo di risorsa e alla categoria di log).
Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:
- Mai: non elimina mai i file dopo i trasferimenti.
- Elimina file trasferiti: elimina i file dopo il trasferimento riuscito.
- Elimina file trasferiti e directory vuote: elimina i file e le directory vuote dopo il trasferimento riuscito.
Età massima del file: includi i file modificati nell'ultimo numero di giorni. Il valore predefinito è 180 giorni.
Chiave condivisa: inserisci il valore della chiave condivisa (chiave di accesso) acquisita dall'account di archiviazione nel passaggio 3.
Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Configura il firewall di Azure Storage (se abilitato)
Se il tuo account di archiviazione Azure utilizza un firewall, devi aggiungere gli intervalli IP di Google SecOps.
- Nel portale Azure, vai al tuo account di archiviazione (ad esempio,
azureresourcelogs). - Seleziona Networking in Sicurezza e networking.
- In Firewall e reti virtuali, seleziona Attivato da reti virtuali e indirizzi IP selezionati.
- Nella sezione Firewall, in Intervallo di indirizzi, fai clic su + Aggiungi intervallo IP.
Aggiungi ogni intervallo IP di Google SecOps in notazione CIDR.
- Per ottenere gli intervalli IP attuali, scegli una delle seguenti opzioni:
- Consulta la documentazione relativa alla lista consentita IP
- Recuperali in modo programmatico utilizzando l'API Feed Management.
- Per ottenere gli intervalli IP attuali, scegli una delle seguenti opzioni:
Fai clic su Salva.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| vari campi*_label aggiuntivi | additional.fields | Uniti da vari campi*_labelcampo aggiuntivi |
| authenticationMethod | extensions.auth.mechanism | Impostato su USERNAME_PASSWORD se authenticationMethod è Password |
| category, event_type | extensions.auth.type | Imposta su MACHINE per SQLSecurityAuditEvents; SSO per categorie specifiche; AUTHTYPE_UNSPECIFIED per le altre |
| properties.partialipaddress | intermediary.ip | Valore ottenuto da properties.partialipaddress se non è vuoto |
| properties.event_time, stage_time, risk_time, last_update_time, time | metadata.collected_timestamp | Convertito utilizzando ISO8601 da properties.event_time, o da stage_time, o da risk_time, o da last_update_time, o da time con grok di riserva |
| properties.message, properties.activity, properties.log.stage | metadata.description | Valore di properties.message se non è vuoto; altrimenti da properties.activity; altrimenti da properties.log.stage |
| event_type | metadata.event_type | Valore di event_type se non è vuoto, altrimenti GENERIC_EVENT |
| category, record.category | metadata.product_event_type | Valore copiato direttamente dalla categoria o da record.category |
| properties.event_id, properties.log.auditID | metadata.product_log_id | Valore di properties.event_id se non è vuoto; altrimenti, di properties.log.auditID |
| properties.log.apiVersion | metadata.product_version | Valore copiato direttamente da properties.log.apiVersion |
| protocollo | network.application_protocol | Valore copiato direttamente dal protocollo |
| properties.log.verb | network.dhcp.opcode | Valore copiato direttamente da properties.log.verb (maiuscolo) |
| properties.CsMethod, record.properties.CsMethod | network.http.method | Valore copiato direttamente da properties.CsMethod o record.properties.CsMethod |
| user_agent | network.http.parsed_user_agent | Convertito da user_agent |
| properties.Referer, uri | network.http.referral_url | Valore ottenuto da properties.Referer se non è vuoto; altrimenti da uri |
| properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, responseStatus.code | network.http.response_code | Convertito in numero intero da properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode o responseStatus.code |
| user_agent | network.http.user_agent | Valore copiato direttamente da user_agent |
| properties.ScBytes, record.properties.ScBytes, properties.responseLength | network.received_bytes | Convertito in uinteger da properties.ScBytes, record.properties.ScBytes o properties.responseLength |
| properties.CsBytes, record.properties.CsBytes, properties.requestLength | network.sent_bytes | Convertito in uinteger da properties.CsBytes, record.properties.CsBytes o properties.requestLength |
| properties.session_id | network.session_id | Valore copiato direttamente da properties.session_id (convertito in stringa) |
| properties.tlsVersion | network.tls.version | Valore copiato direttamente da properties.tlsVersion |
| domain_name_value | principal.administrative_domain | Valore copiato direttamente da domain_name_value |
| properties.clientAppUsed, target_application | principal.application | Valore ottenuto da properties.clientAppUsed se non è vuoto; altrimenti da target_application |
| prop_device_id | principal.asset.asset_id | Impostato su ID dispositivo: seguito da prop_device_id se non è null |
| hardware | principal.asset.hardware | Unito dall'hardware |
| properties.host_name, properties.CIp, record.properties.CIp, properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name, server_name | principal.asset.hostname | Valore di properties.host_name se non è vuoto; altrimenti da properties.CIp (grok IP), record.properties.CIp (grok IP), properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name o server_name |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.asset.ip | Valore di src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress o ip |
| properties.host_name, properties.CsHost, record.properties.CsHost | principal.hostname | Valore di properties.host_name se non è vuoto; altrimenti da properties.CsHost o record.properties.CsHost |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.ip | Valore di src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress o ip |
| properties.location.city, provisioning_steps_city | principal.location.city | Valore ottenuto da properties.location.city se non è vuoto; altrimenti da provisioning_steps_city |
| properties.location.countryOrRegion, provisioning_steps_country, location, Region | principal.location.country_or_region | Valore di properties.location.countryOrRegion se non è vuoto; altrimenti da provisioning_steps_country; altrimenti da location; altrimenti da Region |
| properties.location.geoCoordinates.latitude | principal.location.region_latitude | Valore copiato direttamente da properties.location.geoCoordinates.latitude |
| properties.location.geoCoordinates.longitude | principal.location.region_longitude | Valore copiato direttamente da properties.location.geoCoordinates.longitude |
| properties.location.state | principal.location.state | Valore copiato direttamente da properties.location.state |
| prop_os | principal.platform | Imposta WINDOWS se prop_os corrisponde a (?i)Win; LINUX se (?i)Lin; MAC se (?i)Mac |
| properties.deviceDetail.operatingSystem | principal.platform_version | Valore copiato direttamente da properties.deviceDetail.operatingSystem |
| src_port | principal.port | Convertito in numero intero da src_port |
| is_compliant_label, is_managed_label, serice_type_label, serice_credential_label | principal.resource.attribute.labels | Unito da is_compliant_label, is_managed_label, serice_type_label, serice_credential_label |
| properties.sourceSystem.Name | principal.resource.name | Valore copiato direttamente da properties.sourceSystem.Name |
| properties.sourceSystem.Id | principal.resource.product_object_id | Valore copiato direttamente da properties.sourceSystem.Id |
| properties.server_principal_name, source_user_principal_name, user_principal_name, local_account_username_value | principal.user.email_addresses | Unito da properties.server_principal_name (se corrisponde all'email), source_user_principal_name (se corrisponde all'email), user_principal_name (se corrisponde all'email) o local_account_username_value (se corrisponde all'email) |
| properties.sequence_group_id, grpname, properties.log.user.groups | principal.user.group_identifiers | Uniti da properties.sequence_group_id, grpname o properties.log.user.groups |
| properties.sourceIdentity.details.id, properties.userId, details_id_not_present | principal.user.product_object_id | Valore da properties.sourceIdentity.details.id se non è vuoto; altrimenti da properties.userId; altrimenti da details_id_not_present |
| properties.ServicePrincipalDisplayName, properties.servicePrincipalName, properties.sourceIdentity.details.DisplayName, properties.userDisplayName, record.properties.log.user.username | principal.user.user_display_name | Valore di properties.ServicePrincipalDisplayName se non è vuoto; altrimenti da properties.servicePrincipalName; altrimenti da properties.sourceIdentity.details.DisplayName; altrimenti da properties.userDisplayName; altrimenti da record.properties.log.user.username |
| properties.servicePrincipalId, user_userPrincipalName, source_user_principal_name, details_user_principal_name, user_principal_name, properties.accountName, record.properties.log.user.uid | principal.user.userid | Valore di properties.servicePrincipalId se non è vuoto; altrimenti da user_userPrincipalName; altrimenti da source_user_principal_name; altrimenti da details_user_principal_name; altrimenti da user_principal_name; altrimenti da properties.accountName; altrimenti da record.properties.log.user.uid |
| security_action, succeeded, statusText, resultType | security_result.action | Impostato su ALLOW se security_action è allow; altrimenti ALLOW se succeeded è true o statusText è Success o resultType è success; altrimenti BLOCK se succeeded è false o statusText è failed o resultType è failed |
| properties.action_name | security_result.action_details | Valore copiato direttamente da properties.action_name |
| status_label | security_result.about.resource.attribute.labels | Unito da status_label |
| properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields | security_result.detection_fields | Uniti da properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields |
| resultDescription, sec_result.description, properties.queryexecutionstatus | security_result.description | Valore di resultDescription (gsub newlines); altrimenti da sec_result.description; altrimenti da properties.queryexecutionstatus |
| policy_id_value | security_result.rule_id | Valore copiato direttamente da policy_id_value |
| properties.Result, statusText, properties.queryexecutionstatus | security_result.summary | Valore ottenuto da properties.Result se non è vuoto; altrimenti da statusText; altrimenti da properties.queryexecutionstatus |
| target_application | target.application | Valore di target_application |
| properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, record.properties.server_instance_name | target.asset.hostname | Valore di properties.ComputerName, record.properties.ComputerName, properties.server_instance_name o record.properties.server_instance_name |
| (hardcoded) | target.cloud.environment | Imposta su "MICROSOFT_AZURE" |
| properties.SPort, record.properties.SPort | target.port | Convertito in numero intero da properties.SPort o record.properties.SPort |
| properties.querytext.query | target.process.command_line | Valore copiato direttamente da properties.querytext.query |
| properties.processId | target.process.pid | Convertito in stringa da properties.processId |
| subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label | target.resource.attribute.labels | Unito da subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label |
| properties_databasename, properties.resourceDisplayName, record.properties.databasename, record.properties.databaseName | target.resource.name | Valore di properties_databasename se non è vuoto; altrimenti di properties.resourceDisplayName; altrimenti di record.properties.databasename; altrimenti di record.properties.databaseName |
| resourceId, properties.resourceId | target.resource.product_object_id | Valore ottenuto da resourceId se non è vuoto; altrimenti da properties.resourceId |
| properties_collectionname, properties.resourceDisplayName, record.properties.collectionname, record.properties.collectionName, properties.log.objectRef.resource | target.resource.resource_subtype | Valore di properties_collectionname se non è vuoto; altrimenti da properties.resourceDisplayName; altrimenti da record.properties.collectionname; altrimenti da record.properties.collectionName; altrimenti da properties.log.objectRef.resource |
| resourceId, message | target.resource.resource_type | Imposta su DATABASE se resourceId corrisponde al pattern; altrimenti CLUSTER se il messaggio corrisponde a MANAGEDCLUSTERS; altrimenti VIRTUAL_MACHINE se MANAGEDINSTANCES; altrimenti DATABASE se DATABASEACCOUNTS |
| resourceType | target.resource.type | Valore copiato direttamente da resourceType |
| properties.CsUriStem, properties.log.requestURI, value (from additionalInfo) | target.url | Valore ottenuto da properties.CsUriStem se non è vuoto; altrimenti da properties.log.requestURI; altrimenti dal valore (da additionalInfo) |
| user_principal_name | target.user.email_addresses | Unito da user_principal_name (se corrisponde all'email) |
| properties.userId | target.user.product_object_id | Valore copiato direttamente da properties.userId |
| properties.userDisplayName | target.user.user_display_name | Valore copiato direttamente da properties.userDisplayName |
| user_principal_name, properties.userPrincipalName | target.user.userid | Valore di user_principal_name se non è vuoto; altrimenti da properties.userPrincipalName |
| (hardcoded) | metadata.product_name | Imposta su "Log delle risorse Azure" |
| (hardcoded) | metadata.vendor_name | Impostato su "Microsoft" |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.