<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Network Segmentation on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/network-segmentation/</link><description>Recent content in Network Segmentation on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 16 Apr 2026 00:00:00 +1100</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/network-segmentation/rss.xml" rel="self" type="application/rss+xml"/><item><title>Mapping Attacker Movement Through Azure Networks</title><link>https://blog.brewedinthecloud.com/p/assume-breach-mapping-attacker-movement/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +1100</pubDate><guid>https://blog.brewedinthecloud.com/p/assume-breach-mapping-attacker-movement/</guid><description>&lt;p&gt;Most Azure networks aren’t breached because they’re badly built.&lt;br&gt;
They’re breached because they’re &lt;strong&gt;too well connected&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Hub‑and‑spoke. Shared services. Clean routing. Minimal friction.&lt;br&gt;
All sensible, until someone is already inside.&lt;/p&gt;
&lt;p&gt;At that point, your network diagram stops being documentation and starts being a &lt;strong&gt;movement map&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Assume breach isn’t about stopping entry.&lt;br&gt;
It’s about deciding &lt;strong&gt;how far someone can walk once they’re through the door&lt;/strong&gt;.&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;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If it’s internal and peered, it’s trusted enough.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This usually manifests as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broad hub‑to‑spoke peering&lt;/li&gt;
&lt;li&gt;Shared services VNets reachable from everywhere&lt;/li&gt;
&lt;li&gt;Routing optimised for convenience, not containment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
Azure networking is not &lt;em&gt;transitive&lt;/em&gt; in protocol terms but it is &lt;strong&gt;effectively transitive in operational reality&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If Azure’s control plane gives you a valid route:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The destination exists&lt;/li&gt;
&lt;li&gt;The return path exists&lt;/li&gt;
&lt;li&gt;The trust decision has already been made&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NSGs may block traffic, but &lt;strong&gt;routing defines possibility&lt;/strong&gt;.&lt;br&gt;
And possibility is all an attacker needs to plan movement.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Attackers don’t need clever tricks to move through Azure networks.&lt;br&gt;
They rely on the same primitives your workloads do.&lt;/p&gt;
&lt;h3 id="routing-defines-the-playing-field"&gt;Routing Defines the Playing Field
&lt;/h3&gt;&lt;p&gt;System routes and peering expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which address spaces are reachable&lt;/li&gt;
&lt;li&gt;Which segments are adjacent&lt;/li&gt;
&lt;li&gt;Which services sit “between” environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once a route exists, that relationship is discoverable, regardless of whether traffic is later denied.&lt;/p&gt;
&lt;h3 id="peering-is-a-trust-boundary-whether-you-admit-it-or-not"&gt;Peering Is a Trust Boundary (Whether You Admit It or Not)
&lt;/h3&gt;&lt;p&gt;VNet peering establishes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mutual reachability&lt;/li&gt;
&lt;li&gt;Automatic return paths&lt;/li&gt;
&lt;li&gt;Address‑space visibility&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From an assume‑breach lens, peering answers the most important question an attacker asks:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What am I implicitly trusted to talk to?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="shared-services-quietly-become-pivots"&gt;Shared Services Quietly Become Pivots
&lt;/h3&gt;&lt;p&gt;Jump hosts, automation, internal APIs, update services these aren’t neutral.&lt;br&gt;
They are &lt;strong&gt;high‑leverage infrastructure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When they’re broadly reachable, they stop being helpers and start being &lt;strong&gt;accelerators&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This reframes how you should design and operate Azure networks.&lt;/p&gt;
&lt;h3 id="design-from-connectivity-to-containment"&gt;Design: From Connectivity to Containment
&lt;/h3&gt;&lt;p&gt;The key question is no longer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Who needs access to this?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It becomes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If this subnet is compromised, what trust does it inherit?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That shift usually leads to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smaller, purpose‑bound VNets&lt;/li&gt;
&lt;li&gt;Fewer unconditional peerings&lt;/li&gt;
&lt;li&gt;Explicit containment boundaries that exist &lt;em&gt;before&lt;/em&gt; an incident&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="incident-response-optionality-matters"&gt;Incident Response: Optionality Matters
&lt;/h3&gt;&lt;p&gt;During an incident you can’t redesign the network.&lt;br&gt;
You can only &lt;strong&gt;remove paths&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Architectures that collapse operations and containment into the same peering force bad choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep dangerous paths open to preserve access&lt;/li&gt;
&lt;li&gt;Or cut everything and accept collateral damage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assume breach is about preserving &lt;strong&gt;choice under pressure&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="the-diagram-that-actually-matters"&gt;The Diagram That Actually Matters
&lt;/h3&gt;&lt;p&gt;Most diagrams show connectivity.&lt;br&gt;
This one highlights &lt;strong&gt;the single link that usually breaks containment&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart LR
A[Compromised Workload&lt;br/&gt;Spoke-App-1] --&gt;|System Routes| B[App Subnets]
B --&gt;|Peering| C[Hub VNet]
C --&gt;|Peering| D[Shared Services VNet]
C --&gt;|Peering| E[Spoke-App-2]
D --&gt; F[Jump Hosts]
D --&gt; G[Automation / APIs]
style A fill:#ffdddd
style D fill:#ffe0b2
style C fill:#e3f2fd
style B fill:#f5f5f5
%% Emphasis
B --&gt;|Incident-Critical Trust Path| D
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Judgement, not illustration:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a single peering link enables both &lt;em&gt;normal operations&lt;/em&gt; and &lt;em&gt;lateral movement during compromise&lt;/em&gt;, it is the wrong trust boundary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In most environments, that link is:
&lt;strong&gt;Spoke → Shared Services (often via the hub)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is the path you will want to cut first and often can’t.&lt;/p&gt;
&lt;h3 id="inspecting-the-paths-youve-already-allowed"&gt;Inspecting the Paths You’ve Already Allowed
&lt;/h3&gt;&lt;p&gt;You don’t need attacker tooling to see this. Azure exposes it.&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az network nic show-effective-route-table &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --resource-group rg-app1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="se"&gt;&lt;/span&gt; --name nic-app1-vm01
&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;When you review effective routes, ask one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If this destination were compromised, could I afford to isolate it immediately?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the answer is no, that’s not connectivity, it’s &lt;strong&gt;embedded trust&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="shared-services-unacceptable-vs-merely-risky"&gt;Shared Services: Unacceptable vs Merely Risky
&lt;/h2&gt;&lt;p&gt;This is where most architectures quietly fail assume breach.&lt;/p&gt;
&lt;h3 id="shared-services-are-unacceptable-when"&gt;Shared Services Are &lt;strong&gt;Unacceptable&lt;/strong&gt; When
&lt;/h3&gt;&lt;p&gt;All of the following are true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Broadly reachable from multiple spokes&lt;/li&gt;
&lt;li&gt;Required during incidents (access, recovery, automation)&lt;/li&gt;
&lt;li&gt;Difficult to isolate without breaking everything else&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this state, compromise of &lt;em&gt;any&lt;/em&gt; spoke plausibly exposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The tools you use to respond&lt;/li&gt;
&lt;li&gt;The systems you rely on to recover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s not risk it’s &lt;strong&gt;self‑defeating design&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="shared-services-are-merely-risky-when"&gt;Shared Services Are &lt;strong&gt;Merely Risky&lt;/strong&gt; When
&lt;/h3&gt;&lt;p&gt;Risk is a conscious trade when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The service is not required for containment&lt;/li&gt;
&lt;li&gt;Trust is one‑way and disposable&lt;/li&gt;
&lt;li&gt;Losing it degrades visibility, not control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples that often fall here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Log ingestion&lt;/li&gt;
&lt;li&gt;Metrics collection&lt;/li&gt;
&lt;li&gt;Read‑only artifact distribution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The distinction isn’t &lt;em&gt;shared vs not shared&lt;/em&gt;.&lt;br&gt;
It’s &lt;strong&gt;optional vs non‑optional under duress&lt;/strong&gt;.&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;Firewalls and NVAs&lt;/strong&gt;&lt;br&gt;
Centralising enforcement doesn’t remove trust it concentrates it. Treat them as blast‑radius multipliers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Private Endpoints&lt;/strong&gt;&lt;br&gt;
They add paths. They do not remove the need to reason about trust boundaries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overlapping address spaces&lt;/strong&gt;&lt;br&gt;
They delay containment decisions when time matters most.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Treat hub‑and‑spoke as a &lt;strong&gt;routing pattern&lt;/strong&gt;, not a trust model&lt;/li&gt;
&lt;li&gt;Classify services by &lt;em&gt;incident criticality&lt;/em&gt;, not convenience&lt;/li&gt;
&lt;li&gt;Minimise peerings you cannot sever quickly&lt;/li&gt;
&lt;li&gt;Regularly review effective routes with a containment mindset&lt;/li&gt;
&lt;li&gt;Document which links you would cut first before you need to&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; &lt;p&gt;Hub‑and‑spoke isn’t the problem.&lt;br&gt;
Assuming the hub and what lives behind it, is always trusted is.&lt;/p&gt;
&lt;p&gt;Design networks so you can afford to be wrong.&lt;/p&gt;
&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/virtual-networks-udr-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview" target="_blank" rel="noopener"
&gt;Virtual network peering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works" target="_blank" rel="noopener"
&gt;Effective routes and security rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>