다음을 통해 공유


트래픽 분석을 통해 Azure 네트워크를 분할하는 제로 트러스트 원칙 적용

제로 트러스트는 보안 전략입니다. 제품이나 서비스가 아니라 다음 보안 원칙 집합을 디자인하고 구현하는 접근 방식입니다.

원리 설명
명시적으로 확인 항상 사용 가능한 모든 데이터 요소를 기반으로 인증하고 권한을 부여합니다.
최소 권한 액세스 사용 JIT/JEA(Just-In-Time and Just-Enough-Access), 위험 기반 적응 정책 및 데이터 보호를 사용하여 사용자 액세스를 제한합니다.
침해 발생을 가정하다 폭발 반경 및 세그먼트 액세스를 최소화합니다. 엔드 투 엔드 암호화를 확인하고 분석을 사용하여 가시성을 확보하고 위협 탐지를 추진하며 방어를 개선합니다.

제로 트러스트를 사용하면 기본 신뢰 관점에서 예외별 신뢰 관점으로 이동합니다. 이러한 예외 및 경고를 자동으로 관리하는 통합 기능이 중요합니다. 위협을 보다 쉽게 감지하고, 위협에 대응하고, 조직 전체에서 원치 않는 이벤트를 방지하거나 차단할 수 있습니다.

Azure의 클라우드 네트워킹은 경계 또는 신뢰 영역 역할을 할 수 있는 여러 계층의 분할로 설계되었습니다. 제로 트러스트 원칙을 사용하여 Azure 기반 네트워크를 분할하는 방법에 대한 자세한 내용은 Azure 기반 네트워크 통신 분할에 제로 트러스트 원칙 적용을 참조하세요.

제로 트러스트 완성도 모델

CISA(사이버 보안 및 인프라 보안 기관) ZTMM(제로 트러스트 완성 모델)은 제로 트러스트 보호 영역을 향상시키기 위한 기능을 포함하는 5가지 핵심 요소를 기반으로 합니다. 자세한 내용은 CISA 제로 트러스트 완성 모델에 대한 Microsoft 클라우드 서비스 구성을 참조하세요.

  • 아이덴티티
  • 기기
  • 네트워크
  • 애플리케이션 및 워크로드
  • 데이터

기둥은 ZTMM 여정의 4단계에 걸쳐 있습니다. 자세한 내용은 ZTMM 여정 단계를 참조하세요.

  • 기존
  • Initial
  • 고급
  • 최적

네 단계는 다음과 같이 네트워크 핵심 요소에 적용됩니다.

단계 네트워크 핵심 요소
기존 - 넓은 경계/매크로 분할
- 제한된 복원력 및 수동으로 관리되는 규칙 집합 및 구성
Initial - 중요한 워크로드의 초기 격리
- 네트워크 기능은 더 많은 애플리케이션에 대한 가용성 요구를 관리합니다.
- 부분 동적 네트워크 구성
고급 - 격리 및 복원력 메커니즘 확장
- 구성은 위험 인식 애플리케이션 프로필 평가에 따라 조정됩니다.
최적 - 적시에 적절한 액세스 제어와 비례적 복원력을 갖춘 마이크로 경계 배포
- 애플리케이션 프로필 요구 사항을 충족하도록 구성이 발전합니다.

트래픽 분석을 사용하여 제로 트러스트 보안을 달성하려면 어떻게 해야 할까요?

Traffic Analytics는 Azure 환경 내의 네트워크 트래픽 흐름에 대한 인사이트를 제공합니다. 가상 네트워크 흐름 로그를 사용하고 집계를 수행하여 주요 트래픽 패턴을 유지하면서 데이터 볼륨을 줄입니다. 그런 다음 집계된 로그는 지리적, 보안 및 토폴로지 정보로 보강되고 Log Analytics 작업 영역에 저장됩니다.

