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
Ujistěte se, že máte správná oprávnění pro přístup k Azure Resource Graphu.
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.
Na počítači otevřete Power BI Desktop.
Vyberte prázdnou sestavu.
Vyberte Získat další data>.
Vyhledejte a vyberte Azure Resource Graph.
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.
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
Vyberte 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.
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í.