Łączniki wypychania CCF w Microsoft Sentinel (wersja zapoznawcza) — wprowadzenie do działania

Ten przewodnik ułatwia zrozumienie, tworzenie i wdrażanie łączników bezkodowych opartych na wypychaniu dla usługi Microsoft Sentinel przy użyciu platformy Codeless Connector Framework (CCF) Push (wersja zapoznawcza).

Co to jest CCF push?

Łączniki wypychania CCF umożliwiają aplikacjom wysyłanie zdarzeń bezpieczeństwa bezpośrednio do usługi Microsoft Sentinel w czasie rzeczywistym. W przeciwieństwie do tradycyjnych łączników opartych na sondowaniu, które okresowo pobierają dane z interfejsów API, łączniki wypychania umożliwiają wypychanie danych do usługi Sentinel w miarę występowania zdarzeń w systemie.

Dostarczanie CCF zapewnia kilka kluczowych korzyści:

  • Przepływ danych kontrolowanych przez aplikację: Aplikacja kontroluje czas i sposób wysyłania danych, umożliwiając inteligentne strategie przetwarzania wsadowego i zoptymalizowane użycie sieci.
  • Pozyskiwanie w czasie rzeczywistym: Wysyłaj dane natychmiast, w miarę jak zdarzenia się odbywają, bez oczekiwania na okresy odpytywania.
  • Uproszczona architektura: Nie trzeba utrzymywać punktów końcowych interfejsu API dla usługi Sentinel do sondowania.
  • Aprowizacja oparta na szablonach: Wdrożenie tworzy szablony ARM dla zasad zbierania danych (DCRs), tabel niestandardowych, rejestracji aplikacji Entra i sekretów klienta — otrzymujesz szczegóły połączenia potrzebne do skonfigurowania w aplikacji wysyłającej.
  • Bezpieczne uwierzytelnianie: Używa aplikacji Firmy Microsoft Entra z uwierzytelnianiem OAuth 2.0 do bezpiecznego przesyłania danych.

Wymagania wstępne

  • Przed rozpoczęciem musisz mieć dostęp do repozytorium Azure-Sentinel GitHub w celu korzystania z narzędzi do tworzenia pakietów.
  • Uprawnienia firmy Microsoft Entra:
    • Uprawnienie do tworzenia rejestracji aplikacji w usłudze Microsoft Entra ID. Zwykle wymaga roli Deweloper aplikacji Entra ID lub wyższej.
    • Uprawnienie do tworzenia aplikacji z tajnymi danymi. Jeśli nie przyznasz tego uprawnienia, łącznik nie będzie działał ze względów bezpieczeństwa.
    • Wydawca musi mieć odpowiednią rolę, aby pobierać tokeny z aplikacji Microsoft Entra. Te żetony są wymagane do uwierzytelniania żądań do punktu zbierania danych (DCE), który jest punktem końcowym, gdzie łącznik ostatecznie przekazuje swoje dane. Jeśli dostawca nie może pobrać tokenów, nie można wysłać danych do DCE.
  • Uprawnienia platformy Microsoft Azure:
    • Uprawnienie do przypisywania roli Wydawcy metryk monitorowania w regule zbierania danych (DCR). Zwykle wymaga roli Właściciel platformy Azure RBAC lub Administrator dostępu użytkowników.

Jak działa wypychanie CCF

Model wypychania a model ściągania

Zrozumienie różnicy między modelami pozyskiwania danych oparciem na popychaniu lub ściąganiu pomaga wybrać odpowiedni typ łącznika dla danego scenariusza.

Łączniki ściągania CCF — oparte na sondowaniu:

W modelu ściągania usługa Microsoft Sentinel okresowo sonduje interfejs API w celu pobrania danych:

  • Usługa Microsoft Sentinel inicjuje połączenia z interfejsem API źródła danych zgodnie ze skonfigurowanym harmonogramem.
  • Dane docierają w regularnych odstępach czasowych odpytywania, takich jak co pięć minut.
  • Musisz zachować publicznie dostępny punkt końcowy interfejsu API.
  • Infrastruktura sondowania usługi Sentinel zarządza procesem zbierania danych.

Złącza push CCF — sterowane zdarzeniami:

W modelu push aplikacja wysyła dane bezpośrednio do usługi Microsoft Sentinel:

  • Aplikacja inicjuje przesyłanie danych w przypadku wystąpienia zdarzeń.
  • Dane docierają niemal w czasie rzeczywistym w miarę generowania zdarzeń.
  • Nie musisz utrzymywać punktu końcowego interfejsu API.
  • Aplikacja kontroluje przetwarzanie wsadowe, harmonogramowanie i optymalizację zarządzania przepływem danych.

Przepływ danych wypychanych

Przepływ danych wypychanych CCF składa się z pięciu głównych kroków:

  1. Ty wdrażasz łącznik w usłudze Microsoft Sentinel.

  2. Platforma Azure automatycznie tworzy następujące zasoby:

    • Aplikacja Microsoft Entra z danymi uwierzytelniającymi
    • Reguła zbierania danych (DCR) — definiuje sposób przetwarzania danych
    • Punkt końcowy zbierania danych (DCE) — adres URL, pod którym są wysyłane dane
    • Niestandardowa tabela dzienników — miejsce przechowywania danych
    • Przypisania ról — uprawnienia dla aplikacji Entra
  3. Zostaną wyświetlone następujące szczegóły połączenia:

    • Identyfikator najemcy
    • Identyfikator aplikacji (klienta)
    • Tajemnica klienta
    • Identyfikator URI DCE (adres URL punktu końcowego)
    • Identyfikator niezmienny DCR
    • Nazwa strumienia
  4. Aplikacja wysyła następujące dane:

    • Pobiera token OAuth 2.0 przy użyciu poświadczeń aplikacji Entra wygenerowanych przez program CCF. Aby uzyskać więcej informacji, zobacz Przepływ poświadczeń klienta OAuth 2.0
    • Formatuje zdarzenia w formacie JSON zgodnym ze schematem tabeli
    • Dane wysyłane są przez metodę POST do punktu końcowego DCE
  5. Platforma Azure przetwarza i przechowuje dane:

    • DCRs przekształcają dane (opcjonalne przekształcenia KQL)
    • Dane są zapisywane do tabeli niestandardowej w usłudze Log Analytics
    • Dane są dostępne dla zapytań, analiz i alertów w usłudze Sentinel

