<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Architecture on Brewed in the Cloud by Chris Hailes</title><link>https://blog.brewedinthecloud.com/categories/architecture/</link><description>Recent content in Architecture on Brewed in the Cloud by Chris Hailes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Thu, 18 Jun 2026 00:00:00 +1000</lastBuildDate><atom:link href="https://blog.brewedinthecloud.com/categories/architecture/rss.xml" rel="self" type="application/rss+xml"/><item><title>Private Endpoint Sprawl and Shadow Access: When Private Starts Meaning Unseen</title><link>https://blog.brewedinthecloud.com/p/pe-attacks-sprawl-and-shadow-access/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +1000</pubDate><guid>https://blog.brewedinthecloud.com/p/pe-attacks-sprawl-and-shadow-access/</guid><description>&lt;p&gt;Private Endpoints often arrive with the sort of confidence that makes people stop asking second-order questions.&lt;/p&gt;
&lt;p&gt;The first one is usually deliberate. A shared service needs to be consumed privately, the path is approved, DNS is wired up, and everyone feels like exposure has been reduced. Then another team needs access from a different virtual network. Then another environment gets its own endpoint. Then a migration leaves the old one behind. A year later, the architecture still looks private, but it is no longer especially clear.&lt;/p&gt;
&lt;p&gt;That is the problem this post is really about.&lt;/p&gt;
&lt;p&gt;Private Endpoint sprawl is not just untidy networking. It is the slow expansion of internal reachability to services that many teams still think of as tightly contained. The risk is not that Private Endpoints magically bypass identity or authorisation. The risk is that more internal footholds now inherit viable paths to high-value services, and defenders lose confidence that the approved path is the only path that matters.&lt;/p&gt;
&lt;p&gt;That changes something you design, deploy, and operate. If a new Private Endpoint is treated as routine plumbing rather than as a new internal exposure point, your architecture can accumulate shadow access long before anyone notices.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The Mental Model
&lt;/h2&gt;&lt;p&gt;The common assumption goes something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a service is only reachable through Private Endpoints, exposure is reduced and control has improved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is true only while the private access paths remain deliberate, bounded, and visible.&lt;/p&gt;
&lt;p&gt;What breaks the mental model is scale.&lt;/p&gt;
&lt;p&gt;A Private Endpoint is not just a safer service setting. It is a new network presence for a platform service inside a virtual network you control imperfectly, with DNS and routing dependencies you may not fully own, and with trust implications that extend beyond the service team.&lt;/p&gt;
&lt;p&gt;One endpoint is a design choice.&lt;/p&gt;
&lt;p&gt;Several endpoints to the same service across different networks is no longer just connectivity. It is topology. And once those endpoints span different trust zones or administrative boundaries, it becomes security-relevant sprawl.&lt;/p&gt;
&lt;p&gt;That is the shift worth holding onto:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Private Endpoint sprawl does not weaken identity controls by itself. It weakens your certainty about where sensitive services are reachable from after a compromise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="how-it-really-works"&gt;How It Really Works
&lt;/h2&gt;&lt;p&gt;Sprawl is rarely the result of one bad design meeting. It is usually the accumulation of locally reasonable decisions.&lt;/p&gt;
&lt;h3 id="teams-create-endpoints-close-to-workloads"&gt;Teams create endpoints close to workloads
&lt;/h3&gt;&lt;p&gt;A workload team needs private access to a Key Vault, Storage Account, SQL Database, or Cosmos DB account owned elsewhere. Rather than consuming an already understood path or challenging the design, they create a new Private Endpoint in their own virtual network.&lt;/p&gt;
&lt;p&gt;Technically, that may be fine.&lt;/p&gt;
&lt;p&gt;Architecturally, the same shared service now has another private network presence in another part of the estate. That means another trust zone can originate traffic to it, another DNS context can resolve it privately, and another team now influences the effective exposure of the target service.&lt;/p&gt;
&lt;h3 id="service-ownership-and-access-path-ownership-diverge"&gt;Service ownership and access-path ownership diverge
&lt;/h3&gt;&lt;p&gt;This is where the architecture starts to lie to you.&lt;/p&gt;
&lt;p&gt;The service owner may still control the Key Vault or Storage Account itself, but they often do not control every network from which private access now exists. A sensitive service can look tightly governed from the resource perspective while being privately reachable from networks the service owner neither administers nor reviews regularly.&lt;/p&gt;
&lt;p&gt;At that point, the exposure boundary is no longer defined only by the service configuration. It is also defined by every approved Private Endpoint connection and every network that hosts one.&lt;/p&gt;
&lt;h3 id="dns-makes-duplication-easier-to-ignore"&gt;DNS makes duplication easier to ignore
&lt;/h3&gt;&lt;p&gt;Private DNS does exactly what it is supposed to do: it makes the service name resolve in the right place without the application caring too much.&lt;/p&gt;
&lt;p&gt;Operationally, that convenience can hide architectural drift.&lt;/p&gt;
&lt;p&gt;Consumers continue to use the same name. Connections still work. The duplication disappears behind name resolution. Over time, the platform may end up with several private access paths to the same service across linked zones and virtual networks, but very few people can say with confidence where that service resolves privately and where it does not.&lt;/p&gt;
&lt;h3 id="old-access-paths-tend-to-survive"&gt;Old access paths tend to survive
&lt;/h3&gt;&lt;p&gt;Private Endpoints are easy to create and oddly persistent.&lt;/p&gt;
&lt;p&gt;Migration endpoint? Left behind.
Temporary analytics integration? Still there.
Retired workload in a linked subscription? Endpoint survives.
Replacement endpoint after a redesign? Old one never cleaned up.&lt;/p&gt;
&lt;p&gt;This is where shadow access starts to matter. The network path still exists, the name may still resolve, and the target service is still privately reachable from a place that is no longer part of anyone’s active design intent.&lt;/p&gt;
&lt;h2 id="a-simple-view-of-sprawl"&gt;A Simple View of Sprawl
&lt;/h2&gt;&lt;div class="mermaid"&gt;flowchart LR
subgraph SharedService["Shared Service Subscription"]
KV["Key Vault"]
SA["Storage Account"]
end
subgraph Prod["Prod Trust Zone"]
PE1["PE to Key Vault"]
PE2["PE to Storage"]
App1["Prod App"]
end
subgraph Dev["Lower-Assurance Dev Zone"]
PE3["PE to Key Vault"]
App2["Dev App"]
end
subgraph Analytics["Separately Administered Analytics Zone"]
PE4["PE to Storage"]
PE5["PE to Key Vault"]
App3["Data Job"]
end
KV --&gt; PE1
KV --&gt; PE3
KV --&gt; PE5
SA --&gt; PE2
SA --&gt; PE4
App1 --&gt; PE1
App1 --&gt; PE2
App2 --&gt; PE3
App3 --&gt; PE4
App3 --&gt; PE5
&lt;/div&gt;
&lt;p&gt;Nothing here is automatically insecure.&lt;/p&gt;
&lt;p&gt;That is exactly why sprawl survives.&lt;/p&gt;
&lt;p&gt;The issue is not endpoint count in isolation. The issue is that shared services are now privately reachable from multiple trust zones with different operational controls, different DNS views, and potentially different security assumptions. If one of those zones is compromised, the attacker may inherit private line of sight to services that were mentally modelled as more tightly contained.&lt;/p&gt;
&lt;h2 id="real-world-impact"&gt;Real-World Impact
&lt;/h2&gt;&lt;p&gt;This is the point where the article has to matter beyond architecture diagrams.&lt;/p&gt;
&lt;h3 id="design-impact"&gt;Design impact
&lt;/h3&gt;&lt;p&gt;A second Private Endpoint to the same service is not automatically a problem.&lt;/p&gt;
&lt;p&gt;A second Private Endpoint in a different trust zone should be treated as architectural debt by default until someone can justify why compromise of that zone should still permit private reachability to the target service.&lt;/p&gt;
&lt;p&gt;That is the design decision most teams skip.&lt;/p&gt;
&lt;p&gt;They ask whether the application needs private access. They do not ask whether this particular network should be allowed to host a private access path to that service. Those are different questions. The second one is the security question.&lt;/p&gt;
&lt;p&gt;If the hosting network is lower-assurance, loosely governed, or simply administered by a different team with different standards, then the new endpoint is not just enabling connectivity. It is extending the service’s effective internal exposure.&lt;/p&gt;
&lt;h3 id="deployment-impact"&gt;Deployment impact
&lt;/h3&gt;&lt;p&gt;Private Endpoint sprawl is often created by valid infrastructure-as-code.&lt;/p&gt;
&lt;p&gt;That is why it is easy to miss.&lt;/p&gt;
&lt;p&gt;Every endpoint can be deployed through a clean module, approved through a normal workflow, and attached to the right subnet. Nothing looks broken in the deployment pipeline. The problem is that deployment success says very little about whether the overall estate should contain that many private access paths to the same service.&lt;/p&gt;
&lt;p&gt;In other words, good IaC can still encode a bad reachability model.&lt;/p&gt;
&lt;h3 id="operational-impact"&gt;Operational impact
&lt;/h3&gt;&lt;p&gt;In an incident, the question is no longer:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does this service have private access?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It becomes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How many private origins can still reach it, and which of those no longer belong to a workload anyone actively operates?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is a much harder question to answer under pressure.&lt;/p&gt;
&lt;p&gt;The moment suspicious access appears against a vault, storage account, or database, responders need to understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which Private Endpoints connect to it&lt;/li&gt;
&lt;li&gt;Which subscriptions and resource groups own those endpoints&lt;/li&gt;
&lt;li&gt;Which virtual networks and subnets host them&lt;/li&gt;
&lt;li&gt;Which DNS zones make the target resolvable&lt;/li&gt;
&lt;li&gt;Which endpoints still correspond to real workloads&lt;/li&gt;
&lt;li&gt;Which paths were approved historically but no longer fit the current design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you cannot answer those questions quickly, your containment options are slower and your confidence in the service boundary is weaker than you thought.&lt;/p&gt;
&lt;h3 id="security-impact"&gt;Security impact
&lt;/h3&gt;&lt;p&gt;The security issue is not that Private Endpoints bypass service authentication. They do not.&lt;/p&gt;
&lt;p&gt;The issue is that they increase the set of internal origins from which authenticated access can be attempted after compromise, reduce confidence in where the service is actually reachable from, and make it harder to distinguish intended private access from inherited shadow paths.&lt;/p&gt;
&lt;p&gt;That matters in practice.&lt;/p&gt;
&lt;p&gt;An attacker with a foothold in a lower-assurance or forgotten network does not need the endpoint itself to be misconfigured. If that network still has private resolution and routable reachability to a high-value service, the attacker has inherited a path that may not exist in anyone’s current threat model. Even if identity controls still block them initially, the blast radius, staging options, and containment assumptions have changed.&lt;/p&gt;
&lt;p&gt;That is why sprawl is an attack-surface problem rather than just an inventory problem.&lt;/p&gt;
&lt;h2 id="architectural-symptoms-of-sprawl"&gt;Architectural Symptoms of Sprawl
&lt;/h2&gt;&lt;p&gt;Sprawl is usually visible through patterns, not labels.&lt;/p&gt;
&lt;h3 id="the-same-service-has-private-endpoints-in-multiple-differently-trusted-networks"&gt;The same service has Private Endpoints in multiple differently trusted networks
&lt;/h3&gt;&lt;p&gt;That should trigger scrutiny immediately.&lt;/p&gt;
&lt;p&gt;Not because multiple endpoints are always wrong, but because duplicated private access across trust zones should be presumed to be debt until proven otherwise. If the justification does not survive compromise-based reasoning, it is not a strong justification.&lt;/p&gt;
&lt;h3 id="service-owners-cannot-enumerate-all-private-access-paths-confidently"&gt;Service owners cannot enumerate all private access paths confidently
&lt;/h3&gt;&lt;p&gt;If the team responsible for a sensitive shared service cannot quickly identify all approved Private Endpoint connections and where they land, then part of the service boundary already lives outside that team’s usable control.&lt;/p&gt;
&lt;p&gt;That is not a documentation issue. It is an exposure issue.&lt;/p&gt;
&lt;h3 id="dns-behaviour-varies-by-environment-in-ways-no-one-can-explain-cleanly"&gt;DNS behaviour varies by environment in ways no one can explain cleanly
&lt;/h3&gt;&lt;p&gt;When a service resolves privately in some places, publicly in others, and through different linked DNS constructs across the estate, teams tend to treat it as naming complexity.&lt;/p&gt;
&lt;p&gt;Often it is evidence that connectivity spread faster than architecture discipline.&lt;/p&gt;
&lt;h3 id="retired-workloads-still-leave-active-private-access-behind"&gt;Retired workloads still leave active private access behind
&lt;/h3&gt;&lt;p&gt;This is one of the clearest forms of shadow access.&lt;/p&gt;
&lt;p&gt;The application may be gone, but the endpoint remains, the connection is still approved, and the target service is still privately reachable from that network. That path may not be monitored closely because everyone thinks the workload was retired.&lt;/p&gt;
&lt;h3 id="environment-separation-exists-on-paper-more-than-in-reachability"&gt;Environment separation exists on paper more than in reachability
&lt;/h3&gt;&lt;p&gt;The problem is not that dev, test, analytics, and prod are different labels.&lt;/p&gt;
&lt;p&gt;The problem starts when differently administered or lower-assurance networks can host equivalent private access paths into shared services that people assume sit behind production-grade controls. At that point, your environment model is doing more work than the network design.&lt;/p&gt;
&lt;h2 id="implementation-example-inspecting-for-duplicated-private-reachability"&gt;Implementation Example: Inspecting for Duplicated Private Reachability
&lt;/h2&gt;&lt;p&gt;For this topic, the useful artefact is not deployment code. It is an inspection pattern.&lt;/p&gt;
&lt;p&gt;A simple Private Endpoint inventory is rarely enough. What matters is whether the same target resource is reachable through several endpoints spread across different subscriptions or ownership boundaries. That is the shape of sprawl.&lt;/p&gt;
&lt;h3 id="azure-cli-example"&gt;Azure CLI example
&lt;/h3&gt;&lt;p&gt;The following command is intentionally basic, but it is more useful than deployment syntax for this discussion because it starts with the right question: which target resources have multiple Private Endpoints pointing at them?&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;/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 private-endpoint list &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; --query &lt;span class="s2"&gt;&amp;#34;sort_by([].{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; pe:name,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; rg:resourceGroup,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subscription:id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subnet:properties.subnet.id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; targets:properties.privateLinkServiceConnections[].properties.privateLinkServiceId
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }, &amp;amp;pe)&amp;#34;&lt;/span&gt; &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; -o json
&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;On its own, this is just raw inventory. The useful next step is analytical, not procedural:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Group by target resource ID&lt;/li&gt;
&lt;li&gt;Look for shared services with multiple endpoints&lt;/li&gt;
&lt;li&gt;Check whether those endpoints sit in different subscriptions or trust zones&lt;/li&gt;
&lt;li&gt;Identify endpoints whose owning workload is retired, unclear, or differently administered&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interesting cases are not simply “many Private Endpoints exist”. The interesting cases are “this one high-value service is privately reachable from more places than the architecture claims”.&lt;/p&gt;
&lt;h3 id="what-to-look-for"&gt;What to look for
&lt;/h3&gt;&lt;p&gt;A small synthetic example makes the point:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target service&lt;/th&gt;
&lt;th style="text-align: right"&gt;Private Endpoint count&lt;/th&gt;
&lt;th style="text-align: right"&gt;Subscription spread&lt;/th&gt;
&lt;th style="text-align: right"&gt;Trust zone spread&lt;/th&gt;
&lt;th&gt;Owner clarity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared Key Vault A&lt;/td&gt;
&lt;td style="text-align: right"&gt;3&lt;/td&gt;
&lt;td style="text-align: right"&gt;3&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod, Dev, Analytics&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Account B&lt;/td&gt;
&lt;td style="text-align: right"&gt;2&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod only&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL Server C&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;1&lt;/td&gt;
&lt;td style="text-align: right"&gt;Prod only&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only one of these rows should make you uncomfortable immediately.&lt;/p&gt;
&lt;p&gt;Not because three is a magic number, but because a shared secret store privately exposed across multiple administrative or trust boundaries is exactly where “private” starts to mean “unseen”.&lt;/p&gt;
&lt;h2 id="gotchas-and-edge-cases"&gt;Gotchas and Edge Cases
&lt;/h2&gt;&lt;h3 id="some-multi-endpoint-designs-are-valid"&gt;Some multi-endpoint designs are valid
&lt;/h3&gt;&lt;p&gt;Yes, there are legitimate reasons to expose the same service privately into multiple networks.&lt;/p&gt;
&lt;p&gt;But legitimacy should be demonstrated, not assumed. If those endpoints cross trust boundaries, the burden of proof should be higher. “The application needed to connect” is not enough on its own.&lt;/p&gt;
&lt;h3 id="counting-endpoints-alone-is-a-weak-metric"&gt;Counting endpoints alone is a weak metric
&lt;/h3&gt;&lt;p&gt;A large estate may have many Private Endpoints without having serious sprawl.&lt;/p&gt;
&lt;p&gt;The stronger signal is duplicated reachability to the same sensitive service across different trust zones, ownership boundaries, or stale workload footprints.&lt;/p&gt;
&lt;h3 id="endpoint-inventory-is-not-the-same-as-effective-reachability"&gt;Endpoint inventory is not the same as effective reachability
&lt;/h3&gt;&lt;p&gt;Even with a good list of endpoint resources, you can still misunderstand exposure if you ignore DNS links, peering, routing, or path changes introduced by centralised network patterns.&lt;/p&gt;
&lt;p&gt;Private access is a system property, not just a resource property.&lt;/p&gt;
&lt;h3 id="approved-once-does-not-mean-appropriate-now"&gt;Approved once does not mean appropriate now
&lt;/h3&gt;&lt;p&gt;An endpoint may have been justified when created and still be risky now.&lt;/p&gt;
&lt;p&gt;Architectures change. Environments get repurposed. Ownership shifts. Old exceptions become inherited assumptions. Historical approval does not preserve present validity.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best Practices
&lt;/h2&gt;&lt;p&gt;Within the bounds of this post, the strongest practices are architectural.&lt;/p&gt;
&lt;h3 id="treat-every-new-private-endpoint-as-a-new-internal-exposure-point"&gt;Treat every new Private Endpoint as a new internal exposure point
&lt;/h3&gt;&lt;p&gt;Do not review it as routine plumbing.&lt;/p&gt;
&lt;p&gt;Ask which new network origins now gain private line of sight to the service, and whether those origins still fit the intended trust model.&lt;/p&gt;
&lt;h3 id="default-to-suspicion-when-duplicate-endpoints-cross-trust-zones"&gt;Default to suspicion when duplicate endpoints cross trust zones
&lt;/h3&gt;&lt;p&gt;This is the opinionated line worth keeping.&lt;/p&gt;
&lt;p&gt;If the same service needs multiple Private Endpoints in differently trusted or differently administered networks, treat that as architectural debt by default until the design can justify it under compromise assumptions.&lt;/p&gt;
&lt;h3 id="review-target-service-spread-not-just-endpoint-counts"&gt;Review target-service spread, not just endpoint counts
&lt;/h3&gt;&lt;p&gt;A platform can have a high number of endpoints and still be relatively disciplined.&lt;/p&gt;
&lt;p&gt;What you need to understand is which high-value services are privately reachable from how many distinct places, under whose control, and whether those paths still map to live business intent.&lt;/p&gt;
&lt;h3 id="include-dns-and-ownership-in-the-exposure-model"&gt;Include DNS and ownership in the exposure model
&lt;/h3&gt;&lt;p&gt;Private access is only meaningful if you understand how workloads discover the service and who controls the network objects that make that possible.&lt;/p&gt;
&lt;p&gt;If service ownership does not include usable visibility of private access paths, the service boundary is already weaker than it appears.&lt;/p&gt;
&lt;h3 id="treat-orphaned-private-paths-as-security-relevant-until-proven-otherwise"&gt;Treat orphaned private paths as security-relevant until proven otherwise
&lt;/h3&gt;&lt;p&gt;A Private Endpoint attached to a retired, forgotten, or poorly understood workload should not be considered harmless background noise. It should be treated as shadow access until someone proves it still belongs in the architecture.&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; &lt;p&gt;Private Endpoint sprawl is what happens when private connectivity stops being a deliberate design and becomes a habit.&lt;/p&gt;
&lt;p&gt;The danger is not that private access makes a service insecure by itself. The danger is that duplicated private paths quietly reshape trust, reachability, and incident assumptions until your architecture says “contained” while your network says otherwise.&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/private-link/private-endpoint-overview" target="_blank" rel="noopener"
&gt;Azure Private Endpoint documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-link-overview" target="_blank" rel="noopener"
&gt;What is Azure Private Link?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/azure/private-link/private-endpoint-dns" target="_blank" rel="noopener"
&gt;Azure Private Endpoint DNS configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/cli/azure/network/private-endpoint" target="_blank" rel="noopener"
&gt;Azure CLI - Private Endpoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>