트래픽 패턴은 Azure 통합 문서를 사용하여 트래픽 인사이트를 유연하게 사용자 지정할 수 있는 기본 제공 대시보드를 사용하여 시각화됩니다. 또한 트래픽 분석 대시보드를 사용하면 잠재적인 보안 위반에 대응하여 경고를 구성하고 조사를 시작할 수 있습니다.

  • 네트워크 트래픽 모니터링: 흐름 로그를 사용하여 인바운드 및 아웃바운드 트래픽을 캡처하고 트래픽 분석을 사용하여 이 데이터를 처리하고 시각화합니다. 워크로드 전반의 통신 패턴, 대역폭 사용량 및 트래픽 흐름에 대한 인사이트를 얻습니다.

  • 워크로드 통신 패턴을 식별합니다. 트래픽 분석 데이터를 분석하여 테넌트, 구독 지역, 가상 네트워크, 서브넷, 프로토콜, 보안 기반 그룹, 서비스 및 애플리케이션 간에 리소스가 통신하는 방법을 이해합니다. 잠재적인 보안 위험을 나타낼 수 있는 불필요하거나 비정상적인 트래픽 패턴을 식별합니다.

  • 인사이트 시각화: 트래픽 분석에서 기본 제공 및 사용자 지정 가능한 시각화를 사용하여 트래픽 패턴을 탐색하고 변칙을 보다 효과적으로 검색합니다.

  • 손상된 IP/리소스 검색: 트래픽 분석을 사용하여 잠재적으로 손상된 IP 주소 또는 리소스를 식별하여 보안을 강화하고 성능을 유지합니다.

트래픽 분석을 사용하여 ZTS(제로 트러스트 세분화)를 배포하는 방법

기존 또는 새 Azure 환경에 제로 트러스트 세분화를 배포하는 첫 번째 중요한 단계로, 사용자는 필요한 작업을 수행해야 합니다.

  • 트래픽 분석을 통해 패턴 관찰: 흐름 로그를 분석하여 워크로드에 필수적인 트래픽 패턴을 식별합니다.

  • 기본 거부 자세로 시작: 트래픽을 광범위하게 허용하는 모든 기존 인바운드 및 아웃바운드 규칙을 제거하거나 사용하지 않도록 설정(예: 모두 허용, 허용)하고 인바운드 및 아웃바운드 트래픽 모두에 대한 명시적 거부 규칙을 추가하는 것으로 시작합니다.

  • 선택적 허용 규칙 만들기: Traffic Analytics의 인사이트를 기반으로 관찰되고 필요한 트래픽만 명시적으로 허용하는 규칙을 정의합니다. 이 방법을 사용하면 유효성이 검사되고 필요한 트래픽만 허용되며 명시적으로 확인의 제로 트러스트 원칙에 부합합니다.

다음 섹션에서는 트래픽 분석이 Azure에서 제로 트러스트 원칙을 구현하는 데 도움이 되는 분할을 지원하는 주요 시나리오를 강조 표시합니다.

시나리오 1: 위험하거나 제한된 지역을 통해 흐르는 트래픽 검색

트래픽 분석을 사용하여 조직의 정책에 정의된 대로 위험 수준이 높은 지역으로 들어오는 트래픽 또는 나가는 트래픽을 검색합니다. 예를 들어 조직의 보안 및 규정 준수 요구 사항에 따라 중요하거나 제한된 것으로 간주되는 지역 간 트래픽을 식별할 수 있습니다.

let ExternalIps = NTAIpDetails 
    | where Location in ("country1", "country2") 
    | where FlowType in ("MaliciousFlow", "ExternalPublic")
        //and FlowIntervalStartTime between (datetime('{timeInterval') .. datetime('{timeInterval'))
    | project-away
        TimeGenerated,
        SubType,
        FaSchemaVersion,
        FlowIntervalEndTime,
        FlowIntervalStartTime,
        FlowType,
        Type 
    | distinct Ip, ThreatType, DnsDomain, ThreatDescription, Location, PublicIpDetails, Url;
    let ExternalFlows =  NTANetAnalytics 
    //| where FlowStartTime between (datetime('{timeInterval}') .. datetime('{timeInterval}'))
    | where SubType == "FlowLog" and FlowType in ("ExternalPublic", "MaliciousFlow")
    | extend PublicIP = SrcPublicIps
    | extend ExtractedIPs = split(PublicIP, " ") // Split IPs by spaces
    | mv-expand ExtractedIPs // Expand into multiple rows
    | extend IP = tostring(split(ExtractedIPs, "|")[0])
    | extend AllSrcIps = coalesce(SrcIp, IP)
    | project 
        AllSrcIps,
        DestIp,
        SrcVm,
        DestVm,
        SrcSubscription,
        DestSubscription,FlowType; 