Artefakty wypychania CCF

Rozwiązanie łącznika Push CCF składa się z czterech głównych komponentów.

  • Definicja tabeli niestandardowej
  • Reguła zbierania danych (DCR)
  • Definicja łącznika (UI)
  • Konfiguracja łącznika wypychania

Definicja tabeli niestandardowej

Co to jest: Schemat definiujący strukturę danych w usłudze Log Analytics.

Podstawowe wymagania:

  • Nazwa tabeli musi kończyć się na _CL (niestandardowy sufiks dziennika).
  • Musi zawierać kolumnę TimeGenerated (typ daty/godziny).
  • Typy kolumn: string, int, long, real, bool, datetime, dynamic, guid.
  • Użyj wersji 2025-07-01 interfejsu API lub nowszej.
  • Aby uzyskać więcej informacji, zobacz Tworzenie tabeli niestandardowej w dziennikach usługi Azure Monitor.

Example:

{
  "name": "ContosoSecurityAlerts_CL",
  "type": "Microsoft.OperationalInsights/workspaces/tables",
  "apiVersion": "2025-07-01",
  "properties": {
     "schema": {
        "name": "ContosoSecurityAlerts_CL",
        "columns": [
          {
             "name": "TimeGenerated",
             "type": "datetime"
          },
          {
             "name": "EventSeverity",
             "type": "string"
          },
          {
             "name": "EventType",
             "type": "string"
          },
          {
             "name": "UserName",
             "type": "string"
          },
          {
             "name": "SourceIP",
             "type": "string"
          },
          {
             "name": "DeviceId",
             "type": "string"
          },
          {
             "name": "AlertMessage",
             "type": "string"
          }
        ]
     }
  }
}

Reguła zbierania danych (DCR)

Co to jest: Definiuje sposób pozyskiwania i przetwarzania danych przez usługę Azure Monitor. Aby uzyskać więcej informacji, zobacz Reguły zbierania danych w usłudze Azure Monitor.

Co to robi:

  • Określa nazwę strumienia wejściowego (której aplikacja używa podczas wysyłania danych)
  • Definiuje opcjonalne przekształcenia KQL w celu kształtowania i wzbogacania danych
  • Kieruje dane do tabeli docelowej
  • Linki do punktu końcowego zbierania danych (DCE)

Kluczowe składniki:

  • streamDeclarations: definiuje strukturę danych przychodzących (musi być zgodna z tym, co wysyła aplikacja)
  • destinations: Gdzie dane przechodzą (obszar roboczy usługi Log Analytics)
  • dataFlows: Potok przetwarzania od strumienia wejściowego do tabeli wyjściowej
  • dataCollectionEndpointId: Łącza do DCE dla przetwarzania danych

Example:

{
  "name": "ContosoSecurityAlertsPushDCR",
  "apiVersion": "2021-09-01-preview",
  "type": "Microsoft.Insights/dataCollectionRules",
  "location": "[parameters('workspace-location')]",
  "properties": {
     "streamDeclarations": {
        "Custom-ContosoSecurityAlerts": {
          "columns": [
             {
                "name": "EventSeverity",
                "type": "string"
             },
             {
                "name": "EventType",
                "type": "string"
             },
             {
                "name": "UserName",
                "type": "string"
             },
             {
                "name": "SourceIP",
                "type": "string"
             },
             {
                "name": "DeviceId",
                "type": "string"
             },
             {
                "name": "AlertMessage",
                "type": "string"
             }
          ]
        }
     },
     "destinations": {
        "logAnalytics": [
          {
             "workspaceResourceId": "[variables('workspaceResourceId')]",
             "name": "clv2ws1"
          }
        ]
     },
     "dataFlows": [
        {
          "streams": [
             "Custom-ContosoSecurityAlerts"
          ],
          "destinations": [
             "clv2ws1"
          ],
          "transformKql": "source | extend TimeGenerated = now()",
          "outputStream": "Custom-ContosoSecurityAlerts_CL"
        }
     ],
     "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]"
  }
}

Important

  • Nazwa strumienia musi zaczynać się od Custom- prefiksu.
  • Może to być po prostu przekazywanie transformKql do "source", lub zawierać logikę KQL w celu przekształcania danych.
  • outputStream musi być zgodna z nazwą tabeli z prefiksem Custom- i sufiksem _CL.

Definicja łącznika (UI)

Definicja łącznika kontroluje sposób wyświetlania łącznika w galerii łączników danych usługi Microsoft Sentinel. Aby uzyskać więcej informacji, zobacz API definicji konektora danych.

Definicja łącznika obejmuje:

  • Tytuł, opis i znakowanie łącznika
  • Wymagane wymagania wstępne i uprawnienia, takie jak dostęp do obszaru roboczego i uprawnienia entra
  • Instrukcje dotyczące wdrażania
  • Kontrolki interfejsu użytkownika służące do wyświetlania szczegółów połączenia z użytkownikami

Kluczowe elementy interfejsu użytkownika:

  • DeployPushConnectorButton: Wyzwala automatyczne wdrażanie zasobów
  • CopyableLabel: Wyświetla szczegóły połączenia po wdrożeniu (używa fillWith parametru)
  • Markdown: Zawiera sformatowane instrukcje i kontekst
  • IsConnectedQuery: Weryfikuje łączność łącznika na podstawie ostatnich danych

