<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Containment on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/containment/</link><description>Recent content in Containment on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +1000</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/containment/rss.xml" rel="self" type="application/rss+xml"/><item><title>Designing Networks That Fail Predictably</title><link>https://blog.brewedinthecloud.com/p/network-fails-designing-predictability/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-designing-predictability/</guid><description>&lt;p&gt;Every network fails eventually.&lt;/p&gt;
&lt;p&gt;Sometimes it’s physical. Sometimes it’s logical. Often it’s self‑inflicted, a containment rule pushed with the best intentions that quietly turns into a kill switch.&lt;/p&gt;
&lt;p&gt;The difference between a survivable incident and a chaotic one isn’t whether the network failed. It’s whether the failure behaved the way you &lt;em&gt;expected&lt;/em&gt; it to.&lt;/p&gt;
&lt;p&gt;Predictable failure isn’t about being pessimistic. It’s about staying in control when parts of the system are no longer trustworthy.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Common assumption:&lt;/strong&gt;&lt;br&gt;
“If we design enough resilience and security into the network, failure becomes unlikely and manageable when it happens.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Resilience delays failure; it doesn’t define its shape.&lt;/p&gt;
&lt;p&gt;As Azure networks grow, they accumulate invisible dependencies: centralised inspection, forced tunnelling, identity‑driven policy, platform service reachability. Under stress, those dependencies don’t fail cleanly. They fail &lt;em&gt;asymmetrically&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Some flows work. Others silently die. And the controls meant to protect you become the fastest way to lose visibility and access.&lt;/p&gt;
&lt;p&gt;Predictable failure starts by accepting that &lt;strong&gt;not all controls deserve to survive an incident&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In real incidents, containment actions usually remove connectivity faster than they restore clarity.&lt;/p&gt;
&lt;p&gt;The most common pattern looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Suspicious activity is detected&lt;/li&gt;
&lt;li&gt;Egress is tightly constrained or forced through central inspection&lt;/li&gt;
&lt;li&gt;A dependency breaks DNS, identity, logging, update paths&lt;/li&gt;
&lt;li&gt;Defender access degrades alongside attacker access&lt;/li&gt;
&lt;li&gt;The network is now “secure” but unmanaged&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Azure doesn’t distinguish between &lt;em&gt;defensive isolation&lt;/em&gt; and &lt;em&gt;self‑denial&lt;/em&gt;. The platform will happily enforce whatever policy you give it, even if that policy collapses your ability to respond.&lt;/p&gt;
&lt;p&gt;Designing for predictable failure means deciding &lt;strong&gt;which capabilities must outlive containment&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This changes how you design, deploy, and operate networks in a very practical way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You stop treating centralised egress inspection as an invariant&lt;/li&gt;
&lt;li&gt;You explicitly prioritise &lt;strong&gt;defender access and telemetry&lt;/strong&gt; over uniform traffic control&lt;/li&gt;
&lt;li&gt;You design containment to &lt;em&gt;reduce attacker capability first&lt;/em&gt;, not &lt;em&gt;remove all connectivity&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;You accept that some security controls are conditional, not absolute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key shift: &lt;strong&gt;losing inspection is survivable; losing control is not&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="designing-for-controlled-degradation"&gt;Designing for Controlled Degradation
&lt;/h2&gt;&lt;h3 id="1-fail-closed-at-trust-boundaries-not-at-egress"&gt;1. Fail Closed at Trust Boundaries, Not at Egress
&lt;/h3&gt;&lt;p&gt;Under stress, the first thing you should be willing to lose is &lt;em&gt;cross‑trust communication&lt;/em&gt;, not operator reachability.&lt;/p&gt;
&lt;p&gt;That means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;East‑west traffic between trust zones fails before north‑south management access&lt;/li&gt;
&lt;li&gt;Isolation targets workloads, not the paths used to observe and recover them&lt;/li&gt;
&lt;li&gt;Containment reduces blast radius without collapsing the control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Centralised egress inspection is valuable, until it becomes the narrowest choke point in the system.&lt;/p&gt;
&lt;h3 id="2-intentionally-relax-centralised-egress-inspection-during-containment"&gt;2. Intentionally Relax Centralised Egress Inspection During Containment
&lt;/h3&gt;&lt;p&gt;This is the uncomfortable trade‑off.&lt;/p&gt;
&lt;p&gt;In a containment scenario, it is often safer to temporarily allow &lt;strong&gt;direct workload egress&lt;/strong&gt; than to enforce forced tunnelling through a brittle inspection path.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forced egress concentrates failure into a single dependency&lt;/li&gt;
&lt;li&gt;When that dependency degrades, logging, updates, and identity often follow&lt;/li&gt;
&lt;li&gt;Defender access and telemetry are frequently collateral damage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not an argument against inspection. It’s an argument against treating it as non‑negotiable during failure.&lt;/p&gt;
&lt;p&gt;Predictable failure means being explicit about this ordering:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I am willing to lose uniform egress inspection before I am willing to lose defender access, telemetry, or recovery paths.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="3-preserve-defender-control-paths-at-all-costs"&gt;3. Preserve Defender Control Paths at All Costs
&lt;/h3&gt;&lt;p&gt;If a containment action can sever:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bastion or jump host access&lt;/li&gt;
&lt;li&gt;Break‑glass identities&lt;/li&gt;
&lt;li&gt;Log and alert egress&lt;/li&gt;
&lt;li&gt;Platform management endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…then it’s not a security control, it’s a denial‑of‑service against your own responders.&lt;/p&gt;
&lt;p&gt;Defender paths should be &lt;strong&gt;architecturally boring&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minimal dependencies&lt;/li&gt;
&lt;li&gt;Few enforcement layers&lt;/li&gt;
&lt;li&gt;Hard to accidentally include in broad deny rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If these paths disappear during containment, the network has failed &lt;em&gt;chaotically&lt;/em&gt;, regardless of how “secure” it looks.&lt;/p&gt;
&lt;h2 id="implementation-example-encoding-failure-order-with-nsgs"&gt;Implementation Example: Encoding Failure Order with NSGs
&lt;/h2&gt;&lt;p&gt;This example is intentionally simple. It’s not a pattern to copy wholesale, it’s a way to encode &lt;strong&gt;failure intent&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bicep" data-lang="bicep"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;workloadNsg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Microsoft.Network/networkSecurityGroups@2023-11-01&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nsg-workload-zone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;resourceGroup&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;securityRules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Allow trusted intra-zone traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow-IntraZone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Allow&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;10.20.0.0/16&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Default deny for cross-zone traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny-CrossZone&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;4096&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Inbound&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deny&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourceAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;VirtualNetwork&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationAddressPrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sourcePortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;destinationPortRange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;What this demonstrates:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Failure occurs first at trust boundaries&lt;/li&gt;
&lt;li&gt;Intra‑zone operation continues&lt;/li&gt;
&lt;li&gt;Containment is explicit and reversible&lt;/li&gt;
&lt;li&gt;The network degrades along known seams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NSGs alone won’t save you but encoding &lt;em&gt;failure order&lt;/em&gt; in policy forces architectural clarity.&lt;/p&gt;
&lt;h2 id="visualising-predictable-failure"&gt;Visualising Predictable Failure
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph Management
Admins
Bastion
end
subgraph ZoneA["Workload Zone A"]
AppA
end
subgraph ZoneB["Workload Zone B"]
AppB
end
Admins --&gt; Bastion --&gt; ZoneA
Admins --&gt; Bastion --&gt; ZoneB
ZoneA -.isolated first.-x ZoneB
&lt;/div&gt;
&lt;p&gt;When containment is applied:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workload‑to‑workload trust is severed&lt;/li&gt;
&lt;li&gt;Management access remains intact&lt;/li&gt;
&lt;li&gt;Egress inspection may be relaxed to preserve visibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s not weakness, that’s control.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Relaxing egress inspection &lt;strong&gt;does increase short‑term risk&lt;/strong&gt; that risk must be bounded and time‑limited&lt;/li&gt;
&lt;li&gt;Attackers may attempt to exploit relaxed paths but defender lockout is usually worse&lt;/li&gt;
&lt;li&gt;Platform dependencies (DNS, identity, logging) often bypass intended failure order&lt;/li&gt;
&lt;li&gt;“Temporary” containment rules have a habit of becoming permanent scars&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Predictable failure requires ongoing review, not just good intent.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Decide and document &lt;strong&gt;which control fails first&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Treat centralised inspection as conditional under stress&lt;/li&gt;
&lt;li&gt;Keep defender access paths simple and isolated&lt;/li&gt;
&lt;li&gt;Avoid deep dependency chains in security enforcement&lt;/li&gt;
&lt;li&gt;Assume containment will be executed by tired humans&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="insight"&gt;
&lt;div class="insight-icon"&gt;🍺&lt;/div&gt;
&lt;div class="insight-content"&gt;
&lt;strong&gt;Brewed Insight:&lt;/strong&gt; If your network only behaves safely when every control is intact, it isn’t resilient, it’s fragile. Predictable failure means choosing control over coverage when it matters most.
&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
.insight {
display: flex;
align-items: center;
background-color: #0089e41c;
border-left: 10px solid #D69A2D;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
.insight-icon {
font-size: 24px;
margin-right: 10px;
}
.insight-content {
flex: 1;
}
&lt;/style&gt;&lt;h2 id="learn-more"&gt;Learn More
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview" target="_blank" rel="noopener"
&gt;Azure Network Security Groups – Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/framework/security/design-network-segmentation" target="_blank" rel="noopener"
&gt;Design network segmentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-best-practices" target="_blank" rel="noopener"
&gt;Azure security best practices for network isolation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>