Sdílet prostřednictvím


Přidání dat Defenderu pro cloud do Power BI

Propojením dat Microsoft Defenderu pro cloud s Microsoft Power BI můžete snadno monitorovat a analyzovat metriky zabezpečení. Integrace umožňuje vizualizovat přehledy zabezpečení a rychle identifikovat potenciální hrozby a ohrožení zabezpečení. Tento článek vás provede postupem připojení defenderu pro cloudová data k Power BI a pomůže vám transformovat složité informace o zabezpečení na jasné přehledy s možností akce.

Požadavky

Připojení Power BI k Azure Resource Graphu

Než budete moct připojit data Defenderu for Cloud k Power BI, musíte nejdřív připojit Power BI k Azure Resource Graphu.

  1. Na počítači otevřete Power BI Desktop.

  2. Vyberte prázdnou sestavu.

  3. Vyberte Získat další data>.

    Snímek obrazovky hlavní obrazovky Power BI Desktopu, která ukazuje, kde se nachází tlačítko získat data, a další možnost

  4. Vyhledejte a vyberte Azure Resource Graph.

  5. Vyberte Připojit.

Query Defender for Cloud data in to Power BI

Jakmile je Power BI Desktop připojený ke službě Azure Resource Graph, můžete pomocí Azure Resource Graphu dotazovat různé zdroje dat z Defenderu pro cloud do Power BI.

Dotazy poskytované na této stránce jsou příklady, které poskytují výsledky. Azure Resource Graph umožňuje dotazovat se na širokou škálu dat, která můžete vytvořit a přizpůsobit tak, aby vracely výsledky, které vyhovují vašim konkrétním požadavkům.

  1. Zkopírujte a vložte jeden z poskytnutých dotazů do editoru dotazů v Power BI Desktopu.

    Tento dotaz načte doporučení zabezpečení podle rizika z MDC a umožňuje analyzovat posouzení a identifikovat oblasti, které vyžadují pozornost.

    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. Vyberte OK.

    Snímek obrazovky znázorňující, kde zadat dotaz Azure Resource Graphu a kde se nachází tlačítko OK

    Poznámka:

    Resource Graph ve výchozím nastavení omezuje jakýkoli dotaz na vrácení pouze 1 000 záznamů. Tento ovládací prvek chrání vás i službu před neúmyslnými dotazy, které by ovlivnily velké datové sady. Pokud chcete, aby výsledky dotazu nebyly zkráceny limitem 1000 záznamů, nastavte hodnotu Rozšířené možnosti – $resultTruncated (volitelné) na HODNOTU FALSE.

    Snímek obrazovky znázorňující umístění rozšířených možností a jeho nastavení na false

  3. Vyberte Načíst.

Díky Azure Resource Graphu máte možnost načítat a analyzovat všechna data dostupná v rámci cloudového prostředí Defenderu a zajistit tak komplexní a přizpůsobené přehledy. Po přidání dat do Power BI můžete vytvářet vizualizace a řídicí panely pro efektivní monitorování a správu stavu zabezpečení.

Další krok