你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

应用零信任原则通过流量分析细分 Azure 网络

零信任是一种安全策略。 它不是产品或服务,而是设计和实现以下一组安全原则的方法。

原则 DESCRIPTION
明确地验证 始终根据所有可用的数据点进行身份验证和授权。
使用最小特权访问 使用实时和恰好足够的访问权限 (JIT/JEA)、基于风险的自适应策略和数据保护,来限制用户访问。
假定已发生安全漏洞 最大限度地减少影响范围,并对访问进行分段。 验证端到端加密,并使用分析来获取可见性、推动威胁检测和改进防御。

使用零信任时,你从默认信任的视角转移到例外信任的视角。 自动管理这些异常和警报的集成功能非常重要。 可以更轻松地检测威胁、响应威胁,以及防止或阻止整个组织中的意外事件。

Azure 的云网络设计了多层分段,这些分段可以充当边界或信任区域。 有关使用零信任原则对基于 Azure 的网络进行分段的详细信息,请参阅 “应用零信任原则”来分段基于 Azure 的网络通信

零信任成熟度模型

网络安全与基础结构安全机构(CISA)零信任成熟度模型(ZTMM)建立在五大支柱之上,包括增强零信任保护领域的功能。 有关详细信息,请参阅 为 CISA 零信任成熟度模型配置Microsoft云服务

  • 身份
  • 设备
  • 网络
  • 应用程序和工作负载
  • 数据

支柱跨越 ZTMM 旅程的四个阶段。 有关详细信息,请参阅 ZTMM 历程阶段

  • 传统
  • 初始
  • 高级
  • 最佳

这四个阶段适用于 网络 支柱,如下所示:

阶段 网络支柱
传统 - 大周边/宏分段
- 有限的复原能力和手动管理的规则集和配置
初始 - 关键工作负荷的初始隔离
- 网络功能管理更多应用程序的可用性需求
- 部分动态网络配置
高级 - 扩展隔离和复原机制
- 配置根据风险感知应用程序配置文件评估进行调整
最佳 - 及时、适度的访问控制和相应的复原能力来分配微周边
- 配置不断演变以满足应用程序配置文件的需求

如何使用流量分析实现零信任安全性?

流量分析提供对 Azure 环境中网络流量流的见解。 它使用虚拟网络流日志并执行聚合来减少数据量,同时保留关键流量模式。 然后,聚合日志使用地理、安全性和拓扑信息进行扩充,并存储在 Log Analytics 工作区中。

流量模式是使用内置仪表板可视化的,可以灵活地使用 Azure 工作簿自定义流量见解。 流量分析仪表板还允许你配置警报并启动调查,以响应潜在的安全漏洞。

  • 监视网络流量: 使用流日志捕获入站和出站流量,并使用流量分析来处理和可视化此数据。 深入了解跨工作负荷的通信模式、带宽使用情况和流量流。

  • 确定工作负荷通信模式: 分析流量分析数据,以了解资源在租户、订阅区域、虚拟网络、子网、协议、基于安全性的组、服务和应用程序之间的通信方式。 识别可能指示潜在安全风险的不必要的或异常的流量模式。

  • 深刻的可视化效果: 使用流量分析中的内置且可自定义的可视化效果来更有效地探索流量模式并检测异常。

  • 检测遭到入侵的 IP/资源: 使用流量分析来识别可能遭到入侵的 IP 地址或资源,帮助加强安全性和维护性能。

如何使用流量分析部署零信任分段(ZTS) ?

在现有或新的 Azure 部署上部署零信任分段时,第一个关键部署是用户需要

  • 通过流量分析观察模式:分析流日志,以确定对工作负荷至关重要的流量模式。

  • 从默认拒绝状态开始:从删除或禁用允许流量广泛(例如,允许所有、允许)的所有现有入站和出站规则开始,并为入站和出站流量添加显式拒绝规则

  • 创建选择性允许规则:根据来自流量分析的见解,定义仅允许观察到和必要的流量的规则。 此方法可确保仅允许经过验证的所需流量,这与显式验证的零信任原则保持一致。

以下部分重点介绍了流量分析支持分段以帮助在 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)遭到入侵,流量分析可以帮助映射该 VM 在过去 24 小时内启动的所有通信,帮助识别潜在的数据外泄和限制爆炸半径。

以下查询标识与来自高风险地理位置的恶意流交互的所有直接和间接 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