Przykładowa struktura (skrócona dla jasności):

{
    "name": "ContosoSecurityAlertsPush",
    "apiVersion": "2022-09-01-preview",
    "type": "Microsoft.SecurityInsights/dataConnectorDefinitions",
    "location": "[parameters('workspace-location')]",
    "kind": "Customizable",
    "properties": {
        "connectorUiConfig": {
            "id": "ContosoSecurityAlertsPush",
            "title": "Contoso Security Alerts (Push)",
            "publisher": "Contoso Corporation",
            "descriptionMarkdown": "The [Contoso Security Alerts](https://www.contoso.com/) connector provides the capability to push real-time security alerts from your Contoso application directly into Microsoft Sentinel using the Codeless Connector Framework (CCF) Push pattern. This connector ingests alert severity, event types, user information, and network details into a custom Log Analytics table for analysis, alerting, and visualization.",
            "graphQueries": [
                {
                    "metricName": "Security Alerts",
                    "legend": "ContosoSecurityAlerts_CL",
                    "baseQuery": "ContosoSecurityAlerts_CL"
                }
            ],
            "sampleQueries": [
                {
                    "description": "All security alerts",
                    "query": "ContosoSecurityAlerts_CL\n | sort by TimeGenerated desc"
                },
                {
                    "description": "Critical and High severity alerts",
                    "query": "ContosoSecurityAlerts_CL\n | where EventSeverity in ('Critical', 'High')\n | sort by TimeGenerated desc"
                }
            ],
            "dataTypes": [
                {
                    "name": "ContosoSecurityAlerts_CL",
                    "lastDataReceivedQuery": "ContosoSecurityAlerts_CL\n| summarize Time = max(TimeGenerated)\n| where isnotempty(Time)"
                }
            ],
            "connectivityCriteria": [
                {
                    "type": "IsConnectedQuery",
                    "value": [
                        "ContosoSecurityAlerts_CL\n| summarize LastLogReceived = max(TimeGenerated)\n| project IsConnected = LastLogReceived > ago(7d)"
                    ]
                }
            ],
            "availability": {
                "status": 1
            },
            "permissions": {
                "resourceProvider": [
                    {
                        "provider": "Microsoft.OperationalInsights/workspaces",
                        "permissionsDisplayText": "read and write permissions are required.",
                        "providerDisplayName": "Workspace",
                        "scope": "Workspace",
                        "requiredPermissions": {
                            "write": true,
                            "read": true,
                            "delete": true
                        }
                    }
                ],
                "customs": [
                    {
                        "name": "Microsoft Entra",
                        "description": "Permission to create an app registration in Microsoft Entra ID. Typically requires Entra ID Application Developer role or higher."
                    },
                    {
                        "name": "Microsoft Azure",
                        "description": "Permission to assign Monitoring Metrics Publisher role on data collection rule (DCR). Typically requires Azure RBAC Owner or User Access Administrator role."
                    }
                ]
            },
            "instructionSteps": [
                {
                    "title": "1. Create ARM Resources and Provide the Required Permissions",
                    "description": "This connector enables your Contoso application to push security alerts directly to Microsoft Sentinel via the Azure Monitor Ingestion API.",
                    "instructions": [
                        {
                            "type": "Markdown",
                            "parameters": {
                                "content": "#### Automated Configuration and Secure Data Ingestion with Entra Application \nClicking on \"Deploy\" will trigger the creation of a Log Analytics table and a Data Collection Rule (DCR). \nIt will then create an Entra application, link the DCR to it, and set the entered secret in the application. This setup enables data to be sent securely to the DCR using an Entra token."
                            }
                        },
                        {
                            "type": "DeployPushConnectorButton",
                            "parameters": {
                                "label": "Deploy Contoso Push connector resources",
                                "applicationDisplayName": "Contoso Security Alerts Push Connector Application"
                            }
                        }
                    ]
                },
                {
                    "title": "2. Configure Your Contoso Application",
                    "description": "Use the following parameters to configure your Contoso application to push security alerts to the workspace.",
                    "instructions": [
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Tenant ID (Directory ID)",
                                "fillWith": [
                                    "TenantId"
                                ]
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Entra App Registration Application ID",
                                "fillWith": [
                                    "ApplicationId"
                                ],
                                "placeholder": "Deploy push connector to get the App Registration Application ID"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Entra App Registration Secret",
                                "fillWith": [
                                    "ApplicationSecret"
                                ],
                                "placeholder": "Deploy push connector to get the App Registration Secret"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Data Collection Endpoint Uri",
                                "fillWith": [
                                    "DataCollectionEndpoint"
                                ],
                                "placeholder": "Deploy push connector to get the Data Collection Endpoint Uri"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Data Collection Rule Immutable ID",
                                "fillWith": [
                                    "DataCollectionRuleId"
                                ],
                                "placeholder": "Deploy push connector to get the Data Collection Rule Immutable ID"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Stream Name",
                                "value": "Custom-ContosoSecurityAlerts"
                            }
                        },
                        {
                            "type": "Markdown",
                            "parameters": {
                                "content": "#### Configure Contoso Application\nUpdate your Contoso application configuration with the above credentials to enable security alert push to Microsoft Sentinel.\n\nExample configuration:\njson\n{\n \"azure\": {\n \"tenant_id\": \"<Tenant ID>\",\n \"client_id\": \"<Application ID>\",\n \"client_secret\": \"<Application Secret>\",\n \"dce_endpoint\": \"<Data Collection Endpoint Uri>\",\n \"dcr_immutable_id\": \"<Data Collection Rule Immutable ID>\",\n \"stream_name\": \"Custom-ContosoSecurityAlerts\"\n }\n}\n"
                            }
                        }
                    ]
                }
            ]
        }
    }
}

Important

  • Element id w connectorUiConfig musi być unikatowy i pasować do odwołań w konfiguracji łącznika danych.
  • Użyj IsConnectedQuery dla łączników produkcyjnych (weryfikuje ostatnie dane) lub hasDataConnectors jako prostszej formy weryfikacji.
  • Parametry fillWith w pliku CopyableLabel są wypełniane automatycznie po wdrożeniu.
  • Stałe wartości, takie jak nazwa strumienia, używają parametru value zamiast fillWith.

Konfiguracja złącza push

Konfiguracja łącznika wypychającego to instancja łącznika danych, która łączy definicję łącznika z wdrożonymi zasobami.

Konfiguracja łącznika wypychania

  • Łączy definicję łącznika (UI) z wdrożonym kontrolerem domeny i aplikacją Entra
  • Przechowuje szczegóły uwierzytelniania (identyfikator aplikacji, identyfikator jednostki usługi)
  • Rejestruje konfigurację kontrolera domeny (punkt końcowy, niezmienny identyfikator, nazwę strumienia)
  • Umożliwia interfejsowi użytkownika pobieranie i wyświetlanie szczegółów połączenia dla użytkowników

Właściwości klucza:

  • connectorDefinitionName: Musi być zgodny z definicją łącznika id
  • dcrConfig: zawiera punkt końcowy dcR, identyfikator reguły i nazwę strumienia
  • auth: zawiera identyfikator aplikacji Entra i identyfikator jednostki usługi
  • kind: Musi mieć wartość "Push" dla łączników wypychania

Przykład:

{
  "name": "ContosoSecurityAlertsPushDCR",
  "apiVersion": "2021-09-01-preview",
  "type": "Microsoft.Insights/dataCollectionRules",
  "location": "[parameters('workspace-location')]",
  "properties": {
    "streamDeclarations": {
      "Custom-ContosoSecurityAlerts": {
        "columns": [
          {
            "name": "EventSeverity",
            "type": "string"
          },
          {
            "name": "EventType",
            "type": "string"
          },
          {
            "name": "UserName",
            "type": "string"
          },
          {
            "name": "SourceIP",
            "type": "string"
          },
          {
            "name": "DeviceId",
            "type": "string"
          },
          {
            "name": "AlertMessage",
            "type": "string"
          }
        ]
      }
    },
    "destinations": {
      "logAnalytics": [
        {
          "workspaceResourceId": "[variables('workspaceResourceId')]",
          "name": "clv2ws1"
        }
      ]
    },
    "dataFlows": [
      {
        "streams": [
          "Custom-ContosoSecurityAlerts"
        ],
        "destinations": [
          "clv2ws1"
        ],
        "transformKql": "source | extend TimeGenerated = now()",
        "outputStream": "Custom-ContosoSecurityAlerts_CL"
      }
    ],
    "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]"
  }
}

Important

  • Wartość connectorDefinitionName musi być dokładnie zgodna z definicją łącznika id.
  • Element streamName musi być zgodny ze strumieniem zadeklarowanym w twoim DCR.
  • Ten zasób jest tworzony automatycznie podczas wdrażania, gdy użytkownicy wybiorą przycisk DeployPushConnector .

Tworzenie pierwszego łącznika wypychania

W tym przykładzie utworzysz prosty łącznik wypychania, który wysyła alerty zabezpieczeń z aplikacji do usługi Sentinel.

Celem: Wysyłanie alertów zabezpieczeń z aplikacji do usługi Sentinel w czasie rzeczywistym

Aplikacja wysyła strukturę zdarzeń:

{
  "TimeGenerated": "2025-11-21T10:30:00Z",
  "EventSeverity": "Medium",
  "EventType": "LoginAlert",
  "UserName": "alice@contoso.com",
  "SourceIP": "192.168.1.100",
  "DeviceId": "device-12345",
  "AlertMessage": "Multiple failed login attempts detected"
}

