Partage via


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

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.

  1. Sur votre bureau, ouvrez Power BI Desktop.

  2. Sélectionnez Rapport vierge.

  3. Sélectionnez Obtenir des données>plus.

    Capture d’écran de l’écran principal de Power BI Desktop qui montre où se trouve le bouton obtenir des données et l’option plus.

  4. Recherchez et sélectionnez Azure Resource Graph.

  5. 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.

  1. 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
    
  2. Sélectionnez OK.

    Capture d’écran qui montre où entrer la requête Azure Resource Graph et où se trouve le bouton 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.

    Capture d’écran qui montre où se trouvent les options avancées et comment les définir sur faux.

  3. 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é.

Étape suivante