let SrcMalicious = ExternalFlows 
    | lookup kind=inner ExternalIps on $left.AllSrcIps == $right.Ip
    | extend CompromisedVM = iff(isnotempty(DestVm),strcat("/subscriptions/",DestSubscription,"/resourceGroups/",tostring(split(DestVm,"/")[0]),"/providers/Microsoft.Compute/virtualMachines/",tostring(split(DestVm,"/")[1])),'')
    | project
        SrcExternalIp = strcat('🌐 ', AllSrcIps),      
        DestCompromisedIp = strcat('🖥️', DestIp),
        CompromisedVM,
        PublicIpDetails,
        FlowType,
        ThreatType,
        DnsDomain,
        ThreatDescription,
        Location,
        Url;
SrcMalicious
| summarize count() by SrcExternalIp ,DestCompromisedIp, CompromisedVM,
        PublicIpDetails,
        FlowType,
        ThreatType,
        DnsDomain,
        ThreatDescription,
        Location,
        Url

시나리오 2: Azure 서비스 상호 작용에 따라 트래픽 구분 달성

트래픽 분석을 사용하여 다양한 워크로드가 Azure 서비스와 상호 작용하는 방식을 파악할 수 있습니다. 예를 들어 SAP 워크로드는 Azure Arc 인프라와 통신하는 반면 개발 환경 또는 생산성 서비스와 같은 다른 워크로드는 Azure Monitor와 상호 작용할 수 있습니다. 이러한 인사이트를 통해 서비스 종속성을 이해하고, 예기치 않거나 비정상적인 트래픽 패턴을 검색하고, 마이크로 세분화를 통해 보다 세부적인 보안 정책을 적용할 수 있습니다.

let SpecificServices = NTAIpDetails
| where FlowType == "AzurePublic"
| where FlowIntervalStartTime > ago(4h)
| project Ip, PublicIpDetails;
let PublicIPs = NTANetAnalytics
| where SubType == 'FlowLog'
| where FlowIntervalStartTime > ago(4h)
| where(isnotempty(SrcPublicIps) or isnotempty(DestPublicIps))
| extend PublicIP = coalesce(SrcPublicIps, DestPublicIps), Vnet = iff(isnotempty(SrcSubnet), strcat("/subscriptions/", SrcSubscription, "/resourceGroups/", tostring(split(SrcSubnet, "/")[0]), "/providers/Microsoft.Network/virtualNetworks/", tostring(split(SrcSubnet, "/")[1])), iff(isnotempty(DestSubnet), strcat("/subscriptions/", DestSubscription, "/resourceGroups/", tostring(split(DestSubnet, "/")[0]), "/providers/Microsoft.Network/virtualNetworks/", tostring(split(DestSubnet, "/")[1])),''))
| extend ExtractedIPs = split(PublicIP, " ") // Split IPs by spaces
| mv-expand ExtractedIPs // Expand into multiple rows
| extend IP = tostring(split(ExtractedIPs, "|")[0]) // Extract IP address
| lookup kind=inner SpecificServices on $left.IP == $right.Ip
| project Vnet, PublicIpDetails;
PublicIPs
| summarize CounterValue = count() by Vnet, PublicIpDetails
| top 100 by CounterValue desc

시나리오 3: 네트워크 위반 시 폭발 반경 식별

트래픽 분석을 사용하여 리소스와 통신하려고 하는 잠재적으로 악의적인 IP 주소의 경로를 추적합니다. 손상된 가상 머신(VM)의 경우, 트래픽 분석을 통해 지난 24시간 동안 해당 VM에서 시작된 모든 통신을 매핑하여 잠재적인 데이터 유출을 식별하고, 보안 침해의 영향을 제한할 수 있습니다.

다음 쿼리는 위험 수준이 높은 지역에서 악의적인 흐름과 상호 작용하는 모든 직접 및 간접 IP 주소를 식별합니다.

