Transition vers Gestion des vulnérabilités Microsoft Defender

Microsoft Defender pour le cloud unifie toutes les solutions d’évaluation des vulnérabilités pour utiliser l’analyseur de vulnérabilité de Gestion des vulnérabilités Microsoft Defender.

Gestion des vulnérabilités Microsoft Defender s’intègre dans de nombreux cas d’usage natifs cloud, comme des scénarios d’envoi et d’exécution de conteneurs.

L’évaluation des vulnérabilités des conteneurs de Defender pour le cloud avec Qualys est désormais mise hors service. Si vous n’êtes pas encore passé à Évaluations des vulnérabilités pour Azure avec Gestion des vulnérabilités Microsoft Defender, suivez les étapes décrites dans la page pour effectuer la transition.

Étape 1 : Vérifier que l’analyse est activée

L’analyse de l’évaluation des vulnérabilités des conteneurs avec Gestion des vulnérabilités Microsoft Defender est activée par défaut pour Defender pour les conteneurs, Defender pour les registres de conteneurs (déconseillé) et Gestion de la posture de sécurité cloud. Les organisations qui l’ont désactivée doivent réactiver l’évaluation des vulnérabilités des conteneurs sans agent dans un des plans. Elle se répercute automatiquement sur tous les plans activés mentionnés.

Screenshot of enabling “Agentless container vulnerability assessment” in settings.

Pour plus d’informations sur l’activation de l’analyse de Gestion des vulnérabilités Microsoft Defender, consultez Activer l’évaluation des vulnérabilités avec Gestion des vulnérabilités Microsoft Defender.

Étape 2 : (facultatif) Mettre à jour l’API REST et les requêtes Azure Resource Graph

Si vous accédiez par programmation aux résultats de l’évaluation des vulnérabilités des conteneurs avec Qualys, via l’API REST Azure Resource Graph (ARG) ou des requêtes d’API REST ou ARG de sous-évaluation, vous devez mettre à jour vos requêtes existantes pour qu’elles correspondent au nouveau schéma et/ou à l’API REST fournie par la nouvelle évaluation des vulnérabilités des conteneurs avec Gestion des vulnérabilités Microsoft Defender.

La section suivante comprend quelques exemples qui peuvent vous aider à comprendre comment les requêtes existantes pour l’offre avec Qualys doivent être traduites en requêtes équivalentes pour l’offre utilisant Gestion des vulnérabilités Microsoft Defender.

Exemples de requête ARG

Toutes les requêtes Azure Resource Graph utilisées pour la création de rapports doivent être mises à jour pour refléter les assessmentKeys de Gestion des vulnérabilités Microsoft Defender listées précédemment. Voici des exemples pour vous aider à passer aux requêtes Gestion des vulnérabilités Microsoft Defender.

Montrer des images de conteneurs non sains

Qualys
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | where assessmentKey == "dbd0cb49-b563-45e7-9724-889e799fa648"
    | project 
        Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id)), 
        ResourceType = tolower(split(id,"/").[6]), 
        subscriptionId, 
        severity = properties.status.severity, 
        status = properties.status.code, 
        VulnId = properties.id, 
        description = properties.displayName, 
        patchable = properties.additionalData.patchable, 
        cve = properties.additionalData.cve, 
        Repo = properties.additionalData.repositoryName, 
        imageDigest = properties.additionalData.imageDigest
    | where status == 'Unhealthy' 
Gestion des vulnérabilités Microsoft Defender
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | where assessmentKey == "c0b7cfc6-3172-465a-b378-53c7ff2cc0d5"
    | project 
        Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id)), 
        ResourceType = tolower(split(id,"/").[6]), 
        subscriptionId, 
        severity = properties.additionalData.vulnerabilityDetails.severity, 
        status = properties.status.code, 
        VulnId = properties.id, 
        description = properties.description, 
        fixStatus = properties.additionalData.softwareDetails.fixStatus, 
        Repo = properties.additionalData.artifactDetails.repositoryName, 
        imageUri = properties.resourceDetails.id
    | where status == 'Unhealthy' 

Montrer des images de conteneurs sains

Qualys
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | where assessmentKey == "dbd0cb49-b563-45e7-9724-889e799fa648"
    | project 
        Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id)), 
        ResourceType = tolower(split(id,"/").[6]), 
        subscriptionId, 
        status = properties.status.code, 
        Repo = properties.additionalData.repositoryName, 
        imageDigest = properties.additionalData.imageDigest
    | where status == 'Healthy'
Gestion des vulnérabilités Microsoft Defender
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | where assessmentKey == "c0b7cfc6-3172-465a-b378-53c7ff2cc0d5"
    | project 
        Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id)), 
        ResourceType = tolower(split(id,"/").[6]), 
        subscriptionId, 
        status = properties.status.code,
        Repo = properties.additionalData.artifactDetails.repositoryName, 
        imageUri = properties.resourceDetails.id
    | where status == 'Healthy' 

Compter les images vulnérables par gravité

Qualys
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | extend status = tostring(parse_json(properties).status.code)
    | extend severity = tostring(parse_json(properties).status.severity)
    | extend vulId=tostring((properties).id)
    | extend Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id))
    | where assessmentKey == "dbd0cb49-b563-45e7-9724-889e799fa648"
    | where status == 'Unhealthy' 
    | distinct 
        vulId, 
        severity
    | summarize count=count() by tostring(severity)
Gestion des vulnérabilités Microsoft Defender
securityresources
    | where type == "microsoft.security/assessments/subassessments"
    | extend assessmentKey = extract(".*assessments/(.+?)/.*",1,  id)
    | extend severity = tostring(properties.additionalData.vulnerabilityDetails.severity)
    | extend status = tostring(parse_json(properties).status.code)
    | extend vulId=tostring((properties).id)
    | extend Resource = tolower(extract(@'(?i)(.*?)/providers/Microsoft.Security/([^/]+)', 1, id))
    | where assessmentKey == "c0b7cfc6-3172-465a-b378-53c7ff2cc0d5"
    | where status == 'Unhealthy' 
    | distinct 
        vulId, 
        severity
    | summarize count=count() by tostring(severity)

Afficher le pod, le conteneur et l’espace de noms pour une image vulnérable en cours d’exécution sur le cluster AKS

Qualys
securityresources 
| where type =~ "microsoft.security/assessments/subassessments"
| extend assessmentKey = extract(@"(?i)providers/Microsoft.Security/assessments/([^/]*)", 1, id),
         subAssessmentId = tostring(properties.id),
         parentResourceId = extract("(.+)/providers/Microsoft.Security", 1, id)
| extend resourceId = extract(@'(?i)(.*?)@([^/]+)', 1,tostring(properties.resourceDetails.id))
| extend severity = tostring(parse_json(properties).status.severity)
| extend VulnId = tostring(parse_json(properties).id)
| extend status = tostring(parse_json(properties).status.code)
| where assessmentKey == "41503391-efa5-47ee-9282-4eff6131462c"
| extend resourceId = tostring(properties.resourceDetails.id),
         parsedJson = parse_json(tostring(properties.additionalData))
| extend containerData = parse_json(tostring(parsedJson.data.Containers))
| mv-expand containerDetails = containerData to typeof(dynamic)
| extend ContainerName = tostring(containerDetails.Name),
         ContainerPod = tostring(containerDetails.Pod.Name),
         Namespace = tostring(containerDetails.Pod.Namespace),
         ControllerType = tostring(containerDetails.Pod.ControllerType),
         ControllerName = tostring(containerDetails.Pod.ControllerName)
| where status == 'Unhealthy'
|project Image=resourceId, VulnId,severity, Namespace, ContainerName, ContainerPod,ControllerName,ControllerType

Gestion des vulnérabilités Microsoft Defender
securityresources 
| where type =~ "microsoft.security/assessments/subassessments"
| extend assessmentKey=extract(@"(?i)providers/Microsoft.Security/assessments/([^/]*)", 1, id)
| where assessmentKey == "c0b7cfc6-3172-465a-b378-53c7ff2cc0d5" 
| extend azureClusterId = tostring(properties.additionalData.clusterDetails.clusterResourceId)
| extend cve =tostring(properties.id)
| extend status = properties.status.code
| extend severity=tostring(parse_json(properties).additionalData.vulnerabilityDetails.severity)
| where status == "Unhealthy"
| extend azureImageId = tostring(properties.resourceDetails.id)
| extend severity = tolower(properties.additionalData.vulnerabilityDetails.severity)
| extend kubernetesContext = properties.additionalData.kubernetesContext
| mv-expand workload = kubernetesContext.workloads
| mv-expand OwnedResource = workload.ownedResources
| mv-expand OwnedContainer = OwnedResource.containers                    
| mv-expand Container = workload.containers                    
| extend isController = isnotempty(workload.ownedResources)
| extend namespace =  tostring(workload.namespace)
| extend podName = iff(isController, tostring(OwnedResource.name), workload.name)
| extend containerName = iff(isController, tostring(OwnedContainer.name), Container.name)
| extend controllerName =  iff(isController, tostring(workload.name),"") 
| extend controllerType =  iff(isController, tostring(workload.kind),"")                       
| extend imageName = extract("(.+)@sha256:", 1, azureImageId) 
| project imageName, cve, severity, clusterId = azureClusterId, containerName, podName, controllerName, controllerType, namespace

Étape 3 : (facultatif) Création de rapports de sécurité des conteneurs

Microsoft Defender pour le cloud fournit des rapports prêts à l’emploi via des classeurs Azure, y compris un classeur Sécurité des conteneurs.

Screenshot of Container Security workbook.

Ce classeur inclut les résultats de l’analyse des vulnérabilités des conteneurs du registre et ceux qui sont en cours d’exécution.

Screenshot of workbook including container vulnerability scanning results.

Le classeur fournit les résultats de l’analyse de Gestion des vulnérabilités Microsoft Defender, offrant une vue d’ensemble complète des vulnérabilités détectées dans vos images conteneur du registre Azure. Le classeur Sécurité des conteneurs offre les avantages suivants pour l’évaluation des vulnérabilités des conteneurs :

  • Vue d’ensemble de toutes les vulnérabilités : visualisez toutes les vulnérabilités détectées dans vos registres de conteneurs Azure et en cours d’exécution sur le cluster AKS.

  • Tableau de bord des vulnérabilités exploitables : une section dédiée mettant en évidence les vulnérabilités avec des attaques connues, ce qui permet aux équipes de sécurité de se concentrer sur les vulnérabilités qui présentent un risque élevé d’exploitation. Cette fonction est disponible seulement avec l’analyse de l’évaluation des vulnérabilités des conteneurs effectuée par Gestion des vulnérabilités Microsoft Defender.

    Screenshot of exploitable vulnerabilities dashboard.

  • Requêtes ARG supplémentaires : vous pouvez utiliser ce classeur pour voir d’autres exemples d’interrogation des données ARG entre Qualys et Gestion des vulnérabilités Microsoft Defender. Pour plus d’informations sur la modification des classeurs, consultez Galerie de classeurs dans Microsoft Defender pour le cloud.

Étapes suivantes