다음을 통해 공유


Microsoft Defender 취약성 관리로 전환

클라우드용 Microsoft Defender는 Microsoft Defender 취약성 관리 취약성 스캐너를 활용하기 위해 모든 취약성 평가 솔루션을 통합하고 있습니다.

Microsoft Defender 취약성 관리는 컨테이너 제공 및 런타임 시나리오와 같은 여러 클라우드 네이티브 사용 사례에 통합됩니다.

Qualys에서 제공하는 클라우드용 Defender Containers 취약성 평가는 이제 사용 중지되었습니다. 아직 Microsoft Defender 취약성 관리를 사용하는 Azure에 대한 취약성 평가로 전환하지 않은 경우 페이지의 단계에 따라 전환합니다.

1단계: 검사가 사용하도록 설정되어 있는지 확인

Microsoft Defender 취약성 관리에서 제공하는 컨테이너 취약성 평가 검사는 기본적으로 컨테이너용 Defender, 컨테이너 레지스트리용 Defender(사용 중단) 및 Defender CSPM에 대해 사용하도록 설정됩니다. 사용하지 않도록 설정한 조직은 플랜 중 하나에서 에이전트 없는 컨테이너 취약성 평가를 다시 사용하도록 설정해야 합니다. 이 설정은 언급된 활성화된 플랜에 자동으로 반영됩니다.

설정에서

Microsoft Defender 취약성 관리 검사를 사용하도록 설정하는 방법에 대한 자세한 내용은 Microsoft Defender 취약성 관리에서 제공하는 취약성 평가 사용을 참조하세요.

2단계: (선택 사항) REST API 및 Azure Resource Graph 쿼리 업데이트

ARG(Azure Resource Graph) Rest API 또는 Subassessment REST API나 ARG 쿼리를 통해 Qualys에서 컨테이너 취약성 평가 결과에 프로그래밍 방식으로 액세스한 경우 Microsoft Defender 취약성 관리 기반의 새 컨테이너 취약성 평가에서 제공하는 새 스키마 및/또는 REST API와 일치하도록 기존 쿼리를 업데이트해야 합니다.

다음 섹션에는 Qualys 기반 제품에 대한 기존 쿼리를 Microsoft Defender 취약성 관리 기반 제품과 동등한 쿼리로 변환하는 방법을 이해하는 데 도움이 되는 몇 가지 예제가 포함되어 있습니다.

ARG 쿼리 예

보고용으로 사용되는 모든 Azure Resource Graph 쿼리는 이전에 나열된 Microsoft Defender 취약성 관리 평가 키를 반영하도록 업데이트해야 합니다. 다음은 Microsoft Defender 취약성 관리 쿼리로 전환하는 데 도움이 되는 예입니다.

비정상 컨테이너 이미지 표시

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 취약성 관리
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' 

정상 컨테이너 이미지 표시

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 취약성 관리
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' 

심각도별로 취약한 이미지 수 계산

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 취약성 관리
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)

AKS 클러스터에서 실행 중인 취약한 이미지의 Pod, 컨테이너 및 네임스페이스 보기

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 취약성 관리
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

3단계: (선택 사항) 컨테이너 보안 보고

클라우드용 Microsoft Defender는 Azure Workbooks를 통해 컨테이너 보안 통합 문서를 포함한 기본 제공 보고를 제공합니다.

컨테이너 보안 통합 문서의 스크린샷.

이 통합 문서에는 레지스트리 및 런타임의 컨테이너 취약성 검사 결과가 포함되어 있습니다.

컨테이너 취약성 검사 결과가 포함된 통합 문서의 스크린샷.

통합 문서는 Microsoft Defender 취약성 관리 검사의 결과를 제공하여 Azure 레지스트리 컨테이너 이미지 내에서 검색된 취약성에 대한 포괄적인 개요를 제공합니다. 컨테이너 보안 통합 문서는 컨테이너 취약성 평가에 다음과 같은 이점을 제공합니다.

  • 모든 취약성의 개요: AKS 클러스터에서 실행되고 여러 Azure 컨테이너 레지스트리에서 검색되는 모든 취약성을 확인합니다.

  • 악용 가능한 취약성 대시보드: 알려진 익스플로잇에 의한 취약성을 강조 표시하는 전용 섹션으로, 보안 팀이 악용 위험이 높은 취약성에 집중할 수 있도록 합니다. 이 기능은 Microsoft Defender 취약성 관리에서 제공하는 컨테이너 취약성 평가 검사에서만 사용할 수 있습니다.

    익스플로잇 가능한 취약성 대시보드의 스크린샷.

  • 추가 ARG 쿼리: 이 통합 문서를 사용하여 Qualys와 Microsoft Defender 취약성 관리 간에 ARG 데이터를 쿼리하는 방법에 대한 더 많은 예제를 볼 수 있습니다. 통합 문서를 편집하는 방법에 대한 자세한 내용은 클라우드용 Microsoft Defender 통합 문서 갤러리를 참조하세요.

다음 단계