مشاركة عبر


إضافة بيانات Defender for Cloud إلى Power BI

من خلال توصيل بيانات Microsoft Defender for Cloud ب Microsoft Power BI، يمكنك بسهولة مراقبة مقاييس الأمان وتحليلها. يسمح لك التكامل بتصور رؤى الأمان وتحديد التهديدات المحتملة والثغرات الأمنية بسرعة. ترشدك هذه المقالة خلال خطوات توصيل بيانات Defender for Cloud ب Power BI، مما يساعدك على تحويل معلومات الأمان المعقدة إلى رؤى واضحة وقابلة للتنفيذ.

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

توصيل Power BI ب Azure Resource Graph

قبل أن تتمكن من توصيل بيانات Defender for Cloud ب Power BI، يجب عليك أولا توصيل Power BI ب Azure Resource Graph.

  1. على سطح المكتب، افتح Power BI Desktop.

  2. حدد Blank report.

  3. حدد الحصول على البيانات>أكثر.

    لقطة شاشة لشاشة Power BI Desktop الرئيسية التي تعرض مكان وجود زر الحصول على البيانات والمزيد من الخيارات.

  4. ابحث عن Azure Resource Graph وحدده.

  5. حدد اتصال.

الاستعلام عن بيانات Defender for Cloud في Power BI

بمجرد توصيل Power BI Desktop ب Azure Resource Graph، يمكنك استخدام Azure Resource Graph للاستعلام عن مصادر البيانات المختلفة من Defender for Cloud إلى Power BI.

الاستعلامات المقدمة في هذه الصفحة هي أمثلة توفر النتائج. يسمح لك Azure Resource Graph بالاستعلام عن مجموعة واسعة من البيانات التي يمكنك إنشاؤها وتخصيصها لإرجاع النتائج التي تناسب متطلباتك المحددة.

  1. انسخ أحد الاستعلامات المتوفرة والصقه في محرر الاستعلام في Power BI Desktop.

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

    securityresources 
            | where type =~ "microsoft.security/assessments"
            | extend assessmentType = iff(type == "microsoft.security/assessments", tostring(properties.metadata.assessmentType), dynamic(null))
            | where (type == "microsoft.security/assessments" and (assessmentType in~ ("BuiltIn", "CustomerManaged")))
            | extend assessmentTypeSkimmed = iff(type == "microsoft.security/assessments", case(
                        tostring(properties.metadata.assessmentType) == "BuiltIn", "BuiltIn",
                        tostring(properties.metadata.assessmentType) == "BuiltInPolicy", "BuiltIn",
                        tostring(properties.metadata.assessmentType) == "CustomPolicy", "Custom",
                        tostring(properties.metadata.assessmentType) == "CustomerManaged", "Custom",
                        tostring(properties.metadata.assessmentType) == "ManualCustomPolicy", "Custom",
                        tostring(properties.metadata.assessmentType) == "ManualBuiltInPolicy", "BuiltIn",
                        dynamic(null)
                    ), dynamic(null))
            | extend assessmentId = tolower(id)
            | extend assessmentKey = iff(type == "microsoft.security/assessments", name, dynamic(null))
            | extend source = iff(type == "microsoft.security/assessments", trim(' ', tolower(tostring(properties.resourceDetails.Source))), dynamic(null))
            | extend statusCode = iff(type == "microsoft.security/assessments", tostring(properties.status.code), dynamic(null))
            | extend resourceId = iff(type == "microsoft.security/assessments", trim(" ", tolower(tostring(case(source =~ "azure", properties.resourceDetails.Id,
                (type == "microsoft.security/assessments" and (source =~ "aws" and isnotempty(tostring(properties.resourceDetails.ConnectorId)))), properties.resourceDetails.Id,
                (type == "microsoft.security/assessments" and (source =~ "gcp" and isnotempty(tostring(properties.resourceDetails.ConnectorId)))), properties.resourceDetails.Id,
                source =~ "aws", properties.resourceDetails.AzureResourceId,
                source =~ "gcp", properties.resourceDetails.AzureResourceId,
                extract("^(?i)(.+)/providers/Microsoft.Security/assessments/.+$",1,id)
                )))), dynamic(null))
            | extend resourceName = iff(type == "microsoft.security/assessments", tostring(coalesce(properties.resourceDetails.ResourceName, properties.additionalData.CloudNativeResourceName, properties.additionalData.ResourceName, properties.additionalData.resourceName, split(resourceId, '/')[-1], extract(@"(.+)/(.+)", 2, resourceId))), dynamic(null))
            | extend resourceType = iff(type == "microsoft.security/assessments", tolower(properties.resourceDetails.ResourceType), dynamic(null))
            | extend riskLevelText = iff(type == "microsoft.security/assessments", tostring(properties.risk.level), dynamic(null))
            | extend riskLevel = iff(type == "microsoft.security/assessments", case(riskLevelText =~ "Critical", 4,
                      riskLevelText =~ "High", 3,
                      riskLevelText =~ "Medium", 2,
                      riskLevelText =~ "Low", 1,
                      0), dynamic(null))
            | extend riskFactors = iff(type == "microsoft.security/assessments", iff(isnull(properties.risk.riskFactors), dynamic([]), properties.risk.riskFactors), dynamic(null))
            | extend attackPaths = array_length(iff(type == "microsoft.security/assessments", iff(isnull(properties.risk.attackPathsReferences), dynamic([]), properties.risk.attackPathsReferences), dynamic(null)))           
            | extend displayName = iff(type == "microsoft.security/assessments", tostring(properties.displayName), dynamic(null))
            | extend statusCause = iff(type == "microsoft.security/assessments", tostring(properties.status.cause), dynamic(null))
            | extend isExempt = iff(type == "microsoft.security/assessments", iff(statusCause == "Exempt", tobool(1), tobool(0)), dynamic(null))
            | extend statusChangeDate = tostring(iff(type == "microsoft.security/assessments", todatetime(properties.status.statusChangeDate), dynamic(null)))
            | project assessmentId,
                        statusChangeDate,
                        isExempt,
                        riskLevel,
                        riskFactors,
                        attackPaths,
                        statusCode,
                        displayName,
                        resourceId,               
                        assessmentKey,
                        resourceType,
                        resourceName,
                        assessmentTypeSkimmed               
                | join kind=leftouter (
                    securityresources
                    | where type == 'microsoft.security/assessments/governanceassignments'
                    | extend assignedResourceId = tolower(iff(type == "microsoft.security/assessments/governanceassignments", tostring(properties.assignedResourceId), dynamic(null)))
                    | extend dueDate = iff(type == "microsoft.security/assessments/governanceassignments", todatetime(properties.remediationDueDate), dynamic(null))
                    | extend owner = iff(type == "microsoft.security/assessments/governanceassignments", iff(isempty(tostring(properties.owner)), "unspecified", tostring(properties.owner)), dynamic(null))
                    | extend governanceStatus = iff(type == "microsoft.security/assessments/governanceassignments", case(
                                isnull(todatetime(properties.remediationDueDate)), "NoDueDate",
                                todatetime(properties.remediationDueDate) >= bin(now(), 1d), "OnTime",
                                "Overdue"
                            ), dynamic(null))
                    | project assignedResourceId, dueDate, owner, governanceStatus
                ) on $left.assessmentId == $right.assignedResourceId
                | extend completionStatusNumber = case(governanceStatus == "Overdue", 5,
                                                           governanceStatus == "OnTime", 4,
                                                           statusCode == "Unhealthy", 3, 
                                                           isExempt, 7,
                                                           1)
                    | extend completionStatus = case(completionStatusNumber == 5, "Overdue",
                                                     completionStatusNumber == 4, "OnTime",
                                                     completionStatusNumber == 3, "Unassigned",
                                                     completionStatusNumber == 7, "Exempted",
                                                     "Completed")
                | where completionStatus in~ ("OnTime","Overdue","Unassigned")
                | project-away assignedResourceId, governanceStatus, isExempt
                           | order by riskLevel desc, attackPaths desc, displayName
    
  2. حدد OK.

    لقطة شاشة توضح مكان إدخال استعلام Azure Resource Graph ومكان وجود الزر Ok.

    إشعار

    بشكل افتراضي، يقيد Resource Graph أي استعلام لإرجاع 1000 سجل فقط. يحمي عنصر التحكم هذا كلا من أنت والخدمة من الاستعلامات غير المقصودة التي قد تؤدي إلى مجموعات بيانات كبيرة. إذا كنت تريد عدم اقتطاع نتائج الاستعلام بحد 1000 سجل، فقم بتعيين قيمة "الخيار المتقدم - $resultTruncated (اختياري)" إلى FALSE.

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

  3. حدد تحميل.

باستخدام Azure Resource Graph، لديك المرونة لاسترداد وتحليل أي بيانات متوفرة داخل بيئة Defender for Cloud، ما يضمن رؤى شاملة ومصممة خصيصا. بمجرد إضافة بياناتك إلى Power BI، يمكنك إنشاء مرئيات ولوحات معلومات لمراقبة وضع الأمان وإدارته بفعالية.

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