Azure DevOps-Überwachungsprotokolle erfassen
Übersicht
Dieser Parser verarbeitet Azure DevOps-Audit-Logs im JSON-Format. Sie extrahiert Felder aus verschachtelten und JSON-Strukturen der obersten Ebene und ordnet sie dem UDM zu. Durch bedingte Logik, die auf bestimmten Feldwerten basiert, werden Ereignisse kategorisiert und die Ausgabe mit relevanten Sicherheitsinformationen angereichert. Der Parser verarbeitet auch Nachrichten, die nicht im JSON-Format vorliegen. Dabei wird versucht, eine JSON-Nutzlast mithilfe von Grok-Mustern zu extrahieren.
Hinweise
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
- Google SecOps-Instanz
- Eine aktive Azure DevOps-Organisation
- Privilegierter Zugriff auf Azure DevOps-Organisation und Azure
Feeds einrichten
Es gibt zwei verschiedene Einstiegspunkte zum Einrichten von Feeds in der Google SecOps-Plattform:
- SIEM-Einstellungen > Feeds
- Content Hub> Content-Pakete
Feeds über die SIEM-Einstellungen > „Feeds“ einrichten
Informationen zum Konfigurieren mehrerer Feeds für verschiedene Logtypen in dieser Produktfamilie finden Sie unter Feeds nach Produkt konfigurieren.
So konfigurieren Sie einen einzelnen Feed:
- 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 Feed name (Feedname) einen Namen für den Feed ein, z. B. Azure Devops Logs (Azure DevOps-Protokolle).
- Wählen Sie Webhook als Quelltyp aus.
- Wählen Sie Azure DevOps Audit als Logtyp aus.
- Klicken Sie auf Weiter.
- Optional: Geben Sie Werte für die folgenden Eingabeparameter an:
- Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B.
\n
. - Asset-Namespace: Der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
- Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B.
- Klicken Sie auf Weiter.
- Prüfen Sie die Feedkonfiguration auf dem Bildschirm Finalize (Abschließen) und klicken Sie dann auf Submit (Senden).
- Klicken Sie auf Geheimen Schlüssel generieren, um einen geheimen Schlüssel zur Authentifizierung dieses Feeds zu generieren.
- Kopieren Sie den geheimen Schlüssel und speichern Sie ihn. Sie können diesen geheimen Schlüssel nicht noch einmal aufrufen. Bei Bedarf können Sie einen neuen geheimen Schlüssel generieren. Dadurch wird der vorherige geheime Schlüssel jedoch ungültig.
- Kopieren Sie auf dem Tab Details die Feed-Endpunkt-URL aus dem Feld Endpunktinformationen. Sie müssen diese Endpunkt-URL in Ihrer Clientanwendung angeben.
- Klicken Sie auf Fertig.
Feeds über den Content Hub einrichten
Geben Sie Werte für die folgenden Felder an:
- Trennzeichen für Aufteilung: Das Trennzeichen, das zum Trennen von Logzeilen verwendet wird, z. B.
\n
.
Erweiterte Optionen
- Feedname: Ein vorausgefüllter Wert, der den Feed identifiziert.
- Quelltyp: Methode, die zum Erfassen von Logs in Google SecOps verwendet wird.
- Asset-Namespace: Der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
- Klicken Sie auf Weiter.
- Prüfen Sie die Feedkonfiguration auf dem Bildschirm Finalize (Abschließen) und klicken Sie dann auf Submit (Senden).
- Klicken Sie auf Geheimen Schlüssel generieren, um einen geheimen Schlüssel zur Authentifizierung dieses Feeds zu generieren.
API-Schlüssel für den Webhook-Feed erstellen
Rufen Sie die Google Cloud Console > Anmeldedaten auf.
Klicken Sie auf Anmeldedaten erstellen und wählen Sie anschließend API-Schlüssel aus.
Schränken Sie den API-Schlüsselzugriff auf die Google Security Operations API ein.
Endpunkt-URL angeben
- Geben Sie in Ihrer Clientanwendung die HTTPS-Endpunkt-URL an, die im Webhook-Feed bereitgestellt wird.
Aktivieren Sie die Authentifizierung, indem Sie den API-Schlüssel und den geheimen Schlüssel als Teil des benutzerdefinierten Headers im folgenden Format angeben:
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET
Empfehlung: Geben Sie den API-Schlüssel als Header an, anstatt ihn in der URL anzugeben. Wenn Ihr Webhook-Client keine benutzerdefinierten Headern unterstützt, können Sie den API-Schlüssel und den geheimen Schlüssel mit Suchparametern im folgenden Format angeben:
ENDPOINT_URL?key=API_KEY&secret=SECRET
Ersetzen Sie Folgendes:
ENDPOINT_URL
: Die Feed-Endpunkt-URL.API_KEY
: Der API-Schlüssel für die Authentifizierung bei Google Security Operations.SECRET
: Der geheime Schlüssel, den Sie zur Authentifizierung des Feeds generiert haben.
Überwachungsfunktion in Azure DevOps konfigurieren
- Melden Sie sich in Ihrer Organisation (
https://dev.azure.com/{yourorganization}
) an. - Klicken Sie auf das Zahnradsymbol für Organisationseinstellungen.
- Wählen Sie unter Sicherheit die Option Richtlinien aus.
- Stellen Sie die Schaltfläche Audit-Ereignisse protokollieren auf EIN.
Event Grid-Thema in Azure konfigurieren
- Melden Sie sich im Azure-Portal an.
- Suchen Sie nach Event Grid und greifen Sie darauf zu.
- Suchen Sie unter Benutzerdefinierte Ereignisse nach Themen.
- Klicken Sie auf + Erstellen.
- Wählen Sie Ihr Abo und Ihre Ressourcengruppe aus. Geben Sie einen Namen an (z. B.
DevopsAuditLog
) und wählen Sie die Region aus. Klicken Sie auf Prüfen und erstellen. - Rufen Sie das neue Thema auf und kopieren Sie die Themenendpunkt-URL.
- Rufen Sie die Einstellungen > Zugriffsschlüssel auf und kopieren Sie Schlüssel 1.
Azure DevOps-Logstream für Event Grid konfigurieren
- Melden Sie sich in Ihrer Organisation (
https://dev.azure.com/{yourorganization}
) an. - Klicken Sie auf das Zahnradsymbol für Organisationseinstellungen.
- Wählen Sie Audit aus.
- Klicken Sie auf den Tab Streams und wählen Sie Neuer Stream > Event Grid aus.
- Geben Sie den Themenendpunkt und den Zugriffsschlüssel ein, die Sie unter Event Grid-Thema in Azure konfigurieren erstellt haben.
Webhook in Azure DevOps für Google SecOps konfigurieren
- Suchen Sie im Azure-Portal nach Event Grid und greifen Sie darauf zu.
- Wählen Sie das zuvor erstellte Thema aus.
- Rufen Sie Entitäten > Event-Abo auf.
- Klicken Sie auf + Event-Abo.
- Geben Sie einen aussagekräftigen Namen an, z. B. *
Google SecOps Integration
. - Wählen Sie Web-Hook aus und klicken Sie auf Endpunkt konfigurieren.
- Endpunkt konfigurieren:
- Subscriber endpoint (Abonnentenendpunkt): Geben Sie die Google SecOps API-Endpunkt-URL ein.
- Fügen Sie im Bereich HTTP-Header die folgenden Header hinzu:
- Überschrift 1:
- Key:
X-goog-api-key
- Wert: Der API-Schlüssel, den Sie im Abschnitt API-Schlüssel für den Webhook-Feed erstellen erstellt haben.
- Key:
- Überschrift 2:
- Key:
X-Webhook-Access-Key
- Wert: Der geheime Schlüssel, den Sie im Abschnitt Feed in Google SecOps konfigurieren, um die Azure DevOps-Logs aufzunehmen generiert haben.
- Key:
- Überschrift 1:
- Legen Sie den Content-Type-Header auf
application/json
fest.
- Klicken Sie auf Erstellen.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
ActivityId |
metadata.product_log_id |
Direkt aus dem Feld Id im Rohlog, wenn das Feld records nicht vorhanden ist, oder aus dem Feld ActivityId im Objekt data , wenn records vorhanden ist. |
ActionId |
metadata.product_event_type |
Direkt aus dem Feld ActionId im Objekt data zugeordnet. |
ActorCUID |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Actor CUID“ enthalten. |
ActorDisplayName |
principal.user.user_display_name |
Wird direkt aus dem Feld ActorDisplayName zugeordnet, wenn es nicht „Azure DevOps Service“ ist. Wenn es sich um „Azure DevOps Service“ handelt, wird es als Label zu principal.resource.attribute.labels hinzugefügt. |
ActorUPN |
principal.user.email_addresses |
Direkt aus dem Feld ActorUPN zugeordnet, wenn es einem E-Mail-Adressmuster entspricht. |
ActorUserId |
principal.user.userid |
Direkt aus dem Feld ActorUserId zugeordnet. |
Area |
target.application |
Wird verwendet, um das Feld target.application zu erstellen, indem dem Wert Area „DevOps “ vorangestellt wird. |
AuthenticationMechanism |
extensions.auth.auth_details , security_result.rule_id |
Gepasst, um Authentifizierungsdetails und die Regel-ID zu extrahieren. Die Authentifizierungsdetails werden extensions.auth.auth_details zugeordnet. Die extrahierte Regel-ID ist security_result.rule_id zugeordnet. |
CategoryDisplayName |
security_result.action_details |
Direkt security_result.action_details zugeordnet. |
City |
principal.location.city |
Direkt aus dem Feld City zugeordnet. |
Conditions |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Conditions“ hinzugefügt. |
Country |
principal.location.country_or_region |
Direkt aus dem Feld Country zugeordnet. |
Data.* |
Verschiedene | Felder im Objekt Data werden je nach Name und Kontext verschiedenen UDM-Feldern zugeordnet. Unten finden Sie konkrete Beispiele. |
Data.AccessLevel |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „AccessLevel“ hinzugefügt. |
Data.AgentId |
target.resource.product_object_id |
Wird target.resource.product_object_id zugeordnet, wenn PipelineId und AuthorizationId nicht vorhanden sind. |
Data.AgentName |
target.resource.name |
Wird target.resource.name zugeordnet, wenn PipelineName , NamespaceName und DisplayName nicht vorhanden sind. |
Data.AuthorizationId |
target.resource.product_object_id |
Wird target.resource.product_object_id zugeordnet, wenn PipelineId nicht vorhanden ist. |
Data.CallerProcedure |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „CallerProcedure“ hinzugefügt. |
Data.CheckSuiteId |
additional.fields |
Wird als zusätzliches Feld mit dem Schlüssel „CheckSuiteId“ hinzugefügt. |
Data.CheckSuiteStatus |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „CheckSuiteStatus“ hinzugefügt. |
Data.ConnectionId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „ConnectionId“ hinzugefügt. |
Data.ConnectionName |
additional.fields |
Wird als zusätzliches Feld mit dem Schlüssel „ConnectionName“ hinzugefügt. |
Data.ConnectionType |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „ConnectionType“ hinzugefügt. |
Data.DefinitionId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „DefinitionId“ hinzugefügt. |
Data.DeploymentResult |
additional.fields |
Wird als zusätzliches Feld mit dem Schlüssel „DeploymentResult“ hinzugefügt. |
Data.DisplayName |
target.resource.name |
Wird target.resource.name zugeordnet, wenn PipelineName und NamespaceName nicht vorhanden sind. |
Data.EndpointIdList |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „EndpointIdList“ hinzugefügt. |
Data.EnvironmentName |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „EnvironmentName“ hinzugefügt. |
Data.Filter.continuationToken |
target.resource.attribute.labels |
Wird als Label mit dem Schlüssel „continuation_token“ hinzugefügt. |
Data.Filter.endTime |
target.resource.attribute.labels |
Wird als Label mit dem Schlüssel „filter_end_time“ hinzugefügt. |
Data.Filter.startTime |
target.resource.attribute.labels |
Wird als Label mit dem Schlüssel „filter_start_time“ hinzugefügt. |
Data.FinishTime |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „FinishTime“ hinzugefügt. |
Data.GroupId |
target.group.product_object_id |
Wird direkt target.group.product_object_id zugeordnet, wenn Data.Updates.0.GroupId nicht vorhanden ist. |
Data.GroupName |
target.group.group_display_name |
Direkt target.group.group_display_name zugeordnet. |
Data.JobName |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „JobName“ hinzugefügt. |
Data.MemberId |
target.user.userid |
Wird direkt target.user.userid zugeordnet, wenn Data.Updates.0.MemberId nicht vorhanden ist. |
Data.MemberDisplayName |
target.user.user_display_name |
Direkt target.user.user_display_name zugeordnet. |
Data.NamespaceId |
target.resource.product_object_id |
Wird target.resource.product_object_id zugeordnet, wenn PipelineId , AuthorizationId und AgentId nicht vorhanden sind. |
Data.NamespaceName |
target.resource.name |
Wird target.resource.name zugeordnet, wenn PipelineName nicht vorhanden ist. |
Data.ownerDetails |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „OwnerDetails“ hinzugefügt. |
Data.OwnerId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „OwnerId“ hinzugefügt. |
Data.PipelineId |
target.resource.product_object_id |
Direkt target.resource.product_object_id zugeordnet. |
Data.PipelineName |
target.resource.name |
Direkt target.resource.name zugeordnet. |
Data.PipelineRevision |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „PipelineRevision“ hinzugefügt. |
Data.PipelineScope |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „PipelineScope“ hinzugefügt. |
Data.PlanType |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „PlanType“ hinzugefügt. |
Data.PreviousAccessLevel |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „PreviousAccessLevel“ hinzugefügt. |
Data.PublisherName |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „PublisherName“ hinzugefügt. |
Data.Reason |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Reason“ hinzugefügt. |
Data.ReleaseId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „ReleaseId“ hinzugefügt. |
Data.ReleaseName |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „ReleaseName“ hinzugefügt. |
Data.RequesterId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „RequesterId“ hinzugefügt. |
Data.RetentionLeaseId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „RetentionLeaseId“ hinzugefügt. |
Data.RetentionOwnerId |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „RetentionOwnerId“ hinzugefügt. |
Data.RunName |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „RunName“ hinzugefügt. |
Data.Scopes |
target.resource.attribute.labels |
Als Labels mit dem Schlüssel „Scope“ hinzugefügt. |
Data.StageName |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „StageName“ hinzugefügt. |
Data.StartTime |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „StartTime“ hinzugefügt. |
Data.TargetUser |
target.user.userid |
Direkt target.user.userid zugeordnet. |
Data.Timestamp |
metadata.event_timestamp |
Geprüft und metadata.event_timestamp zugeordnet. |
Data.TokenType |
target.resource.attribute.labels |
Wird als Label mit dem Schlüssel „TokenType“ hinzugefügt. |
Data.Updates.0.GroupId |
target.group.product_object_id |
Direkt target.group.product_object_id zugeordnet. |
Data.Updates.0.MemberId |
target.user.userid |
Direkt target.user.userid zugeordnet. |
Data.ValidFrom |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „ValidFrom“ hinzugefügt. |
Data.ValidTo |
target.resource.attribute.labels |
Als Label mit dem Schlüssel „ValidTo“ hinzugefügt. |
DewPoint |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „DewPoint“ hinzugefügt. |
Details |
metadata.description |
Direkt metadata.description zugeordnet. |
Humidity |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Humidity“ hinzugefügt. |
Icon |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Icon“ hinzugefügt. |
Id |
metadata.product_log_id |
Direkt metadata.product_log_id zugeordnet. |
IpAddress |
principal.ip |
Direkt principal.ip zugeordnet. |
MoonPhase |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „MoonPhase“ hinzugefügt. |
Moonrise |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Moonrise“ hinzugefügt. |
Moonset |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Moonset“ hinzugefügt. |
OperationName |
metadata.product_event_type |
Direkt metadata.product_event_type zugeordnet. |
Precipitation |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Precipitation“ (Niederschlag) hinzugefügt. |
Pressure |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Pressure“ hinzugefügt. |
ProjectId |
target.resource_ancestors.product_object_id |
Wird verwendet, um das Feld product_object_id in target.resource_ancestors auszufüllen, wenn der übergeordnete Knoten vom Typ CLOUD_PROJECT ist. |
ProjectName |
target.resource_ancestors.name , target.resource.attribute.labels |
Wird verwendet, um das Feld name in target.resource_ancestors auszufüllen, wenn der übergeordnete Knoten vom Typ CLOUD_PROJECT ist. Wird auch als Label für target.resource.attribute.labels mit dem Schlüssel „ProjectName“ hinzugefügt. |
RoleLocation |
target.location.name |
Direkt target.location.name zugeordnet. |
ScopeDisplayName |
target.resource_ancestors.name |
Wird verwendet, um das Feld name in target.resource_ancestors auszufüllen, wenn der übergeordnete Knoten vom Typ CLOUD_ORGANIZATION ist. |
ScopeId |
target.resource_ancestors.product_object_id |
Wird verwendet, um das Feld product_object_id in target.resource_ancestors auszufüllen, wenn der übergeordnete Knoten vom Typ CLOUD_ORGANIZATION ist. |
ScopeType |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „ScopeType“ hinzugefügt. |
Sunrise |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Sunrise“ hinzugefügt. |
Sunset |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Sunset“ hinzugefügt. |
Temperature |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Temperature“ hinzugefügt. |
TenantId |
metadata.product_deployment_id , additional.fields |
Direkt metadata.product_deployment_id zugeordnet. Wird auch als zusätzliches Feld mit dem Schlüssel „TenantId“ hinzugefügt. |
TimeGenerated |
metadata.event_timestamp |
Geprüft und metadata.event_timestamp zugeordnet. |
UserAgent |
network.http.user_agent , network.http.parsed_user_agent |
Direkt network.http.user_agent zugeordnet. Wird auch geparst und network.http.parsed_user_agent zugeordnet. |
UVIndex |
additional.fields |
Wird als zusätzliches Feld mit dem Schlüssel „UVIndex“ hinzugefügt. |
Visibility |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „Visibility“ hinzugefügt. |
WindDirection |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „WindDirection“ hinzugefügt. |
WindSpeed |
additional.fields |
Als zusätzliches Feld mit dem Schlüssel „WindSpeed“ hinzugefügt. |
_Internal_WorkspaceResourceId |
additional.fields |
Wird als zusätzliches Feld mit dem Schlüssel „workspace_resource_id“ hinzugefügt. |
– | metadata.event_type |
Wird durch Logik basierend auf OperationName und anderen Feldern bestimmt. Wenn kein bestimmter Ereignistyp gefunden wird, wird standardmäßig „GENERIC_EVENT“ verwendet. Mögliche Werte sind „STATUS_SHUTDOWN“, „RESOURCE_CREATION“, „STATUS_UPDATE“, „USER_RESOURCE_DELETION“, „RESOURCE_READ“, „RESOURCE_WRITTEN“, „RESOURCE_DELETION“ und „GROUP_MODIFICATION“. |
– | metadata.vendor_name |
Legen Sie diesen Wert auf „Microsoft“ fest. |
– | metadata.product_name |
Legen Sie diesen Wert auf „Azure DevOps“ fest. |
– | metadata.log_type |
Legen Sie diesen Wert auf „AZURE_DEVOPS“ fest. |
– | principal.user.account_type |
Auf „SERVICE_ACCOUNT_TYPE“ festlegen, wenn AuthenticationMechanism „ServicePrincipal“ enthält. Andernfalls auf „CLOUD_ACCOUNT_TYPE“ festlegen. |
– | target.asset.attribute.cloud.environment |
Legen Sie MICROSOFT_AZURE fest. |
– | security_result.action |
Auf „ALLOW“ für erfolgreiche Vorgänge (Succeeded, Created, Modified, executed, updated, removed) und „BLOCK“ für fehlgeschlagene Vorgänge (Failed, TimedOut) festgelegt. |
– | extensions.auth.mechanism |
Legen Sie diesen Wert auf „USERNAME_PASSWORD“ fest, wenn summary „UserAuthToken“ ist. |
– | target.resource.resource_type |
Wird auf „SETTING“ festgelegt, wenn pipeline_id vorhanden ist, auf „CREDENTIAL“, wenn authorization_id vorhanden ist, auf „DEVICE“, wenn agent_id vorhanden ist, oder auf „DATABASE“, wenn namespace_id vorhanden ist. Andernfalls wird er in einigen Fällen basierend auf operationName auf „STORAGE_BUCKET“ gesetzt. |
– | target.resource.resource_subtype |
Wird auf „Pipeline“ festgelegt, wenn pipeline_id vorhanden ist, auf „Token“, wenn authorization_id vorhanden ist, auf „Agent“, wenn agent_id vorhanden ist, oder auf „Namespace“, wenn namespace_id vorhanden ist. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten