إنشاء موصل بدون تعليمات برمجية لـ Microsoft Sentinel

يوفر النظام الأساسي للموصل بدون تعليمات برمجية (CCP) للشركاء والمستخدمين المتقدمين والمطورين القدرة على إنشاء موصلات مخصصة لاستيعاب البيانات إلى Microsoft Sentinel.

الموصلات التي تم إنشاؤها باستخدام CCP هي SaaS بالكامل، مع عدم وجود متطلبات لتثبيتات الخدمة. كما أنها تشمل مراقبة الصحة والدعم الكامل من Microsoft Sentinel.

استخدم الخطوات التالية لإنشاء موصل CCP وتوصيل مصدر البيانات ب Microsoft Sentinel

  • إنشاء موصل البيانات
  • إنشاء قالب ARM
  • نشر الموصل
  • توصيل Microsoft Sentinel بمصدر البيانات وبدء استيعاب البيانات

ستوضح لك هذه المقالة كيفية إكمال كل خطوة وتوفير مثال موصل بدون تعليمات برمجية للبناء على طول الطريق.

كيف يختلف CCP هذا عن الإصدار السابق؟

تم الإعلان عن النسخة الأولية من CCP في يناير 2022. ومنذ ذلك الحين، قمنا بتحسين النظام الأساسي ولم يعد الإصدار القديم مستحسنا. يحتوي هذا الإصدار الجديد من CCP على التحسينات الرئيسية التالية:

  1. دعم أفضل لمختلف أنواع المصادقة و ترقيم الصفحات.

  2. يدعم قواعد جمع البيانات القياسية (DCRs).

  3. أصبحت أجزاء واجهة المستخدم وتكوين الاتصال من الموصل بدون تعليمات برمجية منفصلة الآن. يسمح هذا بإنشاء موصلات ذات اتصالات متعددة لم يكن ممكنا من قبل.

المتطلبات الأساسية

قبل إنشاء موصل، افهم مصدر البيانات وكيفية اتصال Microsoft Sentinel.

  1. نقطة نهاية تجميع البيانات (DCE)

    DCE هو شرط ل DCR. يتم إنشاء DCE واحد فقط لكل نشر DCR لمساحة عمل تحليلات السجل. يستخدم كل DCR تم نشره لمساحة عمل Microsoft Sentinel نفس DCE. لمزيد من المعلومات حول كيفية إنشاء واحدة أو ما إذا كنت بحاجة إلى واحدة جديدة، راجع نقاط نهاية تجميع البيانات في Azure Monitor.

  2. مخطط جدول (جداول) الإخراج.

    من المهم فهم شكل دفق البيانات والحقول التي تريد تضمينها في جدول الإخراج. الرجوع إلى وثائق مصدر البيانات أو تحليل أمثلة الإخراج الكافية.

ابحث عن المكونات التالية وتحقق من دعمها في مرجع واجهة برمجة تطبيقات موصل البيانات:

  1. بنية طلب واستجابة HTTP إلى مصدر البيانات

  2. المصادقة المطلوبة من قبل مصدر البيانات.
    على سبيل المثال، إذا كان مصدر البيانات يتطلب رمزا مميزا موقعا بشهادة، فإن مرجع API لموصل البيانات يحدد أن مصادقة الشهادة غير مدعومة.

  3. خيارات ترقيم الصفحات إلى مصدر البيانات

نوصي أيضا بأداة مثل Postman للتحقق من صحة مكونات موصل البيانات. لمزيد من المعلومات، راجع استخدام Postman مع Microsoft Graph API.

إنشاء موصل البيانات

هناك 4 مكونات مطلوبة لإنشاء موصل بيانات CCP.

  1. تعريف جدول الإخراج
  2. قاعدة جمع البيانات (DCR)
  3. واجهة مستخدم موصل البيانات
  4. قواعد اتصال موصل البيانات

يحتوي كل مكون على قسم يفصل عملية الإنشاء والتحقق من الصحة. خذ JSON من كل مكون للتعبئة النهائية لقالب ARM.

تعريف جدول الإخراج

تلميح

تخطي هذه الخطوة إذا تم استيعاب بياناتك فقط في جداول Log Analytics القياسية. تتضمن أمثلة الجداول القياسية CommonSecurityLog وASimDnsActivityLogs. لمزيد من المعلومات حول القائمة الكاملة أنواع البيانات القياسية المدعومة، راجع دعم تحويل البيانات لموصلات البيانات المخصصة.

إذا لم يتوافق مصدر البيانات مع مخطط جدول قياسي، فلديك خياران:

  • إنشاء جدول مخصص لجميع البيانات
  • إنشاء جدول مخصص لبعض البيانات وتقسيم البيانات المطابقة لجدول قياسي

استخدم واجهة مستخدم Log Analytics لأسلوب مستقيم للأمام لإنشاء جدول مخصص مع DCR. إذا قمت بإنشاء الجدول المخصص باستخدام واجهة برمجة تطبيقات الجداول أو أسلوب برمجي آخر، أضف _CL اللاحقة يدويا إلى اسم الجدول. لمزيد من المعلومات، راجع إنشاء جدول مخصص.

لمزيد من المعلومات حول تقسيم البيانات إلى أكثر من جدول واحد، راجع مثال البيانات ومثال الجدول المخصص الذي تم إنشاؤه لتلك البيانات.

قاعدة جمع البيانات

تحدد قواعد جمع البيانات (DCRs) عملية جمع البيانات في Azure Monitor. تحدد DCRs البيانات التي يجب جمعها، وكيفية تحويل تلك البيانات، ومكان إرسال تلك البيانات.

  • هناك DCR واحد فقط يتم نشره لكل موصل بيانات.
  • يجب أن يكون ل DCR DCE مطابق في نفس المنطقة.
  • عند نشر موصل بيانات CCP، يتم إنشاء DCR إذا لم يكن موجودا بالفعل.

راجع أحدث المعلومات حول DCRs في هذه المقالات:

للحصول على برنامج تعليمي يوضح إنشاء DCE، بما في ذلك استخدام بيانات العينة لإنشاء جدول مخصص وDCR، راجع البرنامج التعليمي: إرسال البيانات إلى سجلات Azure Monitor باستخدام واجهة برمجة تطبيقات استيعاب السجلات (مدخل Azure). استخدم العملية في هذا البرنامج التعليمي للتحقق من استيعاب البيانات بشكل صحيح في جدولك باستخدام DCR الخاص بك.

لفهم كيفية إنشاء DCR معقد مع تدفقات بيانات متعددة، راجع قسم مثال DCR.

واجهة مستخدم موصل البيانات

يعرض هذا المكون واجهة المستخدم لموصل البيانات في معرض موصل بيانات Microsoft Sentinel. قد يكون لكل موصل بيانات تعريف واجهة مستخدم واحد فقط.

إنشاء واجهة مستخدم موصل البيانات باستخدام واجهة برمجة تطبيقات تعريف موصل البيانات. استخدم مرجع تعريفات موصل البيانات كملحق لشرح عناصر واجهة برمجة التطبيقات بمزيد من التفصيل.

ملاحظات:

  1. kind يجب أن تكون Customizableخاصية موصل استقصاء واجهة برمجة التطبيقات دائما .
  2. نظرا لأن هذا نوع من موصل استقصاء واجهة برمجة التطبيقات، قم بتعيين connectivityCriteria النوع إلى hasDataConnectors
  3. يتضمن المثال instructionsSteps زرا من النوع ConnectionToggleButton. يساعد هذا الزر على تشغيل نشر قواعد موصل البيانات استنادا إلى معلمات الاتصال المحددة.

استخدم Postman لاستدعاء واجهة برمجة تطبيقات تعريفات موصل البيانات لإنشاء واجهة مستخدم موصل البيانات من أجل التحقق من صحته في معرض موصلات البيانات.

للتعلم من مثال، راجع قسم المثال المرجعي لتعريفات موصل البيانات.

قواعد اتصال البيانات

يعرف هذا الجزء قواعد الاتصال بما في ذلك:

  • الاقتراع
  • المصادقة
  • paging

لمزيد من المعلومات حول إنشاء هذا القسم، راجع مرجع قواعد اتصال موصل البيانات.

للتعلم من مثال، راجع المثال المرجعي لقواعد اتصال موصل البيانات.

استخدم Postman لاستدعاء واجهة برمجة تطبيقات موصل البيانات لإنشاء موصل البيانات الذي يجمع بين قواعد الاتصال والمكونات السابقة. تحقق من أن الموصل متصل الآن في واجهة المستخدم.

تأمين الإدخال السري

أيا كانت المصادقة التي يستخدمها موصل بيانات CCP، اتبع هذه الخطوات لضمان الحفاظ على أمان المعلومات السرية. الهدف هو تمرير بيانات الاعتماد من قالب ARM إلى CCP دون ترك كائنات سرية قابلة للقراءة في محفوظات عمليات النشر الخاصة بك.

