次の方法で共有


トラフィック分析を通じて Azure ネットワークをセグメント化するためにゼロ トラスト原則を適用する

ゼロ トラストは 1 つのセキュリティ戦略です。 これは、製品やサービスではなく、次の一連のセキュリティ原則を設計および実装する手法です。

原則 説明
明示的に検証する すべての使用可能なデータ ポイントに基づいて、常に認証と承認を行います。
最小特権アクセスを使用する Just-In-Time および Just-Enough-Access (JIT/JEA)、リスクベースの適応型ポリシー、データ保護を使用して、ユーザーのアクセスを制限します。
侵害を前提とする 影響範囲を最小限に抑えるために、アクセスをセグメント化します。 エンドツーエンドの暗号化を検証し、分析を使用して可視性を取得し、脅威検出を推進し、防御を強化します。

ゼロ トラストにより、既定での信頼から、例外での信頼の観点へ移行できます。 これらの例外とアラートを自動的に管理するための統合された機能は重要です。 脅威を検出し、脅威に対応し、組織全体で望ましくないイベントを防止またはブロックすることが、さらに簡素化されます。

Azure のクラウド ネットワークは、境界または信頼ゾーンとして機能させることが可能な、セグメント化の複数のレイヤーを使用し設計されています。 ゼロ トラスト原則を使用して Azure ベースのネットワークをセグメント化する方法の詳細については、「Azure ベースのネットワーク通信のセグメント化に対するゼロ トラスト原則の適用」を参照してください。

ゼロ トラスト成熟度モデル

Cybersecurity & Infrastructure Security Agency (CISA) のゼロ トラスト成熟度モデル (ZTMM) は、ゼロ トラスト保護領域を拡張する機能を含む 5 つの柱に基づいて構築されています。 詳細については、「CISA ゼロ トラスト成熟度モデルの Microsoft クラウド サービスを構成する」を参照してください

  • アイデンティティ
  • デバイス
  • ネットワーク
  • アプリケーションとワークロード
  • データ

これらの柱は ZTMM の体験での 4 つの段階を網羅します。 詳細については、「ZTMM 体験ステージ」を参照してください。

  • Traditional
  • Initial
  • アドバンスド
  • Optimal

これら 4 つのステージは、以下に示すネットワークの柱に適用されます。

段階 ネットワークの柱
Traditional - 大きな境界/マクロセグメント化
- 回復性がは限され、ルールセットと構成が手動で管理される
Initial - クリティカルなワークロードの初期分離
- ネットワーク機能が、より多くのアプリケーションの可用性の要求を管理
- 部分的な動的ネットワーク構成
アドバンスド - 分離と回復性のメカニズムを拡張
- リスクに対応したアプリケーション プロファイルの評価に基づいて構成を調整
Optimal - Just-in Time および Just Enough のアクセス制御と回復性に比例したマイクロ境界の分散
- 構成はアプリケーション プロファイルのニーズに合わせて進化

トラフィック分析を使用してゼロ トラスト セキュリティを実現する方法について

Traffic Analytics は、Azure 環境内のネットワーク トラフィック フローに関する分析情報を提供します。 これは仮想ネットワーク フロー ログを使用し集計を実行して、主要なトラフィック パターンを維持しながらデータ 量を削減します。 集計されたログは、地理、セキュリティ、トポロジ情報を追加された後に、Log Analytics ワークスペースに保存されます。

トラフィック パターンは、組み込みのダッシュボードを使用して視覚化され、Azure Workbooks を使用してトラフィックの分析情報を柔軟にカスタマイズできます。 トラフィック分析ダッシュボードでは、潜在的なセキュリティ侵害に対応してアラートを構成し、調査を開始することもできます。

  • ネットワーク トラフィックの監視: フロー ログを使用して受信トラフィックと送信トラフィックをキャプチャし、トラフィック分析を使用してこのデータを処理および視覚化します。 通信パターン、帯域幅の使用状況、ワークロード間のトラフィック フローに関する分析情報を取得します。

  • ワークロード通信パターンの特定: トラフィック分析データを分析して、リソースがテナント、サブスクリプション リージョン、仮想ネットワーク、サブネット、プロトコル、セキュリティ ベースのグループ、サービス、アプリケーション間でどのように通信しているかを把握します。 潜在的なセキュリティ リスクを示す可能性のある、不要または異常なトラフィック パターンを特定します。

  • 洞察を含む視覚化: トラフィック分析内で、組み込みのカスタマイズ可能な視覚化を使用して、トラフィック パターンを調査し異常をより効果的に検出します。

  • 侵害された IP/リソースの検出: トラフィック分析を使用して、侵害された可能性のある IP アドレスまたはリソースを特定し、セキュリティの強化とパフォーマンスの維持を助けます。

Traffic Analytics を使用してゼロ トラスト セグメンテーション (ZTS) をデプロイする方法

既存または新規の Azure デプロイ ユーザーに対してゼロ トラスト セグメント化をデプロイするための最初の重要な手順として、

  • Traffic Analytics を使用してパターンを観察する: フロー ログを分析して、ワークロードに不可欠なトラフィック パターンを特定します。

  • 既定の拒否体制から始める: トラフィックを広範に許可する既存の受信規則と送信規則をすべて削除または無効化し (たとえば、すべて許可、許可)、受信トラフィックと送信トラフィックの両方に対して明示的な拒否規則を追加することから始めます

  • 選択的許可ルールの作成: 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