<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Azure Network on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/azure-network/</link><description>Recent content in Azure Network on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 23 Apr 2026 00:00:00 +1100</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/azure-network/rss.xml" rel="self" type="application/rss+xml"/><item><title>East–West Traffic Is Where Cloud Incidents Actually Spread</title><link>https://blog.brewedinthecloud.com/p/east-west-traffic-spread/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/east-west-traffic-spread/</guid><description>&lt;p&gt;Most cloud incidents don’t escalate because someone was clever at breaking in.&lt;/p&gt;
&lt;p&gt;They escalate because the environment was already &lt;em&gt;helpful&lt;/em&gt; once they arrived.&lt;/p&gt;
&lt;p&gt;If you’ve ever sat in a post‑incident review thinking, &lt;em&gt;“I didn’t realise those systems could talk to each other”&lt;/em&gt;, you’ve already seen where the real damage happens east–west traffic.&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;
“Internal traffic is safer. The perimeter is where risk lives.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it breaks:&lt;/strong&gt;&lt;br&gt;
Under an Assume Breach mindset, &lt;em&gt;internal reachability is the primary blast‑radius multiplier&lt;/em&gt;. East–west paths are rarely designed to contain failure. They’re designed to keep systems working as requirements evolve.&lt;/p&gt;
&lt;p&gt;That makes them durable, invisible, and dangerous under compromise.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;In Azure estates, east–west traffic isn’t centrally planned. It &lt;em&gt;emerges&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It emerges from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Incremental connectivity added to unblock delivery&lt;/li&gt;
&lt;li&gt;Runtime dependencies discovered after go‑live&lt;/li&gt;
&lt;li&gt;Legacy behaviour preserved to avoid outages&lt;/li&gt;
&lt;li&gt;Organisational pressure to keep things moving&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each individual decision is reasonable. Collectively, they form traversal paths no one set out to design, but which attackers can rely on.&lt;/p&gt;
&lt;p&gt;The platform doesn’t distinguish between “architectural intent” and “operational necessity”. Routing and reachability follow what exists &lt;em&gt;now&lt;/em&gt;, not what was drawn.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;Here’s a common post‑incident pattern.&lt;/p&gt;
&lt;p&gt;A business application is described and diagrammed, as a classic three‑tier design: web, app, data. During a containment exercise, outbound connectivity from the app tier back to the web tier is disabled as a scream test.&lt;/p&gt;
&lt;p&gt;Production breaks.&lt;/p&gt;
&lt;p&gt;Investigation shows the app tier is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing files back to the web tier for user access, and/or&lt;/li&gt;
&lt;li&gt;Responding directly to users under certain workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this was malicious. All of it was &lt;em&gt;required&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The bidirectional connectivity wasn’t an accident it was an operational dependency that formed after the original design. Over time, that dependency became untouchable.&lt;/p&gt;
&lt;p&gt;From a breach perspective, compromise of the app tier now inherently includes a path back to user‑facing surfaces without exploiting anything new.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How would this change something I design, deploy, or operate?&lt;/strong&gt;&lt;br&gt;
You stop trusting tier labels and start validating &lt;em&gt;directional behaviour&lt;/em&gt;. “Internal” no longer means “contained”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="structural-reasons-eastwest-paths-persist"&gt;Structural Reasons East–West Paths Persist
&lt;/h2&gt;&lt;p&gt;These paths survive because they acquire protection through necessity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They’re justified post‑hoc as “how the app works”&lt;/li&gt;
&lt;li&gt;They’re undocumented because they evolved organically&lt;/li&gt;
&lt;li&gt;They can’t be removed without immediate impact&lt;/li&gt;
&lt;li&gt;They cross boundaries that were never designed as security controls&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The phrase that shows up in reviews is telling: &lt;strong&gt;“unexpected but required”&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once something is required, it stops being questioned and becomes architectural fact.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="architecture-view-how-runtime-behaviour-overrides-design"&gt;Architecture View: How Runtime Behaviour Overrides Design
&lt;/h3&gt;&lt;div class="mermaid"&gt;flowchart LR
U[User] --&gt; W[Web Tier]
W --&gt; A[App Tier]
A --&gt; D[Data Tier]
A --&gt;|Operational Dependency| W
style A fill:#f5f5f5
style W fill:#f5f5f5
&lt;/div&gt;
&lt;p&gt;The diagram says “three tiers”.&lt;br&gt;
The runtime says “bidirectional”.&lt;/p&gt;
&lt;p&gt;Attackers only need to follow what already works.&lt;/p&gt;
&lt;h2 id="gotchas--edge-cases"&gt;Gotchas &amp;amp; Edge Cases
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Same app” is not a containment boundary&lt;/strong&gt;&lt;br&gt;
Lateral movement doesn’t care about application ownership.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scream tests reveal truth late&lt;/strong&gt;&lt;br&gt;
By the time you can’t disable a path, it’s already structural.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Directionality is rarely validated&lt;/strong&gt;&lt;br&gt;
Engineers confirm &lt;em&gt;that&lt;/em&gt; traffic flows, not &lt;em&gt;who initiates it&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Removal risk entrenches exposure&lt;/strong&gt;&lt;br&gt;
The harder a path is to remove, the more dangerous it becomes under breach.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Without touching specific controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treat east–west connectivity as &lt;strong&gt;intentional architecture&lt;/strong&gt;, not background plumbing&lt;/li&gt;
&lt;li&gt;Validate &lt;em&gt;direction of initiation&lt;/em&gt;, not just reachability&lt;/li&gt;
&lt;li&gt;Assume every “temporary” dependency will outlive its justification&lt;/li&gt;
&lt;li&gt;Design internal paths so they can fail without collapsing user‑facing surfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Containment is a design outcome, not a firewall feature.&lt;/p&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; In cloud environments, lateral movement usually isn’t enabled by attackers, it’s enabled by applications quietly evolving past their original design.
&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/security/benchmark/azure/security-controls-v3-network-security" target="_blank" rel="noopener"
&gt;Microsoft Learn — &lt;em&gt;Assume breach and network security concepts&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/en-us/azure/architecture/networking/" target="_blank" rel="noopener"
&gt;Azure Architecture Centre — &lt;em&gt;Network design principles&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>