<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloud Architecture on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/tags/cloud-architecture/</link><description>Recent content in Cloud Architecture on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 19 May 2026 00:00:00 +1000</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/tags/cloud-architecture/rss.xml" rel="self" type="application/rss+xml"/><item><title>When the VNet Becomes a Yes‑Man: Over‑Trusted Internal Traffic in Azure</title><link>https://blog.brewedinthecloud.com/p/network-fails-over-trusted-internal-traffic-azure/</link><pubDate>Tue, 19 May 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/network-fails-over-trusted-internal-traffic-azure/</guid><description>&lt;p&gt;Most Azure environments don’t fail because someone opened the perimeter too wide.&lt;/p&gt;
&lt;p&gt;They fail because &lt;em&gt;inside the network&lt;/em&gt;, everything slowly learned it didn’t need to ask anymore.&lt;/p&gt;
&lt;p&gt;Reachability became normal. Then expected. Then invisible.&lt;/p&gt;
&lt;p&gt;By the time anyone questions it, the network has already answered &lt;em&gt;yes&lt;/em&gt; on their behalf.&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;&lt;em&gt;“If traffic is inside the VNet or coming from on‑prem it’s already trusted.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn’t usually stated out loud. It just emerges.&lt;/p&gt;
&lt;p&gt;VNets start small. On‑prem connectivity is enabled for migration speed. Shared services need to be reachable. Early workloads benefit from convenience, and nothing breaks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it misleads:&lt;/strong&gt;&lt;br&gt;
VNets don’t stay small and neither does connectivity intent.&lt;/p&gt;
&lt;p&gt;As environments grow, reachability expands faster than understanding. What began as a deliberate exception turns into a default, and “inside the network” quietly becomes shorthand for &lt;em&gt;safe enough&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That’s not a security philosophy problem.&lt;br&gt;
It’s a network failure caused by trust inheritance.&lt;/p&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Azure VNets are &lt;strong&gt;routing domains&lt;/strong&gt;, not trust domains.&lt;/p&gt;
&lt;p&gt;They provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer‑3 connectivity&lt;/li&gt;
&lt;li&gt;Flat reachability by default&lt;/li&gt;
&lt;li&gt;No concept of workload sensitivity or intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure is doing exactly what it’s designed to do.&lt;/p&gt;
&lt;p&gt;The failure happens when &lt;strong&gt;connectivity is treated as authorisation&lt;/strong&gt; especially across boundaries that were never meant to be peers.&lt;/p&gt;
&lt;p&gt;Over time, this pattern emerges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On‑prem networks can reach most VNets&lt;/li&gt;
&lt;li&gt;New workloads inherit that reachability automatically&lt;/li&gt;
&lt;li&gt;No explicit decision is made because none is required&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At that point, the network isn’t enforcing intent.&lt;br&gt;
It’s amplifying convenience.&lt;/p&gt;
&lt;h2 id="the-real-question-youre-facing"&gt;The Real Question You’re Facing
&lt;/h2&gt;&lt;p&gt;You’re not choosing between &lt;em&gt;open&lt;/em&gt; and &lt;em&gt;locked‑down&lt;/em&gt; networking.&lt;/p&gt;
&lt;p&gt;You’re choosing between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implicit trust via reachability&lt;/strong&gt;, or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit trust via declared intent&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If on‑prem can reach everything simply because it’s on‑prem, the network has already made a trust decision it just didn’t document it.&lt;/p&gt;
&lt;h2 id="a-necessary-reframe-onprem-is-a-zone-not-a-peer"&gt;A Necessary Reframe: On‑Prem Is a Zone, Not a Peer
&lt;/h2&gt;&lt;p&gt;In a mature Azure environment, on‑prem should not be treated as “just another VNet”.&lt;/p&gt;
&lt;p&gt;It is a &lt;strong&gt;distinct network zone&lt;/strong&gt; with different ownership, lifecycle, and failure characteristics.&lt;/p&gt;
&lt;p&gt;A defensible default looks like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;On‑prem can reach shared services by default.&lt;br&gt;
Workload networks must opt‑in.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This isn’t about assuming compromise.&lt;br&gt;
It’s about preventing &lt;em&gt;ambient trust&lt;/em&gt; from spreading via routing.&lt;/p&gt;
&lt;h2 id="realworld-impact"&gt;Real‑World Impact
&lt;/h2&gt;&lt;p&gt;This failure mode shows up operationally long before any incident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New workloads become reachable from on‑prem without discussion&lt;/li&gt;
&lt;li&gt;Architects can’t clearly state why certain paths exist&lt;/li&gt;
&lt;li&gt;Shared services quietly become transit points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Operational impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivity reviews focus on NSGs instead of intent&lt;/li&gt;
&lt;li&gt;Change risk increases because blast radius is unclear&lt;/li&gt;
&lt;li&gt;Removing access is harder than granting it ever was&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal boundaries blur&lt;/li&gt;
&lt;li&gt;Lateral movement becomes a property of the network&lt;/li&gt;
&lt;li&gt;Containment relies on “nothing changing” rather than design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The network didn’t break suddenly.&lt;br&gt;
It drifted and no one noticed.&lt;/p&gt;
&lt;h2 id="implementation-examples"&gt;Implementation Examples
&lt;/h2&gt;&lt;h3 id="what-overtrust-looks-like-at-scale"&gt;What Over‑Trust Looks Like at Scale
&lt;/h3&gt;&lt;p&gt;After a few years of growth, many environments resemble this:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
OP[On‑Prem Network]
HUB[Shared Services VNet]
APP1[App VNet]
APP2[App VNet]
DATA[Data VNet]
OP --- HUB
OP --- APP1
OP --- APP2
OP --- DATA
HUB --- APP1
HUB --- APP2
&lt;/div&gt;
&lt;p&gt;Nothing here violates Azure best practices.&lt;/p&gt;
&lt;p&gt;The failure is behavioural:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On‑prem reachability is assumed, not justified&lt;/li&gt;
&lt;li&gt;New VNets inherit access automatically&lt;/li&gt;
&lt;li&gt;No one can say which paths are intentional&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-the-failure-creeps-in"&gt;How the Failure Creeps In
&lt;/h3&gt;&lt;p&gt;A typical peering or gateway configuration (simplified):&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;/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="nv"&gt;allowVirtualNetworkAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;This isn’t wrong.&lt;/p&gt;
&lt;p&gt;But over time, it’s interpreted as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Anything internal can probably talk to this.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That assumption scales faster than architecture diagrams.&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;Private endpoints don’t fix this&lt;/strong&gt;&lt;br&gt;
They often reinforce the idea that “private” equals “safe”, even as reachability expands.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Peering intent fades faster than peering configs&lt;/strong&gt;&lt;br&gt;
The network remembers decisions long after teams forget why they were made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change velocity accelerates trust drift&lt;/strong&gt;&lt;br&gt;
Especially when new workloads are created by teams far from the original design.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="best-practices-without-tooling"&gt;Best Practices (Without Tooling)
&lt;/h2&gt;&lt;p&gt;Staying within network design, not enforcement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define &lt;strong&gt;where on‑prem can reach by default&lt;/strong&gt; and write it down&lt;/li&gt;
&lt;li&gt;Treat workload reachability as an &lt;strong&gt;opt‑in decision&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Periodically review &lt;strong&gt;which paths exist purely because they’re easy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Design shared services as &lt;strong&gt;intentional choke points&lt;/strong&gt;, not accidental hubs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are design disciplines, not firewall strategies.&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; If a new workload can be reached from on‑prem without anyone explicitly deciding that it should, the network has already failed even if nothing is broken yet.
&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-network-peering-overview" target="_blank" rel="noopener"
&gt;Azure Virtual Network peering overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/hub-spoke" target="_blank" rel="noopener"
&gt;Hub‑spoke network topology in Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/security/fundamentals/network-overview" target="_blank" rel="noopener"
&gt;Azure networking security concepts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>