إنشاء تسمية

ينشئ تعريف موصل البيانات عنصر واجهة مستخدم لمطالبة بيانات اعتماد الأمان. على سبيل المثال، إذا كان موصل البيانات الخاص بك يصادق على مصدر سجل باستخدام OAuth، فإن قسم تعريف موصل البيانات يتضمن OAuthForm النوع في الإرشادات. يؤدي هذا إلى إعداد قالب ARM لمطالبة بيانات الاعتماد.

"instructions": [
    {
        "type": "OAuthForm",
        "parameters": {
        "UsernameLabel": "Username",
        "PasswordLabel": "Password",
        "connectButtonLabel": "Connect",
        "disconnectButtonLabel": "Disconnect"
        }
    }
],

تخزين الإدخال السري

يوفر قسم من قالب توزيع ARM مكانا للمسؤول الذي ينشر موصل البيانات لإدخال كلمة المرور. استخدم securestring للحفاظ على تأمين المعلومات السرية في كائن غير قابل للقراءة بعد النشر. لمزيد من المعلومات، راجع توصيات الأمان للمعلمات.

"mainTemplate": {
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "[variables('dataConnectorCCPVersion')]",
    "parameters": {
        "Username": {
            "type": "securestring",
            "minLength": 1,
            "metadata": {
                "description": "Enter the username to connect to your data source."
        },
        "Password": {
            "type": "securestring",
            "minLength": 1,
            "metadata": {
                "description": "Enter the API key, client secret or password required to connect."
            }
        },
    // more deployment template information
    }
}

استخدام كائنات securestring

وأخيرا، يستخدم CCP كائنات بيانات الاعتماد في قسم موصل البيانات.

"auth": {
    "type": "OAuth2",
    "ClientSecret": "[[parameters('Password')]",
    "ClientId": "[[parameters('Username')]",
    "GrantType": "client_credentials",
    "TokenEndpoint": "https://api.contoso.com/oauth/token",
    "TokenEndpointHeaders": {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    "TokenEndpointQueryParameters": {
        "grant_type": "client_credentials"
    }
},

إشعار

بناء الجملة الغريب لكائن بيانات الاعتماد، "ClientSecret": "[[parameters('Password')]", ليس خطأ إملائيا! لإنشاء قالب التوزيع الذي يستخدم المعلمات أيضا، تحتاج إلى إلغاء المعلمات في هذا القسم ببدء[ إضافي. يسمح هذا للمعلمات بتعيين قيمة استنادا إلى تفاعل المستخدم مع الموصل.

لمزيد من المعلومات، راجع أحرف إلغاء تعبيرات القالب.

إنشاء قالب التوزيع

قم بتعبئة قالب Azure Resource Management (ARM) يدويا باستخدام نموذج القالب كدليل خاص بك.

بالإضافة إلى نموذج القالب، تستخدم الحلول المنشورة المتوفرة في مركز محتوى Microsoft Sentinel CCP لموصل البيانات الخاص بها. راجع الحلول التالية كالمزيد من الأمثلة حول كيفية تجميع المكونات معا في قالب ARM.

نشر الموصل

انشر الموصل بدون تعليمات برمجية كقالب مخصص.

تلميح

احذف الموارد التي أنشأتها في الخطوات السابقة. يتم إنشاء DCR والجدول المخصص مع النشر. إذا لم تقم بإزالة هذه الموارد قبل التوزيع، فمن الصعب التحقق من القالب الخاص بك.

  1. انسخ محتويات قالب توزيع ARM.
  2. اتبع تحرير إرشادات القالب ونشرها من المقالة، التشغيل السريع: إنشاء قوالب ARM ونشرها باستخدام مدخل Microsoft Azure.

الحفاظ على عزل الشبكة لمصدر التسجيل

إذا كان مصدر التسجيل الخاص بك يتطلب عزل الشبكة، فكون قائمة السماح لعناوين IP العامة المستخدمة من قبل CCP.

تستخدم شبكات Azure الظاهرية علامات الخدمة لتعريف عناصر التحكم في الوصول إلى الشبكة. بالنسبة إلى CCP، علامة الخدمة هذه هي Scuba.

للعثور على نطاق IP الحالي المقترن بعلامة خدمة Scuba ، راجع استخدام واجهة برمجة تطبيقات اكتشاف علامة الخدمة.

التحقق من الموصل بدون تعليمات برمجية

عرض الموصل بدون تعليمات برمجية في معرض موصل البيانات. افتح موصل البيانات وأكمل أي معلمات مصادقة مطلوبة للاتصال. بمجرد الاتصال بنجاح، يتم إنشاء DCR والجداول المخصصة. عرض مورد DCR في مجموعة الموارد الخاصة بك وأي جداول مخصصة من مساحة عمل تحليلات السجلات.

إشعار

قد يستغرق الأمر ما يصل إلى 30 دقيقة لمشاهدة بدء استيعاب البيانات.

مثال

يتم تمثيل كل خطوة في إنشاء الموصل بدون تعليمات برمجية في أقسام المثال التالي.

لإظهار مصدر بيانات معقد مع الاستيعاب إلى أكثر من جدول واحد، يتميز هذا المثال بمخطط جدول إخراج وDCR مع تدفقات إخراج متعددة. يضع مثال DCR هذه جنبا إلى جنب مع تحويلات KQL الخاصة به. تستمر أمثلة تعريف واجهة مستخدم موصل البيانات وقواعد الاتصال من نفس مصدر بيانات المثال هذا. وأخيرا، يستخدم قالب الحل جميع مكونات المثال هذه لإظهار كيفية إنشاء موصل بيانات CCP المثال.

مثال على البيانات

يقوم مصدر البيانات بإرجاع JSON التالي عند الاتصال بنقطة النهاية الخاصة به.

[
        {
        "ts": "3/6/2023 8:15:15 AM",
        "eventType": "Alert",
        "deviceMac": "bc:27:c6:21:1c:70",
        "clientMac": "",
        "srcIp": "10.12.11.106",
        "destIp": "121.93.178.13",
        "protocol": "tcp/ip",
        "priority": "0",
        "message": "This is an alert message"
        },
        {
        "ts": "3/6/2023 8:14:54 AM",
        "eventType": "File",
        "srcIp": "178.175.128.249",
        "destIp": "234.113.125.105",
        "fileType": "MS_EXE",
        "fileSizeBytes": 193688,
        "disposition": "Malicious"
        }
]

تحتوي هذه الاستجابة على eventType تنبيه وملف. سيتم استيعاب أحداث الملف في الجدول القياسي العادي، AsimFileEventLogs، بينما سيتم استيعاب أحداث التنبيه في جدول مخصص.

مثال على جدول مخصص

لمزيد من المعلومات حول بنية هذا الجدول، راجع واجهة برمجة تطبيقات الجداول. يجب أن تحتوي أسماء جداول السجل المخصصة على لاحقة _CL .

{
"properties": {
    "schema": {
        "name": "ExampleConnectorAlerts_CL",
        "columns": [
        {
          "name": "TimeGenerated",
          "type": "datetime"
        },
        {
          "name": "SourceIP",
          "type": "string"
        },
        {
          "name": "DestIP",
          "type": "string"
        },
        {
          "name": "Message",
          "type": "string"
        },
        {
          "name": "Priority",
          "type": "int"
        }
        ]
      }
    }
}

مثال على قاعدة جمع البيانات

يعرف DCR التالي دفق Custom-ExampleConnectorInput واحد باستخدام مصدر البيانات المثال ويحول الإخراج إلى جدولين.

  1. يوجه eventType = تدفق البيانات الأول التنبيه إلى الجدول المخصص.ExampleConnectorAlerts_CL
  2. يوجه تدفق eventType = البيانات الثاني ملف إلى الجدول القياسي الذي تمت تسويته،.ASimFileEventLogs

لمزيد من المعلومات حول بنية هذا المثال، راجع بنية قاعدة تجميع البيانات.

لإنشاء DCR هذا في بيئة اختبار، اتبع واجهة برمجة تطبيقات قواعد تجميع البيانات. تشير عناصر المثال في {{double curly braces}} إلى المتغيرات التي تتطلب قيما بسهولة الاستخدام ل Postman. عند إنشاء هذا المورد في قالب ARM، يتم تبادل المتغيرات المعبر عنها هنا للمعلمات.

{
  "location": "{{location}}",
  "properties": {
    "dataCollectionEndpointId": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Insights/dataCollectionEndpoints/{{dataCollectionEndpointName}}",
    "streamDeclarations": {
      "Custom-ExampleConnectorInput": {
        "columns": [
          {
            "name": "ts",
            "type": "datetime"
          },
          {
            "name": "eventType",
            "type": "string"
          },
          {
            "name": "deviceMac",
            "type": "string"
          },
          {
            "name": "clientMac",
            "type": "string"
          },
          {
            "name": "srcIp",
            "type": "string"
          },
          {
            "name": "destIp",
            "type": "string"
          },
          {
            "name": "protocol",
            "type": "string"
          },
          {
            "name": "priority",
            "type": "string"
          },
          {
            "name": "message",
            "type": "string"
          },
          {
            "name": "fileType",
            "type": "string"
          },
          {
            "name": "fileSizeBytes",
            "type": "int"
          },
          {
            "name": "disposition",
            "type": "string"
          }
        ]
      }
    },
    "destinations": {
      "logAnalytics": [
        {
          "workspaceResourceId": "/subscriptions/{{subscriptionId}}/resourcegroups/{{resourceGroupName}}/providers/microsoft.operationalinsights/workspaces/{{workspaceName}}",
          "name": "{{uniqueFriendlyDestinationName}}"
        }
      ]
    },
    "dataFlows": [
      {
        "streams": [
          "Custom-ExampleConnectorInput"
        ],
        "destinations": [
          "{{uniqueFriendlyDestinationName}}"
        ],
        "transformKql": "source | where eventType == \"Alert\" | project TimeGenerated = ts, SourceIP = srcIp, DestIP = destIp, Message = message, Priority = priority \n",
        "outputStream": "Custom-ExampleConnectorAlerts_CL"
      },
      {
        "streams": [
          "Custom-ExampleConnectorInput"
        ],
        "destinations": [
          "{{uniqueFriendlyDestinationName}}"
        ],
        "transformKql": "source | where eventType == \"File\" | project-rename TimeGenerated = ts, EventOriginalType = eventType, SrcIpAddr = srcIp, DstIpAddr = destIp, FileContentType = fileType, FileSize = fileSizeBytes, EventOriginalSeverity = disposition \n",
        "outputStream": "Microsoft-ASimFileEventLogs"
      }
    ]
  }
}

مثال على تعريف واجهة مستخدم موصل البيانات

يقع هذا المثال في مرجع تعريفات موصل البيانات.

مثال على قواعد اتصال موصل البيانات

يقع هذا المثال في مرجع موصلات البيانات.

مثال على قالب ARM

أنشئ قالب توزيع ARM بالبنية التالية، والتي تتضمن 4 أقسام من مكونات JSON المطلوبة لإنشاء موصل بيانات CCP:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [],
}

قم بدمج الأقسام مع محرر مدرك ل JSON مثل Visual Code لتقليل أخطاء بناء الجملة مثل الفواصل وأقواس الإغلاق والأقواس.

لتوجيه عملية إنشاء القالب، تظهر التعليقات في بيانات التعريف description أو مضمنة مع // تدوين التعليق. لمزيد من المعلومات، راجع أفضل ممارسات قالب ARM - التعليقات.

ضع في اعتبارك استخدام مجموعة أدوات اختبار قالب ARM (arm-ttk) للتحقق من صحة القالب الذي تنشئه. لمزيد من المعلومات، راجع arm-ttk.

مثال على قالب ARM - المعلمات

لمزيد من المعلومات، راجع المعلمات في قوالب ARM.

تحذير

استخدم securestring لكافة كلمات المرور والأسرار في الكائنات القابلة للقراءة بعد توزيع الموارد. لمزيد من المعلومات، راجع المدخلات السرية الآمنة وتوصيات الأمان للمعلمات.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "minLength": 1,
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Not used, but needed to pass the arm-ttk test, 'Location-Should-Not-Be-Hardcoded'. Instead the `workspace-location` derived from the log analytics workspace is used."
            }
        },
        "workspace-location": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "[concat('Region to deploy solution resources -- separate from location selection',parameters('location'))]"
            }
        },
        "subscription": {
            "defaultValue": "[last(split(subscription().id, '/'))]",
            "type": "string",
            "metadata": {
                "description": "subscription id where Microsoft Sentinel is configured"
            }
        },
        "resourceGroupName": {
            "defaultValue": "[resourceGroup().name]",
            "type": "string",
            "metadata": {
                "description": "resource group name where Microsoft Sentinel is configured"
            }
        },
        "workspace": {
            "defaultValue": "",
            "type": "string",
            "metadata": {
                "description": "the log analytics workspace enabled for Microsoft Sentinel"
            }
        }
    },
    // Next is the variables section here
}

مثال على قالب ARM - المتغيرات

تساعد هذه المتغيرات الموصى بها على تبسيط القالب. استخدم أكثر أو أقل حسب الحاجة. لمزيد من المعلومات، راجع المتغيرات في قوالب ARM.

    "variables": {
        "workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
        "_solutionName": "Solution name", // Enter your solution name 
        "_solutionVersion": "3.0.0", // must be 3.0.0 or above
        "_solutionAuthor": "Contoso", // Enter the name of the author
        "_packageIcon": "<img src=\"{LogoLink}\" width=\"75px\" height=\"75px\">", // Enter the http link for the logo. NOTE: This field is only recommended for Azure Global Cloud.
        "_solutionId": "azuresentinel.azure-sentinel-solution-azuresentinel.azure-sentinel-MySolution", // Enter a name for your solution with this format but exchange the 'MySolution' portion
        "dataConnectorVersionConnectorDefinition": "1.0.0",
        "dataConnectorVersionConnections": "1.0.0",
        "_solutionTier": "Community", // This designates the appropriate support - all custom data connectors are "Community"
        "_dataConnectorContentIdConnectorDefinition": "MySolutionTemplateConnectorDefinition", // Enter a name for the connector
        "dataConnectorTemplateNameConnectorDefinition": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnectorDefinition')))]",
        "_dataConnectorContentIdConnections": "MySolutionTemplateConnections", // Enter a name for the connections this connector makes
        "dataConnectorTemplateNameConnections": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnections')))]",
        "_logAnalyticsTableId1": "ExampleConnectorAlerts_CL" // Enter the custom table name - not needed if you are ingesting data into standard tables
		// Enter more variables as needed "":""
    },
    // Next is the resources sections here

مثال على قالب ARM - الموارد

هناك 5 موارد توزيع ARM في دليل القالب هذا الذي يحتوي على مكونات بناء موصل بيانات CCP 4.

  1. contentTemplates (مورد أصل)
    • بيانات التعريف
    • dataCollectionRules - لمزيد من المعلومات، راجع قاعدة جمع البيانات.
    • الجداول - لمزيد من المعلومات، راجع تعريف جدول الإخراج.
  2. dataConnectorDefinitions - لمزيد من المعلومات، راجع واجهة مستخدم موصل البيانات.
  3. بيانات التعريف
  4. قوالب المحتوى
    • بيانات التعريف
    • RestApiPoller - لمزيد من المعلومات، راجع قواعد اتصال البيانات.
  5. حزم المحتوى
    "resources": [
        // resource section 1 - contentTemplates
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates",
            "apiVersion": "2023-04-01-preview",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnectorDefinition'), variables('dataConnectorVersionConnectorDefinition'))]",
            "location": "[parameters('workspace-location')]",
            "dependsOn": [
                "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
            ],
            "properties": {
                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                "displayName": "[concat(variables('_solutionName'), variables('dataConnectorTemplateNameConnectorDefinition'))]",
                "contentKind": "DataConnector",
                "mainTemplate": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "[variables('dataConnectorVersionConnectorDefinition')]",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition')))]",
                            "apiVersion": "2022-01-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
                            "properties": {
                                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition'))]",
                                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                                "kind": "DataConnector",
                                "version": "[variables('dataConnectorVersionConnectorDefinition')]",
                                "source": {
                                    "sourceId": "[variables('_solutionId')]",
                                    "name": "[variables('_solutionName')]",
                                    "kind": "Solution"
                                },
                                "author": {
                                    "name": "[variables('_solutionAuthor')]"
                                },
                                "support": {
                                    "name": "[variables('_solutionAuthor')]",
                                    "tier": "[variables('_solutionTier')]"
                                },
                                "dependencies": {
                                    "criteria": [
                                        {
                                            "version": "[variables('dataConnectorVersionConnections')]",
                                            "contentId": "[variables('_dataConnectorContentIdConnections')]",
                                            "kind": "ResourcesDataConnector"
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "name": "MyDCRV1", // Enter your DCR name
                            "apiVersion": "2021-09-01-preview",
                            "type": "Microsoft.Insights/dataCollectionRules",
                            "location": "[parameters('workspace-location')]",
                            "kind": null,
                            "properties": 
							{ 
                                // Enter your DCR properties here.
                                //  Consider using these variables:
                                //  "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]",
                                //  "workspaceResourceId": "[variables('workspaceResourceId')]",
							}
                        },
                        {
                            "name": "[variables('_logAnalyticsTableId1')]",
                            "apiVersion": "2022-10-01",
                            "type": "Microsoft.OperationalInsights/workspaces/tables",
                            "location": "[parameters('workspace-location')]",
                            "kind": null,
                            "properties": 
							{
								// Enter your log analytics table schema here. 
                                //  Consider using this variable for the name property:
                                //  "name": "[variables('_logAnalyticsTableId1')]",
							}			
                        }
						// Enter more tables if needed.
                    ]
                },
                "packageKind": "Solution",
                "packageVersion": "[variables('_solutionVersion')]",
                "packageName": "[variables('_solutionName')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','dc','-', uniqueString(concat(variables('_solutionId'),'-','DataConnector','-',variables('_dataConnectorContentIdConnectorDefinition'),'-', variables('dataConnectorVersionConnectorDefinition'))))]",
                "packageId": "[variables('_solutionId')]",
                "contentSchemaVersion": "3.0.0",
                "version": "[variables('_solutionVersion')]"
            }
        },
        // resource 2 section here
        // resource section 2 - dataConnectorDefinitions
        {
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition'))]",
            "apiVersion": "2022-09-01-preview",
            "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions",
            "location": "[parameters('workspace-location')]",
            "kind": "Customizable",
            "properties": 
			{
				//Enter your data connector definition properties here
				//"connectorUiConfig": {
				//	"graphQueriesTableName": "[variables('_logAnalyticsTableId1')]",
                //}, 
			}
        },
        // resource 3 section here
        // resource section 3 - metadata
        {
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition')))]",
            "apiVersion": "2022-01-01-preview",
            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
            "properties": {
                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition'))]",
                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                "kind": "DataConnector",
                "version": "[variables('dataConnectorVersionConnectorDefinition')]",
                "source": {
                    "sourceId": "[variables('_solutionId')]",
                    "name": "[variables('_solutionName')]",
                    "kind": "Solution"
                },
                "author": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "support": {
                    "name": "[variables('_solutionAuthor')]",
                    "tier": "[variables('_solutionTier')]"
                },
                "dependencies": {
                    "criteria": [
                        {
                            "version": "[variables('dataConnectorVersionConnections')]",
                            "contentId": "[variables('_dataConnectorContentIdConnections')]",
                            "kind": "ResourcesDataConnector"
                        }
                    ]
                }
            }
        },
        // resource 4 section here
        // resource section 4 - contentTemplates
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates",
            "apiVersion": "2023-04-01-preview",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnections'), variables('dataConnectorVersionConnections'))]",
            "location": "[parameters('workspace-location')]",
            "dependsOn": [
                "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
            ],
            "properties": {
                "contentId": "[variables('_dataConnectorContentIdConnections')]",
                "displayName": "[concat(variables('_solutionName'), variables('dataConnectorTemplateNameConnections'))]",
                "contentKind": "ResourcesDataConnector",
                "mainTemplate": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "[variables('dataConnectorVersionConnections')]",
                    "parameters":
                    // These parameters are used by the data connector primarily as properties for the administrator to enter in the UI when configuring the connector
					{
                        "connectorDefinitionName": {
                            "defaultValue": "connectorDefinitionName",
                            "type": "string",
                            "minLength": 1
                        },
                        "workspace": {
                            "defaultValue": "[parameters('workspace')]",
                            "type": "string"
                        },
                        "dcrConfig": {
                            "defaultValue": {
                                "dataCollectionEndpoint": "data collection Endpoint",
                                "dataCollectionRuleImmutableId": "data collection rule immutableId"
                            },
                            "type": "object"
                        }
						// Enter additional parameters, for example:
						//"domainname": {
                        //    "defaultValue": "domain name",
                        //    "type": "string",
                        //    "minLength": 1
                        //},
                        //"apikey": {
                        //    "defaultValue": "",
                        //    "type": "securestring",
                        //    "minLength": 1
                        //}
                    },
                    "variables": {
                        "_dataConnectorContentIdConnections": "[variables('_dataConnectorContentIdConnections')]"
                    },
                    "resources": [
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnections')))]",
                            "apiVersion": "2022-01-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
                            "properties": {
                                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectors', variables('_dataConnectorContentIdConnections'))]",
                                "contentId": "[variables('_dataConnectorContentIdConnections')]",
                                "kind": "ResourcesDataConnector",
                                "version": "[variables('dataConnectorVersionConnections')]",
                                "source": {
                                    "sourceId": "[variables('_solutionId')]",
                                    "name": "[variables('_solutionName')]",
                                    "kind": "Solution"
                                },
                                "author": {
                                    "name": "[variables('_solutionAuthor')]"
                                },
                                "support": {
                                    "name": "[variables('_solutionAuthor')]",
                                    "tier": "[variables('_solutionTier')]"
                                }
                            }
                        },
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', 'MyDataConnector')]", // Replace the last part of the name with your data connector name
                            //  To create several connections using this template, make the name dynamic. For example, use the 'concat' function to add the connector name with a GUID using the 'guid' function.
                            "apiVersion": "2022-12-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors",
                            "location": "[parameters('workspace-location')]",
                            "kind": "RestApiPoller",
                            "properties": 
							{
								// Enter your data connector properties here. If you want to use UI parameters remember to escape the parameter like this: "[[parameters('paramName')]"
								//  Use parameters as needed. For example:	
                                // "dataType": "My product security event API",
                                // "response": {
                                //   "eventsJsonPaths": [
                                //        "$"
                                //    ],
                                //    "format": "json"
                                // },
                                // "paging": {
                                //    "pagingType": "LinkHeader"
                                // },
                                // "connectorDefinitionName": "[[parameters('connectorDefinitionName')]",
                                // "auth": {
                                //   "apiKeyName": "Authorization",
                                //    "ApiKey": "[[parameters('apikey')]",
                                //    "apiKeyIdentifier": "SSWS",
                                //    "type": "APIKey"
                                //} ,
                                // "request": {
                                //   "apiEndpoint": "[[concat('https://',parameters('domainname'),'/api/v1/logs')]",
                                //    "rateLimitQPS": 10,
                                //   "queryWindowInMin": 5,
                                //   "httpMethod": "GET",
                                //    "retryCount": 3,
                                //    "timeoutInSeconds": 60,
                                //    "headers": {
                                //        "Accept": "application/json",
                                //        "User-Agent": "My-Data-Source"
                                //    },
                                //    "startTimeAttributeName": "since",
								//    "endTimeAttributeName": "until"		     
                                // },
                                // "dcrConfig": {
                                //    "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]",
                                //    "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]",
                                //    "streamName": "Custom-ExampleConnectorAlerts_CL" //This input stream should be the same as the inputStream property configured for the DataCollectionRule 
                                // },
                                // "isActive": true
                            }
                        }
                    ]
                },
                "packageKind": "Solution",
                "packageVersion": "[variables('_solutionVersion')]",
                "packageName": "[variables('_solutionName')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','rdc','-', uniqueString(concat(variables('_solutionId'),'-','ResourcesDataConnector','-',variables('_dataConnectorContentIdConnections'),'-', variables('dataConnectorVersionConnections'))))]",
                "packageId": "[variables('_solutionId')]",
                "contentSchemaVersion": "3.0.0",
                "version": "[variables('_solutionVersion')]"
            }
        },
        // resource 5 section here
        // resource section 5 - contentPackages
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentPackages",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('_solutionId'))]",
            "location": "[parameters('workspace-location')]",
            "apiVersion": "2023-04-01-preview",
            "properties": {
                "version": "[variables('_solutionVersion')]",
                "kind": "Solution",
                "contentSchemaVersion": "3.0.0",
                "contentId": "[variables('_solutionId')]",
                "source": {
                    "kind": "Solution",
                    "name": "[variables('_solutionName')]",
                    "sourceId": "[variables('_solutionId')]"
                },
                "author": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "support": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "dependencies": {
                    "operator": "AND",
                    "criteria": [
                        {
                            "kind": "DataConnector",
                            "contentId": "[variables('dataConnectorVersionConnectorDefinition')]",
                            "version": "[variables('_dataConnectorContentIdConnectorDefinition')]"
                        }
                    ]
                },
                "firstPublishDate": "2023-12-05",
                "providers": [
                    "[variables('_solutionAuthor')]"
                ],
                "contentKind": "Solution",
                "packageId": "[variables('_solutionId')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','sl','-', uniqueString(concat(variables('_solutionId'),'-','Solution','-',variables('_solutionId'),'-', variables('_solutionVersion'))))]",
                "displayName": "[variables('_solutionName')]",
                "publisherDisplayName": "[variables('_solutionId')]",
                "descriptionHtml": "test",
                "icon": "[variables('_packageIcon')]"
            }
        }
        // that's the end!
    ]
}

الخطوات التالية

لمزيد من المعلومات، راجع