Przewodnik krok po kroku dotyczący tworzenia łącznika push

  1. Klonowanie repozytorium Azure-Sentinel

    Następnie sklonuj oficjalne repozytorium Azure-Sentinel na komputer lokalny. To repozytorium zawiera narzędzia do tworzenia pakietów i zapewnia standardową strukturę rozwiązania.

    1. Klonowanie repozytorium
      git clone https://github.com/<YOUR_FORK>/Azure-Sentinel.git

    2. Przejdź do katalogu Solutions cd Azure-Sentinel/Solutions
      Struktura repozytorium obejmuje:

    • Narzędzia/Create-Azure-Sentinel-Solution/V3/
    • Zawiera skrypt tworzenia pakietów createSolutionV3.ps1
    • Rozwiązania/ Gdzie utworzysz rozwiązanie łącznika
  2. Utwórz strukturę folderu rozwiązania Utwórz nowy katalog rozwiązania w folderze Solutions/zgodnie ze standardową konwencją nazewnictwa. Tworzenie katalogów rozwiązań (z usługi Azure-Sentinel/Rozwiązań/)

    mkdir ContosoSecurityAlerts
    cd ContosoSecurityAlerts
    mkdir Data
    mkdir "Data Connectors"
    mkdir "Data Connectors/ContosoSecurityAlerts_ccf"
    

    Struktura folderów wygląda następująco:

    Azure-Sentinel/
     └—rozwiązania/
        └-contosoSecurityAlerts/
            ├;Dane/
            └-łączniki danych/
                └-ContosoSecurityAlerts_ccf/

  3. Definiowanie tabeli

    W folderze ContosoSecurityAlerts_ccf utwórz plik o nazwie table.json przy użyciu niestandardowej definicji tabeli:

    {
      "name": "ContosoSecurityAlerts_CL",
      "type": "Microsoft.OperationalInsights/workspaces/tables",
      "apiVersion": "2025-07-01",
      "properties": {
        "schema": {
          "name": "ContosoSecurityAlerts_CL",
          "columns": [
            {
              "name": "TimeGenerated",
              "type": "datetime"
            },
            {
              "name": "EventSeverity",
              "type": "string"
            },
            {
              "name": "EventType",
              "type": "string"
            },
            {
              "name": "UserName",
              "type": "string"
            },
            {
              "name": "SourceIP",
              "type": "string"
            },
            {
              "name": "DeviceId",
              "type": "string"
            },
            {
              "name": "AlertMessage",
              "type": "string"
            }
          ]
        }
      }
    }
    
  4. Utwórz DCR

    W folderze ContosoSecurityAlerts_ccf utwórz plik o nazwie DCR.json, który definiuje strumień wejściowy i kieruje dane do tabeli:

    {
      "name": "ContosoSecurityAlertsPushDCR",
      "apiVersion": "2021-09-01-preview",
      "type": "Microsoft.Insights/dataCollectionRules",
      "location": "[parameters('workspace-location')]",
      "properties": {
        "streamDeclarations": {
          "Custom-ContosoSecurityAlerts": {
            "columns": [
              {
                "name": "EventSeverity",
                "type": "string"
              },
              {
                "name": "EventType",
                "type": "string"
              },
              {
                "name": "UserName",
                "type": "string"
              },
              {
                "name": "SourceIP",
                "type": "string"
              },
              {
                "name": "DeviceId",
                "type": "string"
              },
              {
                "name": "AlertMessage",
                "type": "string"
              }
            ]
          }
        },
        "destinations": {
          "logAnalytics": [
            {
              "workspaceResourceId": "[variables('workspaceResourceId')]",
              "name": "clv2ws1"
            }
          ]
        },
        "dataFlows": [
          {
            "streams": [
              "Custom-ContosoSecurityAlerts"
            ],
            "destinations": [
              "clv2ws1"
            ],
            "transformKql": "source | extend TimeGenerated = now()",
            "outputStream": "Custom-ContosoSecurityAlerts_CL"
          }
        ],
        "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/    dataCollectionEndpoints/',parameters('workspace'))]"
      }
    }
    
  5. Tworzenie definicji łącznika

    W folderze ContosoSecurityAlerts_ccf utwórz plik o nazwie connectorDefinition.json, który definiuje sposób interakcji użytkowników z łącznikiem w usłudze Sentinel:

    {
        "name": "ContosoSecurityAlertsPush",
        "apiVersion": "2022-09-01-preview",
        "type": "Microsoft.SecurityInsights/dataConnectorDefinitions",
        "location": "[parameters('workspace-location')]",
        "kind": "Customizable",
        "properties": {
            "connectorUiConfig": {
                "id": "ContosoSecurityAlertsPush",
                "title": "Contoso Security Alerts (Push)",
                "publisher": "Contoso Corporation",
                "descriptionMarkdown": "The [Contoso Security Alerts](https://www.contoso.com/) connector provides the capability to push real-time security alerts from your   Contoso application directly into Microsoft Sentinel using the Codeless Connector Framework (CCF) Push pattern. This connector ingests alert severity, event  types, user information, and network details into a custom Log Analytics table for analysis, alerting, and visualization.",
                "graphQueries": [
                    {
                        "metricName": "Security Alerts",
                        "legend": "ContosoSecurityAlerts_CL",
                        "baseQuery": "ContosoSecurityAlerts_CL"
                    }
                ],
                "sampleQueries": [
                    {
                        "description": "All security alerts",
                        "query": "ContosoSecurityAlerts_CL\n | sort by TimeGenerated desc"
                    },
                    {
                        "description": "Critical and High severity alerts",
                        "query": "ContosoSecurityAlerts_CL\n | where EventSeverity in ('Critical', 'High')\n | sort by TimeGenerated desc"
                    }
                ],
                "dataTypes": [
                    {
                        "name": "ContosoSecurityAlerts_CL",
                        "lastDataReceivedQuery": "ContosoSecurityAlerts_CL\n| summarize Time = max(TimeGenerated)\n| where isnotempty(Time)"
                    }
                ],
                "connectivityCriteria": [
                    {
                        "type": "IsConnectedQuery",
                        "value": [
                            "ContosoSecurityAlerts_CL\n| summarize LastLogReceived = max(TimeGenerated)\n| project IsConnected = LastLogReceived > ago(7d)"
                        ]
                    }
                ],
                "availability": {
                    "status": 1
                },
                "permissions": {
                    "resourceProvider": [
                        {
                            "provider": "Microsoft.OperationalInsights/workspaces",
                            "permissionsDisplayText": "read and write permissions are required.",
                            "providerDisplayName": "Workspace",
                            "scope": "Workspace",
                            "requiredPermissions": {
                                "write": true,
                                "read": true,
                                "delete": true
                            }
                        }
                    ],
                    "customs": [
                        {
                            "name": "Microsoft Entra",
                            "description": "Permission to create an app registration in Microsoft Entra ID. Typically requires Entra ID Application Developer role or higher."
                        },
                        {
                            "name": "Microsoft Azure",
                            "description": "Permission to assign Monitoring Metrics Publisher role on data collection rule (DCR). Typically requires Azure RBAC Owner or User   Access Administrator role."
                        }
                    ]
                },
                "instructionSteps": [
                    {
                        "title": "1. Create ARM Resources and Provide the Required Permissions",
                        "description": "This connector enables your Contoso application to push security alerts directly to Microsoft Sentinel via the Azure Monitor Ingestion  API.",
                        "instructions": [
                            {
                                "type": "Markdown",
                                "parameters": {
                                    "content": "#### Automated Configuration and Secure Data Ingestion with Entra Application \nClicking on \"Deploy\" will trigger the creation    of a Log Analytics table and a Data Collection Rule (DCR). \nIt will then create an Entra application, link the DCR to it, and set the     entered secret in the application. This setup enables data to be sent securely to the DCR using an Entra token."
                                }
                            },
                            {
                                "type": "DeployPushConnectorButton",
                                "parameters": {
                                    "label": "Deploy Contoso Push connector resources",
                                    "applicationDisplayName": "Contoso Security Alerts Push Connector Application"
                                }
                            }
                        ]
                    },
                    {
                        "title": "2. Configure Your Contoso Application",
                        "description": "Use the following parameters to configure your Contoso application to push security alerts to the workspace.",
                        "instructions": [
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Tenant ID (Directory ID)",
                                    "fillWith": [
                                        "TenantId"
                                    ]
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Entra App Registration Application ID",
                                    "fillWith": [
                                        "ApplicationId"
                                    ],
                                    "placeholder": "Deploy push connector to get the App Registration Application ID"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Entra App Registration Secret",
                                    "fillWith": [
                                        "ApplicationSecret"
                                    ],
                                    "placeholder": "Deploy push connector to get the App Registration Secret"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Data Collection Endpoint Uri",
                                    "fillWith": [
                                        "DataCollectionEndpoint"
                                    ],
                                    "placeholder": "Deploy push connector to get the Data Collection Endpoint Uri"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Data Collection Rule Immutable ID",
                                    "fillWith": [
                                        "DataCollectionRuleId"
                                    ],
                                    "placeholder": "Deploy push connector to get the Data Collection Rule Immutable ID"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Stream Name",
                                    "value": "Custom-ContosoSecurityAlerts"
                                }
                            },
                            {
                                "type": "Markdown",
                                "parameters": {
                                    "content": "#### Configure Contoso Application\nUpdate your Contoso application configuration with the above credentials to enable security     alert push to Microsoft Sentinel.\n\nExample configuration:\njson\n{\n \"azure\": {\n \"tenant_id\": \"<Tenant ID>\",\n \"client_id\":  \"<Application ID>\",\n \"client_secret\": \"<Application Secret>\",\n \"dce_endpoint\": \"<Data Collection Endpoint Uri>\",\n   \"dcr_immutable_id\": \"<Data Collection Rule Immutable ID>\",\n \"stream_name\": \"Custom-ContosoSecurityAlerts\"\n }\n}\n"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
    
  6. Tworzenie konfiguracji łącznika danych

    W folderze ContosoSecurityAlerts_ccf utwórz plik o nazwie dataConnector.json, który łączy definicję łącznika z wdrożonymi zasobami:

    {
      "name": "ContosoSecurityAlertsPushConnectorPolling",
      "apiVersion": "2024-09-01",
      "type": "Microsoft.SecurityInsights/dataConnectors",
      "kind": "Push",
      "properties": {
        "connectorDefinitionName": "ContosoSecurityAlertsPush",
        "dcrConfig": {
          "streamName": "Custom-ContosoSecurityAlerts",
          "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]",
          "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]"
        },
        "auth": {
          "type": "Push",
          "AppId": "[[parameters('auth').appId]",
          "ServicePrincipalId": "[[parameters('auth').servicePrincipalId]"
        },
        "request": {
          "RetryCount": 1
        },
        "response": {
          "eventsJsonPaths": [
            "$"
          ]
        }
      }
    }
    
  7. Tworzenie plików metadanych rozwiązania

    1. Solution_ContosoSecurityAlerts.json Utwórz w folderze Dane plik z szczegółami rozwiązania:

      {
           "Name": "ContosoSecurityAlerts",
           "Author": "Contoso Corporation - support@contoso.com",
           "Logo": "<svg width=\"75px\" height=\"75px\" viewBox=\"0 0 75 75\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"75\" height=\"75\" fill=\"#FF6B35\"/><text   x=\"37.   5\" y=\"45\" font-family=\"Arial\" font-size=\"18\" fill=\"white\" text-anchor=\"middle\" font-weight=\"bold\">CONTOSO</text></svg>",
           "Description": "The Contoso Security Alerts solution provides real-time security alert ingestion from your Contoso application into Microsoft Sentinel using the       Codeless Connector Framework (CCF) Push pattern. Your application pushes alert severity, event types, user information, and network details directly to Azure   Monitor     for analysis, alerting, and visualization.",
           "Data Connectors": [
                "Data Connectors/ContosoSecurityAlerts_ccf/connectorDefinition.json"
           ],
           "BasePath": "C:\\GitHub\\Azure-Sentinel\\Solutions\\ContosoSecurityAlerts",
           "Version": "1.0.0",
           "Metadata": "SolutionMetadata.json",
           "TemplateSpec": true,
           "Is1PConnector": false
      }
      

      Important

      Wymagania dotyczące pola krytycznego:

      • BasePath: Zaktualizuj rzeczywistą lokalną ścieżkę do repozytorium Azure-Sentinel
      • Metadata: Musi odnosić się do SolutionMetadata.json (utworzony w kroku 6B)
      • Version: Semantyczne przechowywanie wersji, na przykład 3.0.0
      • TemplateSpec: Zawsze true w przypadku rozwiązań centrum zawartości
      • Is1Pconnector: ustaw wartość false dla łączników partnerskich/niestandardowych
    2. Utwórz plik SolutionMetadata.json w katalogu głównym rozwiązania

      W folderze ContosoSecurityAlerts utwórz SolutionMetadata.json w katalogu głównym rozwiązania (na tym samym poziomie co folder danych):

      {
        "publisherId": "contoso",
        "offerId": "contoso-security-alerts",
        "firstPublishDate": "2025-01-01",
        "lastPublishDate": "2025-01-01",
        "providers": [
           "Contoso"
        ],
        "categories": {
           "domains": [
              "Security - Threat Protection",
              "Security - Cloud Security"
           ]
        },
        "support": {
           "name": "Contoso Corporation",
           "tier": "Partner",
           "link": "https://www.contoso.com/support"
        }
      }
      

      Potrzebny jest plik SolutionMetadata.json do tworzenia pakietów centrum zawartości:

      • Narzędzie do tworzenia pakietów oczekuje tego pliku w katalogu głównym rozwiązania
      • Zawiera metadane rynku dla dystrybucji Centrum Treści
    3. Utwórz ReleaseNotes.md w katalogu głównym rozwiązania

      wersja Data modyfikacji (DD-MM-YYYY) Historia zmian
      3.0.0 DD —MM-YYYY Przykładowe rozwiązanie

    Lista kontrolna sprawdzania poprawności

    Przed przejściem do następnego kroku sprawdź:

    • Nazwa folderu nie ma spacji, na przykład ContosoSecurityAlerts
    • Name pole w Solution_ContosoSecurityAlerts.json dokładnie pasuje do nazwy folderu
    • SolutionMetadata.json istnieje w katalogu głównym rozwiązania (nie w folderze danych)
    • BasePath wskazuje na rzeczywistą ścieżkę lokalnego repozytorium Azure-Sentinel
    • Metadata odwołania do pól "SolutionMetadata.json"
    • publisherId i offerId dopasowane między obydwoma plikami
  8. Weryfikowanie struktury rozwiązania

    Upewnij się, że struktura folderów jest zgodna z wymaganym układem ze wszystkimi plikami:

    Azure-Sentinel/
    └── Solutions/
         └── ContosoSecurityAlerts/                         Folder name (no spaces)
              ├── Data/
              │   └── Solution_ContosoSecurityAlerts.json    From Step 7A
              ├── SolutionMetadata.json                      From Step 7B (at root)
              ├── ReleaseNotes.md                            From Step 7C
              └── Data Connectors/
                    └── ContosoSecurityAlerts_ccf/
                         ├── table.json                         From Step 3
                         ├── DCR.json                           From Step 4
                         ├── connectorDefinition.json           From Step 5
                         └── dataConnector.json                 From Step 6
    
  9. Spakuj rozwiązanie

    Użyj narzędzia do tworzenia pakietów createSolutionV3.ps1, aby wygenerować szablon wdrożenia usługi ARM.

    # Navigate to the packaging tools directory (from Azure-Sentinel repository root)
    cd Tools/Create-Azure-Sentinel-Solution/V3
    
    # Run the packaging tool
    # When prompted for "Enter solution data folder path:", provide:
    # <REPO_ROOT>Solutions/ContosoSecurityAlerts/Data (Note! This path is absolute)
    .\createSolutionV3.ps1
    

    Skrypt automatycznie:

    • Weryfikuje strukturę danych/folderów
    • Przetwarza artefakty łącznika

    Oczekiwane dane wyjściowe:

    Skrypt pakietowania pokazuje nieudaną walidację zestawu narzędzi arm-ttk (Azure Resource Manager Template Toolkit). Ten błąd jest normalnym i spodziewanym zjawiskiem dla konektorów typu Push CCF.

    Failed arm-ttk (Test-AzTemplate): Package
    Failed arm-ttk (Test-AzTemplate) on solutions: Package
    ************Validating if Package Json files are valid or not***************
    File Solutions\ContosoSecurityAlerts\Package\createUiDefinition.json is a valid Json file!
    File Solutions\ContosoSecurityAlerts\Package\mainTemplate.json is a valid Json file!
    File Solutions\ContosoSecurityAlerts\Package\testParameters.json is a valid Json file!
    

    Opakowanie zakończyło się pomyślnie, jeśli zostaną wyświetlone trzy komunikaty weryfikacji JSON potwierdzające prawidłowe pliki. Możesz zignorować błąd arm-ttk łączy Push CCF.

    Aby uzyskać więcej informacji, zobacz dokumentacjęAzure-Sentinel Solutions Tools.

  10. Wdrażanie pakietu rozwiązania

    Wdróż wygenerowany szablon usługi ARM (pakiet/mainTemplate.json) w subskrypcji platformy Azure.

    1. W witrynie Azure Portal wyszukaj pozycję Deploy a custom template (Wdrażanie szablonu niestandardowego)
    2. Wybierz pozycję Utwórz własny szablon w edytorze
    3. Wybierz pozycję Załaduj plik i wybierz Package/mainTemplate.json z folderu wyjściowego
    4. Wybierz Zapisz
    5. Wypełnij parametry wdrożenia:
      • Subskrypcja: Twoja subskrypcja platformy Azure
      • Grupa zasobów: Grupa zasobów zawierająca obszar roboczy usługi Sentinel
      • Region: Ten sam region co obszar roboczy usługi Sentinel
      • Obszaru roboczego: Nazwa obszaru roboczego usługi Log Analytics
    6. Wybierz Przejrzyj i utwórz, a następnie Utwórz

    To wdrożenie udostępnia łącznik w galerii łączników danych usługi Microsoft Sentinel.

    Aby uzyskać szczegółowe instrukcje, zobacz [Szybki start: tworzenie i wdrażanie szablonów usługi ARM przy użyciu witryny Azure Portal](/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal).

  11. Włączanie łącznika danych

    Po wdrożeniu pakietu rozwiązania włącz łącznik w celu aprowizowania zasobów i generowania poświadczeń.

    1. W witrynie Azure Portal przejdź do obszaru roboczego usługi Microsoft Sentinel
    2. Przejdź do Konfiguracji>Łączników danych
    3. Wyszukaj i wybierz pozycję Alerty zabezpieczeń firmy Contoso (Push)
    4. Wybierz Otwórz stronę łącznika
    5. Wybierz przycisk Wdróż łącznik Alerty zabezpieczeń firmy Contoso
    6. Poczekaj na zakończenie wdrażania (tworzy tabelę niestandardową, DCR, DCE, aplikację Entra z poświadczeniami)
    7. Skopiuj wyświetlone szczegóły połączenia:
      • Identyfikator najemcy
      • Identyfikator aplikacji (klienta)
      • Tajemnica klienta
      • Identyfikator URI punktu końcowego zbierania danych
      • Niezmienny identyfikator reguły zbierania danych
      • Nazwa strumienia: Custom-ContosoSecurityAlerts
  12. Konfigurowanie aplikacji

    Zaktualizuj kod aplikacji przy użyciu poświadczeń i szczegółów zasobu z kroku 10. Kod używa przepływu poświadczeń klienta OAuth 2.0 do uwierzytelniania za pomocą usługi Azure Monitor.

    Caution

    Ochrona Poświadczeń: Nigdy nie koduj poświadczeń (identyfikator dzierżawy, identyfikator aplikacji, klucz tajny klienta) bezpośrednio w kodzie aplikacji ani nie zatwierdzaj ich do systemu kontroli wersji. Użyj rozwiązań bezpiecznego magazynu poświadczeń, takich jak:

    • Usługa Azure Key Vault dla aplikacji produkcyjnych
    • Zmienne środowiskowe lub pliki konfiguracji (wykluczone z kontroli źródła)
    • Tożsamości zarządzane tam, gdzie ma to zastosowanie
    • Narzędzia do zarządzania tajnymi danymi, które szyfrują poświadczenia w stanie spoczynku

    Przykładowy kod aplikacji w języku Python:

    W poniższym przykładzie użyto wartości zastępczych, takich jak <Your-Tenant-ID>. Zastąp te wartości bezpiecznymi odwołaniami do rzeczywistych poświadczeń.

    import requests
    import json
    from datetime import datetime, timezone
    
    # Connection details from Step 11
    
    tenant_id = "<Your-Tenant-ID>"
    app_id = "<Your-Application-ID>"
    app_secret = "<Your-Client-Secret>"
    dce_uri = "<Your-DCE-URI>"
    dcr_immutable_id = "<Your-DCR-Immutable-ID>"
    stream_name = "Custom-ContosoSecurityAlerts"
    
    
    **Get OAuth token**
    
    token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
    token_data = {
         "client_id": app_id,
         "scope": "https://monitor.azure.com//.default",
         "client_secret": app_secret,
         "grant_type": "client_credentials"
    }
    token_response = requests.post(token_url, data=token_data)
    access_token = token_response.json()["access_token"]
    
    
    # Create event matching your table schema
    
    event = [{
         "TimeGenerated": datetime.now(timezone.utc).isoformat(),
         "EventSeverity": "Medium",
         "EventType": "LoginAlert",
         "UserName": "alice@contoso.com",
         "SourceIP": "192.168.1.100",
         "DeviceId": "device-12345",
         "AlertMessage": "Multiple failed login attempts detected"
    }]
    
    
    # Send to Sentinel
    
    headers = {
         "Authorization": f"Bearer {access_token}",
         "Content-Type": "application/json"
    }
    upload_url = f"{dce_uri}/dataCollectionRules/{dcr_immutable_id}/streams/{stream_name}?api-version=2023-01-01"
    response = requests.post(upload_url, headers=headers, json=event)
    
    print(f"Status: {response.status_code}")
    print("Security alert sent to Sentinel!")
    
  13. Zapytaj dane

    Po wysłaniu alertów wykonaj zapytanie w usłudze Sentinel. Poczekaj 5–10 minut na pierwsze wczytywanie.

    // View all recent alerts
    ContosoSecurityAlerts_CL
    | where TimeGenerated > ago(1h)
    | order by TimeGenerated desc
    
    // High severity alerts
    ContosoSecurityAlerts_CL
    | where EventSeverity == "High"
    | project TimeGenerated, EventType, UserName, SourceIP, AlertMessage
    
    // Alert summary by severity
    ContosoSecurityAlerts_CL
    | where TimeGenerated > ago(7d)
    | summarize Count=count() by EventSeverity
    

Teraz, gdy znasz łącza CCF typu Push, wykonaj następujące kroki:

  1. Projektowanie schematu danych — zidentyfikuj zdarzenia, które chcesz wysłać, i ich pola.
  2. Tworzenie artefaktów łącznika — zbuduj cztery pliki JSON (tabela, DCR, definicja łącznika, łącznik danych).
  3. Organizowanie struktury rozwiązań — konfigurowanie danych/ i łączników danych/ folderów przy użyciu odpowiedniego nazewnictwa.
  4. Spakuj swoje rozwiązanie — użyj createSolutionV3.ps1 do generowania szablonów wdrażania.
  5. Wdrażanie i testowanie — wdróż w obszarze roboczym usługi Sentinel i zweryfikuj przepływ danych.
  6. Integracja z aplikacją — dodaj kod do wysyłania zdarzeń w czasie rzeczywistym.
  7. Tworzenie alertów i skoroszytów — użyj danych do monitorowania zabezpieczeń.

Dodatkowe zasoby

Dokumentacja programu CCF

Usługa Azure Monitor i zbieranie danych

Uwierzytelnianie i zabezpieczenia

Microsoft Sentinel

Uzyskaj pomoc

  • W przypadku partnerów niezależnych dostawców oprogramowania tworzących integracje skontaktuj się z: azuresentinelpartner@microsoft.com
  • W przypadku pytań technicznych użyj Microsoft Q&A z tagiem 'azure-sentinel'.