共用方式為


運用零信任原則以流量分析區隔 Azure 網路

零信任是安全性策略。 這不是產品或服務,而是設計和實作下列一組安全性原則的方法。

原則 說明
明確驗證 一律根據所有可用的數據點進行驗證和授權。
使用最低權限存取權 使用 Just-In-Time 和 Just-Enough-Access (JIT/JEA)、風險型調適型原則以及資料保護來限制使用者存取權。
假設系統已遭突破 將爆炸半徑降至最低,並分隔存取權限。 確認端對端加密,並使用分析來取得可見度、驅動威脅偵測,以及改善防禦。

使用零信任時,您會從預設信任觀點移至依例外狀況信任觀點。 自動管理這些例外狀況和警示的整合功能很重要。 您可以更輕鬆地偵測威脅、回應威脅,以及防止或封鎖整個組織內不想要的事件。

Azure 的雲端網路是設計成多層分割,可作為界限或信任區域。 如需使用零信任原則分割 Azure 型網路的詳細資訊,請參閱 將零信任原則套用至分割以 Azure 為基礎的網路通訊

零信任成熟度模型

網路安全與基礎結構安全機構(CISA)零信任成熟度模型(ZTMM)是以五大支柱為基礎,其中包含增強零信任保護領域的功能。 如需詳細資訊,請參閱 設定 CISA 零信任成熟度模型的Microsoft雲端服務

  • 身份
  • 設備
  • 網路
  • 應用程式和工作負載
  • 資料

柱子跨越 ZTMM 旅程的四個階段。 如需詳細資訊,請參閱 ZTMM 旅程階段

  • 傳統
  • 初始
  • 進階
  • 最佳

這四個階段適用於 網路 支柱,如下所示:

舞臺 網路支柱
傳統 - 大型周邊/巨型分割
- 有限的復原能力和手動管理的規則集和設定
初始 - 重大工作負載的初始隔離
- 網路功能可管理更多應用程式的可用性需求
- 部分動態網路設定
進階 - 展開隔離和復原機制
- 根據風險感知應用程式設定檔評估調整設定
最佳 - 使用 Just-in-time 和剛好足夠的存取控制及成比例的韌性散發微型周邊
- 組態演進以符合應用程式配置檔需求

如何使用流量分析來達成零信任安全性?

Traffic Analytics 為您的 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 監視器互動。 這些深入解析可協助您瞭解服務相依性、偵測非預期或異常的流量模式,以及透過微分割強制執行更細微的安全策略。

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