Übergang zum Microsoft Defender-Sicherheitsrisikomanagement

Microsoft Defender für Cloud vereinheitlicht alle Lösungen zur Sicherheitsrisikobewertung, um den Sicherheitsrisikoverwaltungsscanner von Microsoft Defender zu nutzen.

Das Microsoft Defender-Sicherheitsrisikomanagement ist in viele cloudeigene Anwendungsfälle integriert, z. B. Container für Liefer- und Laufzeitszenarien.

Die Defender for Cloud Containers-Sicherheitsrisikobewertung unterstützt von Qualys ist jetzt außer Kraft gesetzt. Wenn Sie noch nicht zuSicherheitsrisikenbewertungen für Azure mit Microsoft Defender-Sicherheitsrisikobewertung übergegangen sind, führen Sie die Schritte auf der Seite aus, um den Übergang zu unternehmen.

Schritt 1: Überprüfen, ob das Scannen aktiviert ist

Die Überprüfung der Sicherheitsrisikobewertung von Containern, die von Microsoft Defender-Sicherheitsrisikoverwaltung unterstützt wird, ist standardmäßig für Defender für Container, Defender for Container Registries (veraltet) und Defender Cloud Security Posture Management aktiviert. Organisationen, die sie deaktiviert haben, müssen die Sicherheitsrisikobewertung für agentenlose Container in einem der Pläne erneut aktivieren. Es wird automatisch für alle erwähnten Pläne aktiviert.

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

Weitere Informationen zum Aktivieren der Überprüfung von Microsoft Defender-Sicherheitsrisiken finden Sie unter Aktivieren der Sicherheitsrisikobewertung, die von Microsoft Defender-Sicherheitsrisikoverwaltung unterstützt wird.

Schritt 2: (Optional) Rest-API und Azure Resource Graph-Abfragen aktualisieren

Wenn Sie programmgesteuert über die Rest-API von Azure Resource Graph (ARG) oder Unterassessment-REST-API oder ARG-Abfragen auf Container-Sicherheitsrisikobewertungsergebnisse zugreifen, müssen Sie Ihre vorhandenen Abfragen so aktualisieren, dass sie mit dem neuen Schema und/oder der REST-API übereinstimmen, die von der neuen Sicherheitsrisikobewertung des Containers bereitgestellt wird, die von Microsoft Defender-Sicherheitsrisikoverwaltung unterstützt wird.

Der nächste Abschnitt enthält einige Beispiele, die ihnen helfen können, zu verstehen, wie vorhandene Abfragen für das Qualys-Angebot in gleichwertige Abfragen mit dem Microsoft Defender-Sicherheitsrisikoverwaltungsangebot übersetzt werden sollen.

Beispiele für ARG-Abfragen

Alle Azure Resource Graph-Abfragen, die für die Berichterstellung verwendet werden, sollten aktualisiert werden, um die zuvor aufgeführten Bewertungsschlüssel für die Sicherheitsrisikoverwaltung von Microsoft Defender widerzuspiegeln. Im Folgenden sind Beispiele aufgeführt, die Ihnen beim Übergang zu Microsoft Defender-Sicherheitsrisikoverwaltungsabfragen helfen.

Anzeigen fehlerhafter Containerimages

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' 
Microsoft Defender-Sicherheitsrisikomanagement
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' 

Anzeigen fehlerfreier Containerimages

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'
Microsoft Defender-Sicherheitsrisikomanagement
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' 

Anzahl anfälliger Images nach Schweregrad

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)
Microsoft Defender-Sicherheitsrisikomanagement
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)

Anzeigen von Pods, Containern und Namespaces für ein ausgeführtes anfälliges Image im AKS-Cluster

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

Microsoft Defender-Sicherheitsrisikomanagement
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

Schritt 3: (Optional) Containersicherheitsberichte

Microsoft Defender for Cloud bietet standardmäßig Berichte über Azure Workbooks, einschließlich eines Container Security Workbooks.

Screenshot of Container Security workbook.

Diese Arbeitsmappe enthält Ergebnisse der Überprüfung von Containerrisiken sowohl aus der Registrierung als auch aus der Laufzeit.

Screenshot of workbook including container vulnerability scanning results.

Die Arbeitsmappe bietet Ergebnisse aus der Überprüfung der Microsoft Defender-Sicherheitsrisikoverwaltung und bietet einen umfassenden Überblick über Sicherheitsrisiken, die in Ihren Azure Registry-Containerimages erkannt wurden. Die Containersicherheitsarbeitsmappe bietet die folgenden Vorteile für die Sicherheitsbewertung von Containern:

  • Übersicht über alle Sicherheitsrisiken: Zeigen Sie alle Sicherheitsrisiken an, die in Ihren Azure-Containerregistrierungen erkannt und auf dem AKS-Cluster ausgeführt werden.

  • Dashboard für ausnutzbare Schwachstellen: Ein dezidierter Bereich, der Schwachstellen mit bekannten Ausnutzungsmöglichkeiten hervorhebt und es Sicherheitsteams ermöglicht, sich auf Schwachstellen zu konzentrieren, die ein hohes Risiko der Ausnutzung darstellen. Dies ist nur bei der Überprüfung der Sicherheitsrisikobewertung des Containers verfügbar, die von Microsoft Defender-Sicherheitsrisikoverwaltung unterstützt wird.

    Screenshot of exploitable vulnerabilities dashboard.

  • Zusätzliche ARG-Abfragen: Sie können diese Arbeitsmappe verwenden, um weitere Beispiele zum Abfragen von ARG-Daten zwischen Qualys und Microsoft Defender-Sicherheitsrisikoverwaltung anzuzeigen. Weitere Informationen zum Bearbeiten von Arbeitsmappen finden Sie im Arbeitsmappenkatalog in Microsoft Defender für Cloud.

Nächste Schritte