Microsoft Azure-Ressourcenprotokolle erfassen
In diesem Dokument wird beschrieben, wie Sie Microsoft Azure-Ressourcenlogs erfassen, indem Sie einen Google Security Operations-Feed mit Microsoft Azure Blob Storage V2 einrichten.
Azure-Ressourcenprotokolle geben Aufschluss über Vorgänge, die in Azure-Ressourcen ausgeführt werden. Diese Logs enthalten detaillierte Informationen zu Ressourcenoperationen, zum Status und zu Leistungsmesswerten. Die Inhalte variieren je nach Ressourcentyp und umfassen Daten wie Authentifizierungsereignisse, Konfigurationsänderungen, Zugriffsversuche und Betriebsstatistiken.
Hinweise
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz
Privilegierter Zugriff auf das Microsoft Azure-Portal mit Berechtigungen für Folgendes:
- Speicherkonten erstellen
- Diagnoseeinstellungen für Azure-Ressourcen konfigurieren
- Zugriffsschlüssel verwalten
Azure Storage-Konto konfigurieren
Speicherkonto erstellen
- Suchen Sie im Azure-Portal nach Speicherkonten.
- Klicken Sie auf + Erstellen.
Geben Sie die folgenden Konfigurationsdetails an:
Einstellung Wert Abo Azure-Abo auswählen Ressourcengruppe Vorhandene auswählen oder neue erstellen Name des Speicherkontos Geben Sie einen eindeutigen Namen ein, z. B. azureresourcelogs.Region Wählen Sie die Region aus (z. B. East US).Leistung Standard (empfohlen) Redundanz GRS (georedundanter Speicher) oder LRS (lokal redundanter Speicher) Klicken Sie auf Überprüfen + Erstellen.
Sehen Sie sich die Übersicht des Kontos an und klicken Sie auf Erstellen.
Warten Sie, bis die Bereitstellung abgeschlossen ist.
Anmeldedaten für das Speicherkonto abrufen
- Rufen Sie das soeben erstellte Storage-Konto auf.
- Wählen Sie in der linken Navigationsleiste unter Security + networking (Sicherheit + Netzwerk) die Option Access keys (Zugriffsschlüssel) aus.
- Klicken Sie auf Schlüssel anzeigen.
Kopieren und speichern Sie die folgenden Informationen zur späteren Verwendung:
- Name des Speicherkontos:
azureresourcelogs - Schlüssel 1 oder Schlüssel 2: Der gemeinsame Zugriffsschlüssel (ein 512-Bit-Zufallsstring in Base64-Codierung)
- Name des Speicherkontos:
Blob-Dienstendpunkt abrufen
- Wählen Sie im selben Speicherkonto in der linken Navigationsleiste Endpunkte aus.
- Kopieren und speichern Sie die Endpunkt-URL des Blob-Diensts.
- Beispiel:
https://azureresourcelogs.blob.core.windows.net/
- Beispiel:
Azure-Ressourcendiagnoseeinstellungen konfigurieren
Azure-Ressourcenprotokolle werden nicht standardmäßig erfasst. Sie müssen für jede Azure-Ressource eine Diagnoseeinstellung erstellen, um Protokolle an das Speicherkonto weiterzuleiten.
- Rufen Sie im Azure-Portal die Azure-Ressource auf, die Sie überwachen möchten.
- Wählen Sie in der linken Navigationsleiste unter Monitoring die Option Diagnoseeinstellungen aus.
- Klicken Sie auf + Diagnoseeinstellung hinzufügen.
- Geben Sie die folgenden Konfigurationsdetails an:
- Name der Diagnoseeinstellung: Geben Sie einen aussagekräftigen Namen ein, z. B.
export-to-secops. - Wählen Sie im Bereich Logs die Logkategorien aus, die Sie erfassen möchten. Die verfügbaren Kategorien variieren je nach Ressourcentyp. Häufige Kategorien sind:
- Administrativ (für Aktivitätslogs)
- Sicherheit (für Aktivitätsprotokolle)
- AuditEvent (für Key Vault)
- ApplicationGatewayAccessLog (für Application Gateway)
- ApplicationGatewayFirewallLog (für Application Gateway)
- NetworkSecurityGroupEvent (für Network Security Groups)
- Wählen Sie im Bereich Messwerte (optional) die Option AllMetrics aus, um Plattformmesswerte an das Speicherkonto zu senden.
- Klicken Sie im Abschnitt Zieldetails das Kästchen In einem Speicherkonto archivieren an.
- Abo: Wählen Sie das Abo aus, das Ihr Speicherkonto enthält.
- Speicherkonto: Wählen Sie das von Ihnen erstellte Speicherkonto aus (z. B.
azureresourcelogs).
- Name der Diagnoseeinstellung: Geben Sie einen aussagekräftigen Namen ein, z. B.
- Klicken Sie auf Speichern.
Nach der Konfiguration werden Logs automatisch in Container im Speicherkonto exportiert. Azure erstellt Container mit dem Namensmuster insights-logs-<log-category-name>. Beispiel:
- Audit-Logs für Key Vault:
insights-logs-auditevent - Application Gateway-Zugriffslogs:
insights-logs-applicationgatewayaccesslog - Application Gateway-Firewall-Logs:
insights-logs-applicationgatewayfirewalllog Ereignisse zu Netzwerksicherheitsgruppen:
insights-logs-networksecuritygroupevent
Feed in Google SecOps konfigurieren, um Azure-Ressourcenprotokolle aufzunehmen
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf Neuen Feed hinzufügen.
- Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
Azure Resource Logs - Key Vault. - Wählen Sie Microsoft Azure Blob Storage V2 als Quelltyp aus.
- Wählen Sie Microsoft Azure-Ressource als Logtyp aus.
- Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
- Azure-URI: Geben Sie die Blob Service-Endpunkt-URL mit dem Containerpfad ein:
https://azureresourcelogs.blob.core.windows.net/insights-logs-auditevent/- Dabei gilt:
azureresourcelogs: Name Ihres Azure-Speicherkontos.insights-logs-auditevent: Der Name des Blob-Containers, in dem Logs gespeichert werden (variiert je nach Ressourcentyp und Logkategorie).
Option zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus:
- Nie: Löscht nach Übertragungen niemals Dateien.
- Übertragene Dateien löschen: Dateien werden nach der erfolgreichen Übertragung gelöscht.
- Übertragene Dateien und leere Verzeichnisse löschen: Löscht Dateien und leere Verzeichnisse nach der erfolgreichen Übertragung.
Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.
Shared Key (Gemeinsamer Schlüssel): Geben Sie den Wert des gemeinsamen Schlüssels (Zugriffsschlüssel) ein, den Sie in Schritt 3 aus dem Speicherkonto kopiert haben.
Asset-Namespace: Der Asset-Namespace.
Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
Azure Storage-Firewall konfigurieren (falls aktiviert)
Wenn für Ihr Azure-Speicherkonto eine Firewall verwendet wird, müssen Sie die IP-Bereiche von Google SecOps hinzufügen.
- Rufen Sie im Azure-Portal Ihr Storage-Konto auf (z. B.
azureresourcelogs). - Wählen Sie unter Sicherheit + Netzwerk die Option Netzwerk aus.
- Wählen Sie unter Firewalls und virtuelle Netzwerke die Option Aktiviert für ausgewählte virtuelle Netzwerke und IP-Adressen aus.
- Klicken Sie im Bereich Firewall unter Adressbereich auf + IP-Bereich hinzufügen.
Fügen Sie jeden Google SecOps-IP-Bereich in CIDR-Notation hinzu.
- Wählen Sie eine der folgenden Optionen aus, um die aktuellen IP-Bereiche abzurufen:
- Dokumentation zur IP-Zulassungsliste
- Sie können sie programmatisch mit der Feed Management API abrufen.
- Wählen Sie eine der folgenden Optionen aus, um die aktuellen IP-Bereiche abzurufen:
Klicken Sie auf Speichern.
UDM-Zuordnungstabelle
| Logfeld | UDM-Zuordnung | Logik |
|---|---|---|
| verschiedene zusätzliche Felder für Feld*_Labels | additional.fields | Zusammengeführt aus verschiedenen zusätzlichen Feldern vom Typ „field*_label“ |
| authenticationMethod | extensions.auth.mechanism | Auf USERNAME_PASSWORD festlegen, wenn „authenticationMethod“ auf „Password“ gesetzt ist. |
| category, event_type | extensions.auth.type | Auf MACHINE für SQLSecurityAuditEvents festgelegt; SSO für bestimmte Kategorien; AUTHTYPE_UNSPECIFIED für andere |
| properties.partialipaddress | intermediary.ip | Wert aus „properties.partialipaddress“, falls nicht leer |
| properties.event_time, stage_time, risk_time, last_update_time, time | metadata.collected_timestamp | Konvertiert mit ISO8601 aus „properties.event_time“, „stage_time“, „risk_time“, „last_update_time“ oder „time“ mit Fallback-Grok |
| properties.message, properties.activity, properties.log.stage | metadata.description | Wert aus „properties.message“, falls nicht leer, andernfalls aus „properties.activity“, andernfalls aus „properties.log.stage“ |
| event_type | metadata.event_type | Wert aus „event_type“, falls nicht leer, andernfalls „GENERIC_EVENT“ |
| category, record.category | metadata.product_event_type | Wert direkt aus „category“ oder „record.category“ kopiert |
| properties.event_id, properties.log.auditID | metadata.product_log_id | Wert aus „properties.event_id“, falls nicht leer, andernfalls aus „properties.log.auditID“ |
| properties.log.apiVersion | metadata.product_version | Wert direkt aus properties.log.apiVersion kopiert |
| Protokoll | network.application_protocol | Wert direkt aus dem Protokoll kopiert |
| properties.log.verb | network.dhcp.opcode | Wert direkt aus properties.log.verb (Großbuchstaben) kopiert |
| properties.CsMethod, record.properties.CsMethod | network.http.method | Der Wert wurde direkt aus „properties.CsMethod“ oder „record.properties.CsMethod“ kopiert. |
| user_agent | network.http.parsed_user_agent | Aus user_agent konvertiert |
| properties.Referer, uri | network.http.referral_url | Wert aus „properties.Referer“, falls nicht leer, andernfalls aus „uri“ |
| properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, responseStatus.code | network.http.response_code | In eine Ganzzahl konvertiert aus „properties.ScStatus“, „record.properties.ScStatus“, „properties.statusCode“, „record.properties.statusCode“ oder „responseStatus.code“ |
| user_agent | network.http.user_agent | Wert direkt aus user_agent kopiert |
| properties.ScBytes, record.properties.ScBytes, properties.responseLength | network.received_bytes | Konvertiert aus properties.ScBytes, record.properties.ScBytes oder properties.responseLength in „uinteger“ |
| properties.CsBytes, record.properties.CsBytes, properties.requestLength | network.sent_bytes | Konvertiert in „uinteger“ aus „properties.CsBytes“, „record.properties.CsBytes“ oder „properties.requestLength“ |
| properties.session_id | network.session_id | Wert direkt aus „properties.session_id“ kopiert (in String konvertiert) |
| properties.tlsVersion | network.tls.version | Wert direkt aus „properties.tlsVersion“ kopiert |
| domain_name_value | principal.administrative_domain | Wert direkt aus „domain_name_value“ kopiert |
| properties.clientAppUsed, target_application | principal.application | Wert aus „properties.clientAppUsed“, falls nicht leer, andernfalls aus „target_application“ |
| prop_device_id | principal.asset.asset_id | Auf „Geräte-ID:“ gefolgt von „prop_device_id“ festlegen, wenn nicht null |
| Hardware | principal.asset.hardware | Von Hardware zusammengeführt |
| 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 | Wert aus „properties.host_name“, falls nicht leer, andernfalls aus „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“ oder „server_name“ |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.asset.ip | Wert aus src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress oder ip |
| properties.host_name, properties.CsHost, record.properties.CsHost | principal.hostname | Wert aus properties.host_name, falls nicht leer; andernfalls aus properties.CsHost oder record.properties.CsHost |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.ip | Wert aus src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress oder ip |
| properties.location.city, provisioning_steps_city | principal.location.city | Wert aus „properties.location.city“, falls nicht leer, andernfalls aus „provisioning_steps_city“ |
| properties.location.countryOrRegion, provisioning_steps_country, location, Region | principal.location.country_or_region | Wert aus properties.location.countryOrRegion, falls nicht leer; andernfalls aus provisioning_steps_country; andernfalls aus location; andernfalls aus Region |
| properties.location.geoCoordinates.latitude | principal.location.region_latitude | Wert direkt aus properties.location.geoCoordinates.latitude kopiert |
| properties.location.geoCoordinates.longitude | principal.location.region_longitude | Wert direkt aus „properties.location.geoCoordinates.longitude“ kopiert |
| properties.location.state | principal.location.state | Wert direkt aus „properties.location.state“ kopiert |
| prop_os | principal.platform | Auf WINDOWS setzen, wenn prop_os mit (?i)Win übereinstimmt; auf LINUX, wenn (?i)Lin; auf MAC, wenn (?i)Mac |
| properties.deviceDetail.operatingSystem | principal.platform_version | Wert direkt aus properties.deviceDetail.operatingSystem kopiert |
| src_port | principal.port | Von src_port in Ganzzahl konvertiert |
| is_compliant_label, is_managed_label, serice_type_label, serice_credential_label | principal.resource.attribute.labels | Zusammengeführt aus „is_compliant_label“, „is_managed_label“, „serice_type_label“ und „serice_credential_label“ |
| properties.sourceSystem.Name | principal.resource.name | Wert direkt aus properties.sourceSystem.Name kopiert |
| properties.sourceSystem.Id | principal.resource.product_object_id | Wert direkt aus properties.sourceSystem.Id kopiert |
| properties.server_principal_name, source_user_principal_name, user_principal_name, local_account_username_value | principal.user.email_addresses | Zusammengeführt aus properties.server_principal_name (wenn mit E-Mail-Adresse übereinstimmt), source_user_principal_name (wenn mit E-Mail-Adresse übereinstimmt), user_principal_name (wenn mit E-Mail-Adresse übereinstimmt) oder local_account_username_value (wenn mit E-Mail-Adresse übereinstimmt) |
| properties.sequence_group_id, grpname, properties.log.user.groups | principal.user.group_identifiers | Zusammengeführt aus „properties.sequence_group_id“, „grpname“ oder „properties.log.user.groups“ |
| properties.sourceIdentity.details.id, properties.userId, details_id_not_present | principal.user.product_object_id | Wert aus properties.sourceIdentity.details.id, falls nicht leer; andernfalls aus properties.userId; andernfalls aus details_id_not_present |
| properties.ServicePrincipalDisplayName, properties.servicePrincipalName, properties.sourceIdentity.details.DisplayName, properties.userDisplayName, record.properties.log.user.username | principal.user.user_display_name | Wert aus „properties.ServicePrincipalDisplayName“, falls nicht leer; andernfalls aus „properties.servicePrincipalName“; andernfalls aus „properties.sourceIdentity.details.DisplayName“; andernfalls aus „properties.userDisplayName“; andernfalls aus „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 | Wert aus „properties.servicePrincipalId“, falls nicht leer; andernfalls aus „user_userPrincipalName“; andernfalls aus „source_user_principal_name“; andernfalls aus „details_user_principal_name“; andernfalls aus „user_principal_name“; andernfalls aus „properties.accountName“; andernfalls aus „record.properties.log.user.uid“ |
| security_action, succeeded, statusText, resultType | security_result.action | Auf ALLOW setzen, wenn security_action „allow“ ist; andernfalls ALLOW, wenn „succeeded“ „true“ oder „statusText“ „Success“ oder „resultType“ „success“ ist; andernfalls BLOCK, wenn „succeeded“ „false“ oder „statusText“ „failed“ oder „resultType“ „failed“ ist. |
| properties.action_name | security_result.action_details | Wert direkt aus „properties.action_name“ kopiert |
| status_label | security_result.about.resource.attribute.labels | Zusammengeführt aus „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 | Zusammengeführt aus 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 | Wert aus „resultDescription“ (Zeilenumbrüche ersetzen); andernfalls aus „sec_result.description“; andernfalls aus „properties.queryexecutionstatus“ |
| policy_id_value | security_result.rule_id | Wert direkt aus policy_id_value kopiert |
| properties.Result, statusText, properties.queryexecutionstatus | security_result.summary | Wert aus „properties.Result“, falls nicht leer, andernfalls aus „statusText“, andernfalls aus „properties.queryexecutionstatus“ |
| target_application | target.application | Wert aus „target_application“ |
| properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, record.properties.server_instance_name | target.asset.hostname | Wert aus „properties.ComputerName“, „record.properties.ComputerName“, „properties.server_instance_name“ oder „record.properties.server_instance_name“ |
| (hartcodiert) | target.cloud.environment | Auf „MICROSOFT_AZURE“ festlegen |
| properties.SPort, record.properties.SPort | target.port | Konvertiert in eine Ganzzahl aus properties.SPort oder record.properties.SPort |
| properties.querytext.query | target.process.command_line | Wert direkt aus properties.querytext.query kopiert |
| properties.processId | target.process.pid | Aus „properties.processId“ in String konvertiert |
| 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 | Zusammengeführt aus 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 | Wert aus „properties_databasename“, falls nicht leer; andernfalls aus „properties.resourceDisplayName“; andernfalls aus „record.properties.databasename“; andernfalls aus „record.properties.databaseName“ |
| resourceId, properties.resourceId | target.resource.product_object_id | Wert aus „resourceId“, falls nicht leer, andernfalls aus „properties.resourceId“ |
| properties_collectionname, properties.resourceDisplayName, record.properties.collectionname, record.properties.collectionName, properties.log.objectRef.resource | target.resource.resource_subtype | Wert aus „properties_collectionname“, falls nicht leer; andernfalls aus „properties.resourceDisplayName“; andernfalls aus „record.properties.collectionname“; andernfalls aus „record.properties.collectionName“; andernfalls aus „properties.log.objectRef.resource“ |
| resourceId, message | target.resource.resource_type | Auf DATABASE festlegen, wenn resourceId dem Muster entspricht; andernfalls CLUSTER, wenn die Nachricht mit MANAGEDCLUSTERS übereinstimmt; andernfalls VIRTUAL_MACHINE, wenn MANAGEDINSTANCES; andernfalls DATABASE, wenn DATABASEACCOUNTS |
| resourceType | target.resource.type | Wert direkt aus „resourceType“ kopiert |
| properties.CsUriStem, properties.log.requestURI, value (aus additionalInfo) | target.url | Wert aus „properties.CsUriStem“, falls nicht leer, andernfalls aus „properties.log.requestURI“, andernfalls aus „value“ (aus „additionalInfo“) |
| user_principal_name | target.user.email_addresses | Zusammengeführt aus „user_principal_name“ (wenn mit E-Mail-Adresse übereinstimmt) |
| properties.userId | target.user.product_object_id | Wert direkt aus properties.userId kopiert |
| properties.userDisplayName | target.user.user_display_name | Wert direkt aus properties.userDisplayName kopiert |
| user_principal_name, properties.userPrincipalName | target.user.userid | Wert aus user_principal_name, falls nicht leer; andernfalls aus properties.userPrincipalName |
| (hartcodiert) | metadata.product_name | Auf „Azure Resource Logs“ festgelegt |
| (hartcodiert) | metadata.vendor_name | Auf „Microsoft“ festgelegt |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten