Dela via


Lägga till Defender för molnet data i Power BI

Genom att ansluta Microsoft Defender för molnet data till Microsoft Power BI kan du enkelt övervaka och analysera dina säkerhetsmått. Med integreringen kan du visualisera säkerhetsinsikter och snabbt identifiera potentiella hot och sårbarheter. Den här artikeln vägleder dig genom stegen för att ansluta Defender för molnet data till Power BI, vilket hjälper dig att omvandla komplex säkerhetsinformation till tydliga, användbara insikter.

Förutsättningar

Ansluta Power BI till Azure Resource Graph

Innan du kan ansluta Defender för molnet data till Power BI måste du först ansluta Power BI till Azure Resource Graph.

  1. Öppna Power BI Desktop på skrivbordet.

  2. Välj Tom rapport.

  3. Välj Hämta data>mer.

    Skärmbild av huvudskärmen i Power BI Desktop som visar var knappen hämta data finns och det fler alternativet.

  4. Sök efter och välj Azure Resource Graph.

  5. Välj Anslut.

Fråga Defender för molnet data till Power BI

När Power BI Desktop är anslutet till Azure Resource Graph kan du använda Azure Resource Graph för att fråga olika datakällor från Defender för molnet till Power BI.

Frågorna som tillhandahålls på den här sidan är exempel som ger resultat. Med Azure Resource Graph kan du fråga en mängd olika data som du kan skapa och anpassa för att returnera resultat som passar dina specifika krav.

  1. Kopiera och klistra in en av de angivna frågorna i frågeredigeraren i Power BI Desktop.

    Den här frågan hämtar säkerhetsrekommendationer efter risk från MDC, så att du kan analysera utvärderingar och identifiera områden som behöver åtgärdas.

    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. Välj OK.

    Skärmbild som visar var du anger Azure Resource Graph-frågan och var knappen Ok finns.

    Kommentar

    Som standard begränsar Resource Graph alla frågor till att endast returnera 1 000 poster. Den här kontrollen skyddar både dig och tjänsten från oavsiktliga frågor som skulle resultera i stora datamängder. Om du vill att frågeresultatet inte ska trunkeras med gränsen på 1 000 poster anger du värdet för "Avancerat alternativ – $resultTruncated (valfritt)" till FALSE.

    Skärmbild som visar var de avancerade alternativen finns och hur du ställer in det på false.

  3. Välj Läs in.

Med Azure Resource Graph har du flexibiliteten att hämta och analysera alla tillgängliga data i din Defender för molnet miljö, vilket säkerställer omfattande och skräddarsydda insikter. När dina data har lagts till i Power BI kan du skapa visualiseringar och instrumentpaneler för att övervaka och hantera din säkerhetsstatus effektivt.

Gå vidare