let MAliciousIps = NTAIpDetails 
| where FlowIntervalStartTime between (datetime('{timeInterval:startISO}') .. datetime('{timeInterval:endISO}'))
| where FlowType == "MaliciousFlow" 
| distinct Ip; 
let MaliciousFlows =  NTANetAnalytics 
| where FlowStartTime between (todatetime('{timeInterval:startISO}') .. todatetime('{timeInterval:endISO}'))
| where SubType == "FlowLog" and FlowType == "MaliciousFlow" 
| project SrcIp, DestIp, FlowLogResourceId, TargetResourceId; 
let SrcMalicious = MaliciousFlows 
| lookup kind=leftouter MAliciousIps on $left.SrcIp == $right.Ip 
| project SrcIp, DestIp; 
let DestMalicious = MaliciousFlows 
| lookup kind=leftouter MAliciousIps on $left.DestIp == $right.Ip 
| project SrcIp, DestIp; 
let MaliciousIps = SrcMalicious 
| union DestMalicious 
| distinct *; 
let SpecificCountryIPs = NTAIpDetails 
| where Location in ("country1", "country2") 
| project Ip; 
let SrcIpCountry = SpecificCountryIPs 
| join kind=inner NTANetAnalytics on $left.Ip == $right.SrcIp 
| project SrcIp, DestIp; 
let DestIpCountry = SpecificCountryIPs 
| join kind=inner NTANetAnalytics on $left.Ip == $right.DestIp 
| project SrcIp, DestIp; 
let SpecificCountryFlows = SrcIpCountry 
| union DestIpCountry; 
let MaliciousFlowsObserved = MaliciousIps 
| union SpecificCountryFlows 
| distinct SrcIp, DestIp; 
let MaliciousFlowsTransitive = MaliciousFlowsObserved 
| join kind=inner MaliciousFlowsObserved on $left.DestIp == $right.SrcIp 
| project SrcIp, DestIp = DestIp1 
| distinct SrcIp, DestIp; 
let MaliciousFlowsObserved1 = MaliciousFlowsObserved 
| union MaliciousFlowsTransitive 
| distinct SrcIp, DestIp; 
let MaliciousFlowsTransitive1 = MaliciousFlowsObserved1 
| join kind=inner MaliciousFlowsObserved1 on $left.DestIp == $right.SrcIp 
| project SrcIp, DestIp = DestIp1 
| distinct SrcIp, DestIp; 
let MaliciousFlowsObserved2 = MaliciousFlowsObserved1 
| union MaliciousFlowsTransitive1 
| distinct SrcIp, DestIp; 
MaliciousFlowsObserved2 
| project SrcIp = strcat('🖥️ ', SrcIp), DestIp = strcat('🖥️ ', DestIp)

시나리오 4: 구독 경계 적용

트래픽 분석을 사용하여 구독 경계를 적용하고 서로 다른 Azure 구독 간의 트래픽이 제대로 분할되었는지 확인합니다.

NTANetAnalytics 
| where SubType == "FlowLog"  and FlowType !in ("AzurePublic","ExternalPublic","Unknown","UnknownPrivate") // Filter to flows for which we know the Subscription Details
| where FlowStartTime between (start .. end) 
| where AclGroup !contains "Unspecified" 
|extend Dest = iff(isnotempty(DestSubnet),strcat("/subscriptions/",DestSubscription,"/resourceGroups/",tostring(split(DestSubnet,"/")[0]),"/providers/Microsoft.Network/virtualNetworks/",tostring(split(DestSubnet,"/")[1])),'')
| extend Src = iff(isnotempty(SrcSubnet),strcat("/subscriptions/",SrcSubscription,"/resourceGroups/",tostring(split(SrcSubnet,"/")[0]),"/providers/Microsoft.Network/virtualNetworks/",tostring(split(SrcSubnet,"/")[1])),'')
| extend SrcSubscription = strcat("/subscriptions/",SrcSubscription), DestSubscription = strcat("/subscriptions/",DestSubscription)
| where SrcSubscription != DestSubscription // Cross Subscription
| summarize Flows = sum(CompletedFlows) by Src, Dest, SrcSubscription, DestSubscription, AclGroup,AclRule, FlowType
//| top 10 by Flows