Ajouter les données de Defender pour le cloud à Power BI
En connectant les données de Microsoft Defender pour le cloud à Microsoft Power BI, vous pouvez facilement surveiller et analyser vos indicateurs de sécurité. L’intégration vous permet de visualiser des informations sur la sécurité et d’identifier rapidement les menaces et vulnérabilités potentielles. Cet article vous guide à travers les étapes pour connecter les données de Defender pour le cloud à Power BI, vous aidant à transformer des informations de sécurité complexes en informations claires et exploitables.
Prérequis
Assurez-vous d’avoir les autorisations nécessaires pour accéder à Azure Resource Graph.
Connectez Power BI à Azure Resource Graph
Avant de pouvoir connecter les données de Defender pour le cloud à Power BI, vous devez d’abord connecter Power BI à Azure Resource Graph.
Sur votre bureau, ouvrez Power BI Desktop.
Sélectionnez Rapport vierge.
Sélectionnez Obtenir des données>plus.
Recherchez et sélectionnez Azure Resource Graph.
Sélectionnez Connecter.
Interroger les données de Defender pour le cloud dans Power BI
Une fois que Power BI Desktop est connecté à Azure Resource Graph, vous pouvez utiliser Azure Resource Graph pour interroger diverses sources de données de Defender pour le cloud dans Power BI.
Les requêtes fournies sur cette page sont des exemples qui fournissent des résultats. Azure Resource Graph vous permet d’interroger un large éventail de données que vous pouvez créer et personnaliser pour renvoyer des résultats adaptés à vos besoins spécifiques.
Copiez et collez l’une des requêtes fournies dans l’éditeur de requêtes de Power BI Desktop.
Cette requête récupère les recommandations de sécurité par risque de MDC, vous permettant d’analyser les évaluations et d’identifier les zones nécessitant une attention particulière.
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
Sélectionnez OK.
Remarque
Par défaut, Resource Graph limite à 1 000 le nombre d’enregistrements retournés par une requête. Ce contrôle vous protège, vous et le service, contre des requêtes involontaires qui entraîneraient des ensembles de données volumineux. Si vous souhaitez que les résultats de la requête ne soient pas tronqués par la limite de 1000 enregistrements, définissez la valeur de l’« option avancée - $resultTruncated (optionnel) » sur FAUX.
Sélectionnez Charger.
Avec Azure Resource Graph, vous avez la flexibilité de récupérer et d’analyser toutes les données disponibles dans votre environnement Defender pour le cloud, garantissant des informations complètes et adaptées. Une fois vos données ajoutées à Power BI, vous pouvez créer des visualisations et des tableaux de bord pour surveiller et gérer efficacement votre posture de sécurité.