Entra ID - The Conditional Chaos Engine
Most organizations believe they have identity security under control — but in reality, they’re operating with ambiguity, over-permissioned access, and fragile policies that only work on paper. In this episode, we break down how to move from identity sprawl and “heroic” incident response to a boring, disciplined, and effective security loop. You’ll learn how to pay down identity debt, reduce blast radius, and turn conditional access from a blunt execution engine into clear, enforceable policy — without grinding the business to a halt. This is a practical, operator-focused conversation about what actually works at scale. What You’ll Learn
- Why most identity programs fail despite heavy tooling
- The real cost of identity debt — and how it quietly compounds risk
- Why “hero weekends” are a red flag, not a success story
- How a 90-day remediation cadence creates momentum without chaos
- The three phases of moving from ambiguity to enforceable intent
- How to design conditional access policies that don’t break the business
- Practical guidance for break-glass access, privilege ownership, and exclusions
- How to shrink blast radius systematically — not reactively
- Why identity security often looks mature on the surface while remaining fundamentally fragile underneath
- How identity debt forms, compounds over time, and quietly increases organizational risk
- The dangers of “just in case” access and how over-permissioning becomes normalized
- Why reactive, high-effort security work is a warning sign — not a success metric
- How disciplined, repeatable remediation outperforms heroic incident response
- What a sustainable identity cleanup loop actually looks like in real environments
- The role of clarity and ownership in making security policies enforceable
- Why conditional access should be treated as an execution layer, not a decision engine
- Common failure modes in conditional access design and how to avoid them
- Practical approaches to privileged access, emergency accounts, and policy exclusions
- How to ship an initial identity security baseline without blocking the business
- Why incremental improvement beats waiting for a “perfect” security posture
- How reducing blast radius becomes a predictable outcome — not a lucky accident
- Security maturity isn’t about speed — it’s about repeatability
- Reducing ambiguity is what makes intent enforceable
- Strong identity programs favor boring, consistent execution over heroics
- Conditional access only works when ownership and outcomes are clear
- Progress comes from shipping baselines early and improving them on schedule
- Security and IAM leaders
- Cloud and platform engineers
- CISOs and security architects
- Anyone responsible for access, identity, or zero-trust initiatives
Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-show-modern-work-security-and-productivity-with-microsoft-365--6704921/support.
00:00:00,000 --> 00:00:01,960
Most organizations think their Azure problems
2
00:00:01,960 --> 00:00:04,320
are cost network or VM configuration.
3
00:00:04,320 --> 00:00:05,160
They are not.
4
00:00:05,160 --> 00:00:06,600
Your failures start in identity
5
00:00:06,600 --> 00:00:09,240
because identity is Azure's control plane.
6
00:00:09,240 --> 00:00:12,160
And when conditional access fails during an MFA outage,
7
00:00:12,160 --> 00:00:15,080
responders discover the break glass path wasn't protected.
8
00:00:15,080 --> 00:00:16,480
It was hidden from observation.
9
00:00:16,480 --> 00:00:17,720
We didn't design this wrong.
10
00:00:17,720 --> 00:00:19,080
We stopped designing it.
11
00:00:19,080 --> 00:00:21,320
And the system kept accepting every exception we gave it.
12
00:00:21,320 --> 00:00:24,680
Today I'll show why identity debt accumulates by default,
13
00:00:24,680 --> 00:00:26,480
how it spreads through hybrid sync,
14
00:00:26,480 --> 00:00:28,560
conditional access sprawl workload identities
15
00:00:28,560 --> 00:00:30,360
and B2B guests and how to measure it.
16
00:00:30,360 --> 00:00:32,480
If you can't inventory it, you don't control it.
17
00:00:32,480 --> 00:00:34,600
If you can't measure it, you can't pay it down.
18
00:00:34,600 --> 00:00:37,360
Later I'll show you how to see this drift in your own logs
19
00:00:37,360 --> 00:00:38,360
without a lab.
20
00:00:38,360 --> 00:00:42,920
The foundational misunderstanding, identity as control plane.
21
00:00:42,920 --> 00:00:46,320
Most teams treat Microsoft and RID like a login service.
22
00:00:46,320 --> 00:00:47,280
They are wrong.
23
00:00:47,280 --> 00:00:48,840
Architecturally it is something else.
24
00:00:48,840 --> 00:00:51,880
A distributed decision engine that compiles identity signals
25
00:00:51,880 --> 00:00:54,760
into authorization across Azure M365
26
00:00:54,760 --> 00:00:57,200
and every federated app you've consented.
27
00:00:57,200 --> 00:00:58,880
That distinction matters.
28
00:00:58,880 --> 00:01:01,920
Every sign in every token refresh, every app consent
29
00:01:01,920 --> 00:01:03,280
routes through this engine.
30
00:01:03,280 --> 00:01:05,080
Your policy isn't a static document.
31
00:01:05,080 --> 00:01:07,840
It's an executable program that evaluates users' devices,
32
00:01:07,840 --> 00:01:09,800
risk, protocol and exclusions,
33
00:01:09,800 --> 00:01:11,480
then emits allow deny or prompt.
34
00:01:11,480 --> 00:01:13,440
The more you patch exceptions on to intent,
35
00:01:13,440 --> 00:01:16,000
the more your outputs become probabilistic.
36
00:01:16,000 --> 00:01:18,680
Deterministic policy becomes conditional chaos.
37
00:01:18,680 --> 00:01:20,560
Define this one so it sticks.
38
00:01:20,560 --> 00:01:22,120
Entropy generator.
39
00:01:22,120 --> 00:01:25,160
An identity control that increases state complexity
40
00:01:25,160 --> 00:01:26,920
faster than it reduces risk
41
00:01:26,920 --> 00:01:28,480
when exceptions are added.
42
00:01:28,480 --> 00:01:30,600
Conditional access without lifecycle ownership
43
00:01:30,600 --> 00:01:32,120
is an entropy generator.
44
00:01:32,120 --> 00:01:35,280
Hybrid sync without translation rules is an entropy generator.
45
00:01:35,280 --> 00:01:38,440
Workload identities without ownership are entropy generators.
46
00:01:38,440 --> 00:01:40,840
Guests without lifecycle are entropy generators.
47
00:01:40,840 --> 00:01:42,360
These pathways accumulate.
48
00:01:42,360 --> 00:01:46,480
Here is the dead pattern wheel reference throughout.
49
00:01:46,480 --> 00:01:49,400
Intent, translation, exception,
50
00:01:49,400 --> 00:01:51,080
often, persistence.
51
00:01:51,080 --> 00:01:54,720
Intent, least privilege, MFA, no legacy protocols.
52
00:01:54,720 --> 00:01:58,320
Translation will sync AD at baseline CA on-board apps,
53
00:01:58,320 --> 00:02:00,680
exception, temporarily exclude this group,
54
00:02:00,680 --> 00:02:02,240
this app, this vendor.
55
00:02:02,240 --> 00:02:03,000
Often.
56
00:02:03,000 --> 00:02:06,720
Owner left controls till exists, no telemetry ties it to risk.
57
00:02:06,720 --> 00:02:08,800
Persistence, temporary became permanent,
58
00:02:08,800 --> 00:02:10,400
blast radius increased.
59
00:02:10,400 --> 00:02:13,000
The authorization graph mutates at every exception.
60
00:02:13,000 --> 00:02:16,880
Groups nest, rolls a crew, service principles acquire directory,
61
00:02:16,880 --> 00:02:17,800
read write.
62
00:02:17,800 --> 00:02:21,360
All just for now, guests are excluded
63
00:02:21,360 --> 00:02:23,080
until the migration ends.
64
00:02:23,080 --> 00:02:25,520
Your control plane remembers everything you told it
65
00:02:25,520 --> 00:02:27,520
long after you forgot why.
66
00:02:27,520 --> 00:02:29,840
Over time, policies drift away from intent.
67
00:02:29,840 --> 00:02:31,040
That's identity dead.
68
00:02:31,040 --> 00:02:34,720
Why networks and endpoints can't compensate?
69
00:02:34,720 --> 00:02:36,880
They don't see the authorization compiler.
70
00:02:36,880 --> 00:02:39,120
Firewalls don't evaluate interest device filters.
71
00:02:39,120 --> 00:02:42,720
EDR doesn't understand CA's exclude break glass claws.
72
00:02:42,720 --> 00:02:44,880
You can harden hosts and segment subnets,
73
00:02:44,880 --> 00:02:46,760
but the decision to issue a token
74
00:02:46,760 --> 00:02:49,000
and what that token can do lives above them.
75
00:02:49,000 --> 00:02:50,760
When identity is the control plane,
76
00:02:50,760 --> 00:02:53,320
everything below it becomes best effort containment.
77
00:02:53,320 --> 00:02:55,120
Let me ground this in system behavior.
78
00:02:55,120 --> 00:02:57,600
Synchronization compiles on-prem groups semantics
79
00:02:57,600 --> 00:03:00,960
into a flat tenant with rolls, scopes and admin units.
80
00:03:00,960 --> 00:03:02,960
OU intent is lost in translation.
81
00:03:02,960 --> 00:03:05,000
If synced admins arrive with broad rights
82
00:03:05,000 --> 00:03:07,120
as your inherits over permissioned identities
83
00:03:07,120 --> 00:03:08,200
deterministically.
84
00:03:08,200 --> 00:03:11,720
Conditional access compiles, if then logic at runtime.
85
00:03:11,720 --> 00:03:13,560
It's an execution engine, not governance.
86
00:03:13,560 --> 00:03:16,760
Every exclusion is a branch that bypasses your policy pipeline,
87
00:03:16,760 --> 00:03:19,240
branches multiply, coverage fragments.
88
00:03:19,240 --> 00:03:21,240
Report only purgatory feels safe
89
00:03:21,240 --> 00:03:23,200
until an outage proves otherwise.
90
00:03:23,200 --> 00:03:25,560
Tokens are short-lived, but refresh is long-lived.
91
00:03:25,560 --> 00:03:27,680
If an identity's standing privilege is wrong,
92
00:03:27,680 --> 00:03:30,560
short-lived tokens just refresh the wrong decision every hour.
93
00:03:30,560 --> 00:03:33,000
Least privilege must exist before the token is minted
94
00:03:33,000 --> 00:03:34,400
not after it's used.
95
00:03:34,400 --> 00:03:36,160
Workload identities never see MFA.
96
00:03:36,160 --> 00:03:37,000
That's by design.
97
00:03:37,000 --> 00:03:38,960
They either have secrets, certificates
98
00:03:38,960 --> 00:03:40,680
or federated credentials.
99
00:03:40,680 --> 00:03:43,320
If they're overscoped, you won't get a helpful prompt.
100
00:03:43,320 --> 00:03:44,920
You'll get silent drift in your tenant.
101
00:03:44,920 --> 00:03:46,680
Guests don't share your assumptions.
102
00:03:46,680 --> 00:03:48,600
Cross tenant trust settings, access reviews
103
00:03:48,600 --> 00:03:50,800
and group nesting rules either in code,
104
00:03:50,800 --> 00:03:52,680
the trust boundary or dissolve it.
105
00:03:52,680 --> 00:03:54,360
Temporary collaboration without life cycle
106
00:03:54,360 --> 00:03:56,280
becomes privilege persistence.
107
00:03:56,280 --> 00:03:57,560
Now the uncomfortable truth.
108
00:03:57,560 --> 00:04:00,000
Your identity program likely lacks life cycle.
109
00:04:00,000 --> 00:04:02,560
There is no practice path to remove an exception,
110
00:04:02,560 --> 00:04:05,200
rotate a secret, decommissioned a vendor,
111
00:04:05,200 --> 00:04:06,280
or retire a policy.
112
00:04:06,280 --> 00:04:07,560
Therefore, the exceptions win.
113
00:04:07,560 --> 00:04:10,880
Governance requires ownership, review and expiry.
114
00:04:10,880 --> 00:04:13,360
The execution engine only enforces whatever remains.
115
00:04:13,360 --> 00:04:15,080
Measurement must arrive early.
116
00:04:15,080 --> 00:04:17,040
If you can't inventory exclusions,
117
00:04:17,040 --> 00:04:19,080
legacy author temps, non-expiring secrets,
118
00:04:19,080 --> 00:04:20,880
broad graph grants, privileged guests
119
00:04:20,880 --> 00:04:22,600
and synced admins you're guessing,
120
00:04:22,600 --> 00:04:25,520
start thinking in queries, not dashboards.
121
00:04:25,520 --> 00:04:28,320
Sign-in logs filtered for excluded from policy.
122
00:04:28,320 --> 00:04:30,840
KQL for legacy protocol usage over time,
123
00:04:30,840 --> 00:04:33,760
graph queries for service principles with directory,
124
00:04:33,760 --> 00:04:34,680
and no owner.
125
00:04:34,680 --> 00:04:36,800
Access review completion rates for privileged groups
126
00:04:36,800 --> 00:04:37,640
and guests.
127
00:04:37,640 --> 00:04:39,480
Identity debt is not theoretical.
128
00:04:39,480 --> 00:04:40,160
It's observable.
129
00:04:40,160 --> 00:04:42,560
The logs tell you where the control plane is already diverging
130
00:04:42,560 --> 00:04:43,560
from intent.
131
00:04:43,560 --> 00:04:46,240
Once you see that divergence, the case studies make sense.
132
00:04:46,240 --> 00:04:48,520
And once you accept identity as the control plane,
133
00:04:48,520 --> 00:04:52,360
you'll stop expecting networks to fix authorization.
134
00:04:52,360 --> 00:04:56,000
Case study context one, hybrid identity debt propagation,
135
00:04:56,000 --> 00:04:59,000
hybrid is where Azure inherits debt deterministically,
136
00:04:59,000 --> 00:05:00,760
active directory synchronizes objects.
137
00:05:00,760 --> 00:05:02,280
It does not synchronize intent.
138
00:05:02,280 --> 00:05:04,280
That distinction matters because the minute you flip
139
00:05:04,280 --> 00:05:05,600
on synchronization,
140
00:05:05,600 --> 00:05:07,680
Entra compiles your on-prem assumptions
141
00:05:07,680 --> 00:05:10,960
into a flat tenant with rolls, scopes and admin units.
142
00:05:10,960 --> 00:05:14,000
OU hierarchy, GPO scoping, and delegated OU rights
143
00:05:14,000 --> 00:05:15,280
don't exist in Entra.
144
00:05:15,280 --> 00:05:17,520
They collapse into groups, role assignments,
145
00:05:17,520 --> 00:05:19,760
and if you build them administrative units.
146
00:05:19,760 --> 00:05:21,480
The translation throws away structure
147
00:05:21,480 --> 00:05:23,240
you relied on for least privilege.
148
00:05:23,240 --> 00:05:24,640
Here's what the system actually does.
149
00:05:24,640 --> 00:05:27,640
It reads users and groups, applies attribute flows,
150
00:05:27,640 --> 00:05:29,640
projects identities into the tenant,
151
00:05:29,640 --> 00:05:31,880
and links them to your authorization graph.
152
00:05:31,880 --> 00:05:33,880
If a domain admin is also an exchange admin
153
00:05:33,880 --> 00:05:36,880
and sits in three legacy IT all access groups,
154
00:05:36,880 --> 00:05:38,920
synchronization doesn't challenge that design.
155
00:05:38,920 --> 00:05:39,840
It preserves it.
156
00:05:39,840 --> 00:05:40,880
Azure doesn't ask why.
157
00:05:40,880 --> 00:05:43,480
It accepts the input and emits tokens accordingly.
158
00:05:43,480 --> 00:05:46,120
Dead signals show up early if you know where to look.
159
00:05:46,120 --> 00:05:47,520
Start with the obvious one.
160
00:05:47,520 --> 00:05:49,000
Sync global administrators.
161
00:05:49,000 --> 00:05:52,280
If any global admin accounts are on-prem and synchronized,
162
00:05:52,280 --> 00:05:54,560
Azure now trusts your domain controller health
163
00:05:54,560 --> 00:05:56,440
to guard the tenant's most powerful role.
164
00:05:56,440 --> 00:05:58,480
That's not resilience, that is coupling.
165
00:05:58,480 --> 00:06:00,120
If those accounts share passwords,
166
00:06:00,120 --> 00:06:03,080
if those admins sign in from unmanaged devices,
167
00:06:03,080 --> 00:06:04,320
Entra will honor that path
168
00:06:04,320 --> 00:06:06,640
because synchronization blessed the identity.
169
00:06:06,640 --> 00:06:08,960
You just extended your blast radius across planes.
170
00:06:08,960 --> 00:06:11,440
Second signal, legacy protocol residues.
171
00:06:11,440 --> 00:06:13,200
You said block legacy authentication,
172
00:06:13,200 --> 00:06:15,760
but exchange online still honors IMAP or Pope
173
00:06:15,760 --> 00:06:17,680
for certain mailboxes because a temporary exception
174
00:06:17,680 --> 00:06:18,760
sits in the tenant.
175
00:06:18,760 --> 00:06:20,680
Password spray hits legacy endpoints.
176
00:06:20,680 --> 00:06:23,400
The CA policy that would have blocked it never evaluates
177
00:06:23,400 --> 00:06:25,840
because legacy auth doesn't support modern claims.
178
00:06:25,840 --> 00:06:29,080
Hybrid made it easy to believe we blocked it on the firewall.
179
00:06:29,080 --> 00:06:31,800
The authorization compiler never checked your firewall.
180
00:06:31,800 --> 00:06:33,440
Third signal, flat group structures.
181
00:06:33,440 --> 00:06:36,320
On-prem you used OU's to reflect departments, regions,
182
00:06:36,320 --> 00:06:37,560
and admin boundaries.
183
00:06:37,560 --> 00:06:39,440
In Entra there is no OU tree.
184
00:06:39,440 --> 00:06:41,480
If you synchronize raw groups with vague names
185
00:06:41,480 --> 00:06:44,040
and broad membership, you manufacture universal keys.
186
00:06:44,040 --> 00:06:45,720
Those groups become assignments scaffolding
187
00:06:45,720 --> 00:06:47,520
for app roles and Azure RBX.
188
00:06:47,520 --> 00:06:50,720
They drift from HR London to HR to everyone who asked.
189
00:06:50,720 --> 00:06:53,960
And nobody notices because membership still syncs cleanly.
190
00:06:53,960 --> 00:06:56,840
Clean replication of bad semantics is still bad.
191
00:06:56,840 --> 00:06:57,960
Now the failure modes.
192
00:06:57,960 --> 00:07:00,720
Failure mode one shared admins.
193
00:07:00,720 --> 00:07:04,080
A help desk service account with domain admin privileges
194
00:07:04,080 --> 00:07:06,160
created to work around a legacy tool
195
00:07:06,160 --> 00:07:07,960
is synchronized into Entra.
196
00:07:07,960 --> 00:07:10,800
Added to a group that has global reader for convenience,
197
00:07:10,800 --> 00:07:13,280
then later elevated to privilege role administrator
198
00:07:13,280 --> 00:07:14,800
during a migration.
199
00:07:14,800 --> 00:07:16,040
Nobody rotated the password.
200
00:07:16,040 --> 00:07:17,360
Nobody added PM.
201
00:07:17,360 --> 00:07:20,080
That identity now escalates in the cloud
202
00:07:20,080 --> 00:07:22,680
with the same shared secret that half the team knows.
203
00:07:22,680 --> 00:07:25,320
Failure mode two, NTLM and IMAP ghosts.
204
00:07:25,320 --> 00:07:27,240
Your password hash sync works.
205
00:07:27,240 --> 00:07:30,320
Your pass through agent is healthy and federation is gone.
206
00:07:30,320 --> 00:07:33,280
But pop and IMAP are still enabled for a handful of mailboxes
207
00:07:33,280 --> 00:07:36,560
because a third party archive are needed for a week.
208
00:07:36,560 --> 00:07:39,160
Six months later, the same mailbox becomes the foothold
209
00:07:39,160 --> 00:07:40,360
for a password spray.
210
00:07:40,360 --> 00:07:42,120
Conditional access never saw the traffic.
211
00:07:42,120 --> 00:07:46,000
Your logs show legacy auth succeeded from an unexpected ASN.
212
00:07:46,000 --> 00:07:48,800
But your policy engine wasn't called failure mode three
213
00:07:48,800 --> 00:07:50,120
or use semantics lost.
214
00:07:50,120 --> 00:07:52,040
You delegated or you scoped admin rights
215
00:07:52,040 --> 00:07:53,680
to a regional IT team on prem.
216
00:07:53,680 --> 00:07:56,040
In Entra, you never created admin units.
217
00:07:56,040 --> 00:07:58,920
The same team asks for app admin to manage a local SAS.
218
00:07:58,920 --> 00:08:01,600
Your grant application administrator, tenant-wide,
219
00:08:01,600 --> 00:08:04,520
intent was regional scope, translation yielded tenant scope,
220
00:08:04,520 --> 00:08:06,640
that is not drift, that is design omission.
221
00:08:06,640 --> 00:08:09,760
Hybrid also breaks privilege boundaries during incidents.
222
00:08:09,760 --> 00:08:12,600
During a domain controller outage, password hash sync stays
223
00:08:12,600 --> 00:08:15,160
good long enough to keep authenticating cloud users.
224
00:08:15,160 --> 00:08:16,680
That feels like resilience.
225
00:08:16,680 --> 00:08:19,200
Then your responders realize their on-prem admin identities
226
00:08:19,200 --> 00:08:21,240
were also their cloud admin identities.
227
00:08:21,240 --> 00:08:24,280
They can't isolate one plane without sacrificing the other.
228
00:08:24,280 --> 00:08:26,000
Privilege accretion survived sync
229
00:08:26,000 --> 00:08:28,920
and now outage handling must account for two control planes
230
00:08:28,920 --> 00:08:30,280
with one set of credentials.
231
00:08:30,280 --> 00:08:32,680
Here's the uncomfortable truth surfacing again.
232
00:08:32,680 --> 00:08:35,800
Lift and sync erodes least privilege before day one.
233
00:08:35,800 --> 00:08:37,640
Not because synchronization is flawed,
234
00:08:37,640 --> 00:08:39,760
but because translation from OU based governance
235
00:08:39,760 --> 00:08:42,400
to role-based cloud scope was never designed.
236
00:08:42,400 --> 00:08:43,920
You synchronized identities.
237
00:08:43,920 --> 00:08:45,760
You did not synchronize boundaries.
238
00:08:45,760 --> 00:08:48,160
If you're an identity architect, this is where your design
239
00:08:48,160 --> 00:08:48,880
leaked.
240
00:08:48,880 --> 00:08:51,320
You assumed OU semantics would survive a platform
241
00:08:51,320 --> 00:08:52,840
that doesn't have OUs.
242
00:08:52,840 --> 00:08:54,120
So what should you observe today?
243
00:08:54,120 --> 00:08:56,080
Entra users flagged on-premises synced
244
00:08:56,080 --> 00:08:59,000
who hold global administrator, privileged role administrator
245
00:08:59,000 --> 00:09:00,760
or application administrator.
246
00:09:00,760 --> 00:09:04,120
Sign-in logs showing client app legacy authentication events
247
00:09:04,120 --> 00:09:06,080
tied to synchronized users.
248
00:09:06,080 --> 00:09:09,040
Groups with generic names used in Azure R back assignments
249
00:09:09,040 --> 00:09:11,040
at subscription or management group scope,
250
00:09:11,040 --> 00:09:13,200
whose owners are synchronized and unaccountable.
251
00:09:13,200 --> 00:09:16,240
No admin units or admin units without role assignments,
252
00:09:16,240 --> 00:09:18,680
meaning your regional delegations are fiction.
253
00:09:18,680 --> 00:09:21,080
Once you see those, the fixed pattern becomes obvious
254
00:09:21,080 --> 00:09:24,480
in the next section, break the inheritance, localize power,
255
00:09:24,480 --> 00:09:27,320
and separate cloud admin lifecycle from on-prem.
256
00:09:27,320 --> 00:09:29,360
Because until you sever those couplings,
257
00:09:29,360 --> 00:09:31,360
Azure will continue to faithfully compile
258
00:09:31,360 --> 00:09:33,560
your oldest assumptions into today's authorization
259
00:09:33,560 --> 00:09:34,720
decisions.
260
00:09:34,720 --> 00:09:35,880
Hybrid identity.
261
00:09:35,880 --> 00:09:38,080
Break the inheritance, localize power.
262
00:09:38,080 --> 00:09:39,720
The thing most people miss is simple.
263
00:09:39,720 --> 00:09:41,240
The cloud will faithfully preserve
264
00:09:41,240 --> 00:09:43,000
whatever privilege accretion you hand it.
265
00:09:43,000 --> 00:09:44,240
It does not negotiate.
266
00:09:44,240 --> 00:09:46,480
If you want least privilege, you have to assert it here
267
00:09:46,480 --> 00:09:48,760
at the control plane with constructs
268
00:09:48,760 --> 00:09:52,080
the engine actually understands why this matters.
269
00:09:52,080 --> 00:09:55,080
When admin identities and permissions flow from AD to Entra
270
00:09:55,080 --> 00:09:57,120
without redesign, you are not integrating.
271
00:09:57,120 --> 00:09:58,680
You are extending blast radius,
272
00:09:58,680 --> 00:09:59,880
every incident, every exception,
273
00:09:59,880 --> 00:10:02,240
every shared account now spans two planes.
274
00:10:02,240 --> 00:10:04,040
The reason this works is deterministic.
275
00:10:04,040 --> 00:10:07,080
Synchronization copies objects, authorization compiles them.
276
00:10:07,080 --> 00:10:09,560
If you remember nothing else, remember this.
277
00:10:09,560 --> 00:10:12,000
Break the inheritance before you attempt control.
278
00:10:12,000 --> 00:10:13,000
What to change?
279
00:10:13,000 --> 00:10:16,600
You need three moves that reassert intent in cloud-native terms.
280
00:10:16,600 --> 00:10:19,040
Cloud-only admin identities that never synchronize.
281
00:10:19,040 --> 00:10:22,160
Roadscope that matches reality in forced-wire admin units.
282
00:10:22,160 --> 00:10:25,200
Just in time access, so privilege exists only when needed.
283
00:10:25,200 --> 00:10:28,240
Let me show you exactly how to anchor each one.
284
00:10:28,240 --> 00:10:30,280
First, cloud-only admin roles.
285
00:10:30,280 --> 00:10:32,960
Create administrator accounts that live only in Entra.
286
00:10:32,960 --> 00:10:35,400
No on-prem UPN, no synchronization object,
287
00:10:35,400 --> 00:10:37,360
and no password sync dependency.
288
00:10:37,360 --> 00:10:40,040
Assign them administrative roles through privilege identity
289
00:10:40,040 --> 00:10:42,160
management so they are eligible not standing.
290
00:10:42,160 --> 00:10:44,240
The reason this works is you've removed the coupling
291
00:10:44,240 --> 00:10:47,080
to domain controller, health, and local machine posture.
292
00:10:47,080 --> 00:10:49,480
Your cloud admin credential can be fenced
293
00:10:49,480 --> 00:10:52,120
with phishing resistant strengths and device requirements.
294
00:10:52,120 --> 00:10:53,960
The on-prem account can't satisfy.
295
00:10:53,960 --> 00:10:55,760
Once you nail that everything else clicks,
296
00:10:55,760 --> 00:10:58,600
passwords for operational identities stop being your incident
297
00:10:58,600 --> 00:11:01,160
workaround and break glass becomes a tested path,
298
00:11:01,160 --> 00:11:02,240
not an assumption.
299
00:11:02,240 --> 00:11:04,960
Second, localize power with administrative units.
300
00:11:04,960 --> 00:11:07,040
OU semantics don't translate, therefore you must
301
00:11:07,040 --> 00:11:08,920
reintroduce scope deliberately.
302
00:11:08,920 --> 00:11:12,280
Build admin units aligned to the natural seams of your organization,
303
00:11:12,280 --> 00:11:15,800
region, subsidiary, or function, and place the users and groups
304
00:11:15,800 --> 00:11:18,200
that truly belong to that scope inside.
305
00:11:18,200 --> 00:11:20,920
Then delegate only the roles that team needs
306
00:11:20,920 --> 00:11:23,120
against that admin unit, not the tenant.
307
00:11:23,120 --> 00:11:25,600
Helpdesk user administrator, groups administrator,
308
00:11:25,600 --> 00:11:27,080
limited to that boundary.
309
00:11:27,080 --> 00:11:29,880
The game changer nobody talks about is what you don't add.
310
00:11:29,880 --> 00:11:33,600
Never add the group itself if your intent is to manage the people.
311
00:11:33,600 --> 00:11:34,760
Add the users.
312
00:11:34,760 --> 00:11:36,920
Otherwise you've created an elevation path
313
00:11:36,920 --> 00:11:38,360
by membership manipulation.
314
00:11:38,360 --> 00:11:40,000
That distinction matters.
315
00:11:40,000 --> 00:11:42,160
Third, enforce just in time with PIM.
316
00:11:42,160 --> 00:11:43,800
Standing privilege is not resilience,
317
00:11:43,800 --> 00:11:44,800
it's security dead.
318
00:11:44,800 --> 00:11:46,560
Make every privilege role eligible,
319
00:11:46,560 --> 00:11:48,920
require strong authentication at activation.
320
00:11:48,920 --> 00:11:51,520
Add an authentication context if you want a compliant device
321
00:11:51,520 --> 00:11:53,440
or a known location for elevation.
322
00:11:53,440 --> 00:11:55,760
Set maximum durations that reflect real work,
323
00:11:55,760 --> 00:11:57,240
not eight hour defaults.
324
00:11:57,240 --> 00:12:00,400
The reason this works is you're forcing the authorization compiler
325
00:12:00,400 --> 00:12:02,680
to re-evaluate risk and controls at the moment
326
00:12:02,680 --> 00:12:05,160
privilege materializes, not after the fact.
327
00:12:05,160 --> 00:12:06,960
And yes, document approvals.
328
00:12:06,960 --> 00:12:09,920
If nobody approves anything, then time is your only guardrail.
329
00:12:09,920 --> 00:12:11,840
Treat durations as blast radius windows.
330
00:12:11,840 --> 00:12:13,360
Now here's where most people mess up.
331
00:12:13,360 --> 00:12:15,520
They block synchronized global admins,
332
00:12:15,520 --> 00:12:17,640
but leave synchronized application administrators,
333
00:12:17,640 --> 00:12:19,120
cloud-app security administrators,
334
00:12:19,120 --> 00:12:21,520
or exchange administrators intact rationalizing.
335
00:12:21,520 --> 00:12:22,880
It's not global, it's not.
336
00:12:22,880 --> 00:12:25,200
It is not, but those roles compose attack parts
337
00:12:25,200 --> 00:12:27,760
when combined with app ownership and consent flows.
338
00:12:27,760 --> 00:12:29,760
Remove synchronization for any identity
339
00:12:29,760 --> 00:12:31,560
that holds tenant-level roles.
340
00:12:31,560 --> 00:12:33,400
If you must delegate to synchronized users
341
00:12:33,400 --> 00:12:35,200
for business operations, keep those roles
342
00:12:35,200 --> 00:12:38,000
scoped to admin units or application objects
343
00:12:38,000 --> 00:12:41,240
and keep the path to tenant-wide rights cloud-only.
344
00:12:41,240 --> 00:12:43,880
Evidence you can pull today to verify progress.
345
00:12:43,880 --> 00:12:46,440
Entra users list-filtered to on-prem sync enabled
346
00:12:46,440 --> 00:12:48,840
equals true intersecting with directory role assignments.
347
00:12:48,840 --> 00:12:51,920
That surface should be empty for tenant-wide privilege roles.
348
00:12:51,920 --> 00:12:55,640
Role assignment inventory where scope equals what tenant root.
349
00:12:55,640 --> 00:12:58,080
Every principle here should be cloud-only,
350
00:12:58,080 --> 00:13:01,040
pimp, eligible, and bound to phishing-resistant strengths.
351
00:13:01,040 --> 00:13:03,000
Admin units with role assignments.
352
00:13:03,000 --> 00:13:05,280
If you have admin units, but zero assignments,
353
00:13:05,280 --> 00:13:07,000
you've built boxes with no locks.
354
00:13:07,000 --> 00:13:08,520
You haven't localized power.
355
00:13:08,520 --> 00:13:10,480
You've only drawn a map.
356
00:13:10,480 --> 00:13:12,080
Common mistakes to avoid.
357
00:13:12,080 --> 00:13:14,480
Treating AD groups is truth for cloud roles.
358
00:13:14,480 --> 00:13:15,920
Group membership in a synced group
359
00:13:15,920 --> 00:13:17,920
is not a control boundary in Entra.
360
00:13:17,920 --> 00:13:19,360
It's an entropy generator.
361
00:13:19,360 --> 00:13:21,800
If you need a group to receive a privilege role,
362
00:13:21,800 --> 00:13:25,000
make it a cloud-only group flag to accept directory roles
363
00:13:25,000 --> 00:13:27,600
and keep membership assigned, not dynamic.
364
00:13:27,600 --> 00:13:30,560
Ignoring privileged access workstations for cloud auth.
365
00:13:30,560 --> 00:13:33,080
If your admins can elevate from unmanaged devices,
366
00:13:33,080 --> 00:13:35,680
your compliant device story is a slogan.
367
00:13:35,680 --> 00:13:38,600
Type in activation to an authentication context
368
00:13:38,600 --> 00:13:41,120
that enforces a compliant, registered device
369
00:13:41,120 --> 00:13:43,840
or a hardware backed passkey, relying on pass-through
370
00:13:43,840 --> 00:13:45,680
or federation to keep auth on-prem.
371
00:13:45,680 --> 00:13:48,440
federation does not change where authorization happens.
372
00:13:48,440 --> 00:13:50,520
Conditional access still compiles in Entra.
373
00:13:50,520 --> 00:13:53,080
You've added fragility without gaining control.
374
00:13:53,080 --> 00:13:54,680
Quick win you can achieve today.
375
00:13:54,680 --> 00:13:57,120
Icelate breakglas from synchronization.
376
00:13:57,120 --> 00:13:59,360
Create two cloud-only emergency access accounts
377
00:13:59,360 --> 00:14:00,960
with long-valtered passwords
378
00:14:00,960 --> 00:14:02,680
and no conditional access enforcement
379
00:14:02,680 --> 00:14:04,400
other than location-allow listing,
380
00:14:04,400 --> 00:14:05,880
then verify two things.
381
00:14:05,880 --> 00:14:09,200
They sign in and their sign-ins show up in your logs.
382
00:14:09,200 --> 00:14:11,320
If you can't see them, you can't trust them.
383
00:14:11,320 --> 00:14:12,880
Then enumerate synchronized admins,
384
00:14:12,880 --> 00:14:15,240
remove tenant-wide roles from any synced principle
385
00:14:15,240 --> 00:14:17,120
and replace those parts with pimp-eligible
386
00:14:17,120 --> 00:14:19,840
cloud-only accounts scoped through admin units.
387
00:14:19,840 --> 00:14:22,120
That severing of inheritance is the pivot.
388
00:14:22,120 --> 00:14:25,120
Once you do it, your hybrid story stops being a liability
389
00:14:25,120 --> 00:14:26,680
and starts being a choice.
390
00:14:26,680 --> 00:14:29,960
Case study context two, conditional access policies sprawl.
391
00:14:29,960 --> 00:14:31,800
Once you sever hybrid inheritance,
392
00:14:31,800 --> 00:14:33,720
the next entropy generator is waiting.
393
00:14:33,720 --> 00:14:36,760
Conditional access, it starts elegant, a few clear policies.
394
00:14:36,760 --> 00:14:39,040
Then the complaints arrive, the outages happen
395
00:14:39,040 --> 00:14:41,880
and the execution engine gets paved over with exceptions.
396
00:14:41,880 --> 00:14:44,600
Two years in, CA becomes identity-dead central.
397
00:14:44,600 --> 00:14:47,120
The symptom pattern is consistent, policy per problem,
398
00:14:47,120 --> 00:14:48,640
exclusions per complaint,
399
00:14:48,640 --> 00:14:50,360
someone can't access a legacy app
400
00:14:50,360 --> 00:14:53,000
so you create an app-specific policy with a bypass.
401
00:14:53,000 --> 00:14:54,680
An executive gets prompted too often,
402
00:14:54,680 --> 00:14:56,000
so you exclude a group.
403
00:14:56,000 --> 00:14:57,320
A vendor needs temporary access
404
00:14:57,320 --> 00:14:59,480
so you carve out a location-allow list.
405
00:14:59,480 --> 00:15:00,720
None of these are governance,
406
00:15:00,720 --> 00:15:03,000
they are branches in code you no longer review.
407
00:15:03,000 --> 00:15:06,120
Branches multiply, dead signals are loud if you listen.
408
00:15:06,120 --> 00:15:09,160
Pause here, this is the mistake most teams don't see.
409
00:15:09,160 --> 00:15:12,120
The first is the comfort phrase, exclude break glass.
410
00:15:12,120 --> 00:15:13,880
You meant to protect emergency access.
411
00:15:13,880 --> 00:15:16,880
Instead, you hid it from evaluation and from observation.
412
00:15:16,880 --> 00:15:18,560
If a sign in never meets a policy,
413
00:15:18,560 --> 00:15:21,320
it never emits the telemetry tie to that policy.
414
00:15:21,320 --> 00:15:23,240
Break glass wasn't protected, it was invisible.
415
00:15:23,240 --> 00:15:25,080
That distinction matters.
416
00:15:25,080 --> 00:15:28,240
Second signal, app-specific bypasses with no owner.
417
00:15:28,240 --> 00:15:30,360
Look for policies that target one application
418
00:15:30,360 --> 00:15:32,720
and exclude one or two groups temporarily.
419
00:15:32,720 --> 00:15:34,720
If the policy object has no business owner,
420
00:15:34,720 --> 00:15:36,960
no expiry and no last-reviewed note,
421
00:15:36,960 --> 00:15:39,080
you're running unordated code in production.
422
00:15:39,080 --> 00:15:40,600
Ownership is governance.
423
00:15:40,600 --> 00:15:42,760
Everything else is drift.
424
00:15:42,760 --> 00:15:45,400
Third signal, overlapping controls.
425
00:15:45,400 --> 00:15:48,600
You require MFA in one policy for all cloud apps.
426
00:15:48,600 --> 00:15:51,920
You require fishing resistance strengths for privileged roles.
427
00:15:51,920 --> 00:15:54,000
You block legacy protocols in a third,
428
00:15:54,000 --> 00:15:55,760
but then you exclude trusted locations
429
00:15:55,760 --> 00:15:57,480
on the first exclude service accounts
430
00:15:57,480 --> 00:15:59,760
on the second and carve out IMAP on the third.
431
00:15:59,760 --> 00:16:02,560
The evaluation pipeline can produce contradictory results
432
00:16:02,560 --> 00:16:03,840
across paths.
433
00:16:03,840 --> 00:16:05,400
The outcome is probabilistic.
434
00:16:05,400 --> 00:16:08,440
Access depends on which branch short circuits first.
435
00:16:08,440 --> 00:16:11,200
If you remember nothing else from this section, remember this.
436
00:16:11,200 --> 00:16:13,160
Conditional access debt hides in the paths
437
00:16:13,160 --> 00:16:14,560
where policy never runs.
438
00:16:14,560 --> 00:16:15,720
If you don't fix those branches,
439
00:16:15,720 --> 00:16:18,560
your next outage will be negotiated with exceptions you can't see.
440
00:16:18,560 --> 00:16:20,760
Here's the near miss, most teams don't forget.
441
00:16:20,760 --> 00:16:23,120
An MFA provider outage overlaps with your MFA
442
00:16:23,120 --> 00:16:24,480
for all users' policy.
443
00:16:24,480 --> 00:16:26,320
Your responders try to use break glass.
444
00:16:26,320 --> 00:16:27,640
It works, technically.
445
00:16:27,640 --> 00:16:30,520
But because the account and path were excluded from policy,
446
00:16:30,520 --> 00:16:32,680
the sign-in doesn't appear where the team expects.
447
00:16:32,680 --> 00:16:34,120
No alert, no visibility.
448
00:16:34,120 --> 00:16:36,040
The responders assume they're still blocked.
449
00:16:36,040 --> 00:16:37,240
Minutes turn to hours.
450
00:16:37,240 --> 00:16:39,000
The incident drags because the escape hatch
451
00:16:39,000 --> 00:16:40,840
was never validated under failure
452
00:16:40,840 --> 00:16:43,360
and the telemetry was never wired to observation.
453
00:16:43,360 --> 00:16:44,840
If you're a security leader,
454
00:16:44,840 --> 00:16:46,840
this is the metric you should demand.
455
00:16:46,840 --> 00:16:49,400
How many privileged sign-ins show conditional access,
456
00:16:49,400 --> 00:16:50,760
not applied and why?
457
00:16:50,760 --> 00:16:53,200
Root cause every time treating conditional access
458
00:16:53,200 --> 00:16:54,440
like governance, it is not.
459
00:16:54,440 --> 00:16:57,880
It's an execution engine that compiles if then rules at sign-in.
460
00:16:57,880 --> 00:17:00,840
It will enforce perfectly even when what remains is wrong.
461
00:17:00,840 --> 00:17:02,720
Governance implies life cycle, ownership,
462
00:17:02,720 --> 00:17:05,680
review, expiry, measurement, CA does none of that for you.
463
00:17:05,680 --> 00:17:08,680
Report only mode feels like safety, but it's often pergatory.
464
00:17:08,680 --> 00:17:11,840
Policy sit there indefinitely because turning them on is scary.
465
00:17:11,840 --> 00:17:15,440
Meanwhile, temporary exceptions remain the only enforced code.
466
00:17:15,440 --> 00:17:17,320
Before we continue, you need to understand
467
00:17:17,320 --> 00:17:19,240
the evaluation flow at a glance.
468
00:17:19,240 --> 00:17:21,560
The engine loads applicable policies based
469
00:17:21,560 --> 00:17:25,000
on user, group, role, app and conditions.
470
00:17:25,000 --> 00:17:26,520
It processes blocks first.
471
00:17:26,520 --> 00:17:29,000
If any policy says block, access ends,
472
00:17:29,000 --> 00:17:32,040
then it applies grant controls, combining requirements
473
00:17:32,040 --> 00:17:35,320
with ant logic unless you explicitly configure OR.
474
00:17:35,320 --> 00:17:38,040
Exclusions remove objects from the policy scope
475
00:17:38,040 --> 00:17:39,320
before evaluation.
476
00:17:39,320 --> 00:17:41,040
That's the pathway where dead hides.
477
00:17:41,040 --> 00:17:43,480
You bypass the compiler altogether.
478
00:17:43,480 --> 00:17:45,280
Let's ground this before moving on.
479
00:17:45,280 --> 00:17:47,720
If a sign-in is excluded, no amount of monitoring
480
00:17:47,720 --> 00:17:49,920
will ever show you the control that didn't run.
481
00:17:49,920 --> 00:17:52,840
Evidence you can pull without clicking through every policy.
482
00:17:52,840 --> 00:17:55,520
Sign-in logs filtered for conditional access,
483
00:17:55,520 --> 00:17:58,000
not applied with a reason of user excluded
484
00:17:58,000 --> 00:17:59,640
or application excluded.
485
00:17:59,640 --> 00:18:00,760
Those are the blind paths.
486
00:18:00,760 --> 00:18:03,120
If they appear for privileged roles or sensitive apps,
487
00:18:03,120 --> 00:18:05,040
you have unordited code running.
488
00:18:05,040 --> 00:18:07,160
A KQL trend of legacy protocol attempts
489
00:18:07,160 --> 00:18:08,800
alongside CA results.
490
00:18:08,800 --> 00:18:11,440
If legacy traffic shows up and CA is not applied,
491
00:18:11,440 --> 00:18:13,920
you're relying on a block that never evaluates.
492
00:18:13,920 --> 00:18:16,120
That's not control, that's hope.
493
00:18:16,120 --> 00:18:19,120
A policy inventory showing count, targets and exclusions.
494
00:18:19,120 --> 00:18:20,960
If your policy count grows linearly
495
00:18:20,960 --> 00:18:23,840
while your coverage of all cloud apps shrinks,
496
00:18:23,840 --> 00:18:26,160
your trading simplicity for fragmentation.
497
00:18:26,160 --> 00:18:28,920
Now the behavioral mistake, trusted locations are treated
498
00:18:28,920 --> 00:18:30,760
as a get out of prompts zone.
499
00:18:30,760 --> 00:18:33,520
The network feels safe, but conditional access has no context
500
00:18:33,520 --> 00:18:36,880
of whether that IP range actually binds to managed devices
501
00:18:36,880 --> 00:18:38,200
or whether the traffic is proxied.
502
00:18:38,200 --> 00:18:40,200
You just taught the compiler to trust a CIDR
503
00:18:40,200 --> 00:18:41,600
more than a device posture.
504
00:18:41,600 --> 00:18:43,920
That choice outlives the justification.
505
00:18:43,920 --> 00:18:47,440
Another recurring trap, service accounts excluded from policies.
506
00:18:47,440 --> 00:18:49,880
There is no such identity class in Entra for CA.
507
00:18:49,880 --> 00:18:52,720
You created a group, you labeled it, you excluded it,
508
00:18:52,720 --> 00:18:54,720
you now have human principles hiding in a category
509
00:18:54,720 --> 00:18:57,000
the engine cannot distinguish from automation.
510
00:18:57,000 --> 00:18:59,400
Workload identities don't even evaluate CA.
511
00:18:59,400 --> 00:19:00,600
Humans do.
512
00:19:00,600 --> 00:19:03,240
Your exclusion is an entropy generator misapplied to people.
513
00:19:03,240 --> 00:19:06,320
And then there's report only limbo, team stage 10 policies,
514
00:19:06,320 --> 00:19:08,200
wait for the perfect moment to turn them on
515
00:19:08,200 --> 00:19:09,560
and leave them inert for quarters.
516
00:19:09,560 --> 00:19:12,680
Meanwhile, incident reviews keep pointing at the same gaps.
517
00:19:12,680 --> 00:19:15,360
If a policy sits in report only for more than a sprint,
518
00:19:15,360 --> 00:19:16,400
it isn't staging.
519
00:19:16,400 --> 00:19:18,040
It is in decision encoded.
520
00:19:18,040 --> 00:19:19,760
What should you recognize in your tenant today?
521
00:19:19,760 --> 00:19:21,520
Policies that target all cloud apps
522
00:19:21,520 --> 00:19:24,720
but exclude one or more executive groups, emergency access
523
00:19:24,720 --> 00:19:26,040
or entire locations.
524
00:19:26,040 --> 00:19:28,400
App targeted policies with no metadata on owner,
525
00:19:28,400 --> 00:19:31,560
reason or expiry, conflicting ground controls across paths.
526
00:19:31,560 --> 00:19:34,360
MFA required here, fishing resistant only there,
527
00:19:34,360 --> 00:19:36,440
device compliance waived somewhere else.
528
00:19:36,440 --> 00:19:38,440
Not applied sign-ins for privileged roles.
529
00:19:38,440 --> 00:19:40,320
If you see those, you've confirmed sprawl.
530
00:19:40,320 --> 00:19:42,760
The fix is not more policies, it's fewer branches,
531
00:19:42,760 --> 00:19:44,760
stronger strengths for high value roles
532
00:19:44,760 --> 00:19:48,000
and a hard stop on exclusions without an owner and a clock.
533
00:19:48,000 --> 00:19:50,560
The execution engine will enforce whatever remains,
534
00:19:50,560 --> 00:19:52,520
make sure what remains reflects intent.
535
00:19:52,520 --> 00:19:55,440
Conditional access as authorization compiler,
536
00:19:55,440 --> 00:19:57,320
baseline, strengths and blocks.
537
00:19:57,320 --> 00:19:58,840
This is the uncomfortable truth.
538
00:19:58,840 --> 00:20:01,120
Conditional access is an authorization compiler.
539
00:20:01,120 --> 00:20:02,800
It takes context at runtime,
540
00:20:02,800 --> 00:20:04,280
who you are, what you're touching,
541
00:20:04,280 --> 00:20:06,200
where you're coming from the device posture
542
00:20:06,200 --> 00:20:07,760
and compiles it into a decision.
543
00:20:07,760 --> 00:20:09,720
Baseline first, then strengths, then blocks.
544
00:20:09,720 --> 00:20:12,080
Keep the surface small, keep the branches obvious.
545
00:20:12,080 --> 00:20:13,680
Everything else is entropy.
546
00:20:13,680 --> 00:20:14,960
Why start with a baseline?
547
00:20:14,960 --> 00:20:17,240
Because the compiler needs a predictable core.
548
00:20:17,240 --> 00:20:20,440
If you try to reason about 10 overlapping policies you won't.
549
00:20:20,440 --> 00:20:22,040
So set three and mean them.
550
00:20:22,040 --> 00:20:24,360
Baseline one, block legacy authentication.
551
00:20:24,360 --> 00:20:27,480
Not reduced, not softened, not except four, block it.
552
00:20:27,480 --> 00:20:30,120
Legacy protocols don't emit the signals the compiler needs.
553
00:20:30,120 --> 00:20:32,640
They bypass the policy pipeline by definition.
554
00:20:32,640 --> 00:20:35,800
If you leave any door open, your logs become a weather report.
555
00:20:35,800 --> 00:20:37,280
Interesting, not controlling.
556
00:20:37,280 --> 00:20:39,880
Baseline two, MFA for all users, yes all.
557
00:20:39,880 --> 00:20:41,960
The compiler should always have a second factor
558
00:20:41,960 --> 00:20:44,360
to resolve risk when signals are ambiguous.
559
00:20:44,360 --> 00:20:46,000
Use it as a flaw, not a ceiling.
560
00:20:46,000 --> 00:20:47,560
You are not promising perfect assurance.
561
00:20:47,560 --> 00:20:49,360
You are avoiding single factor chaos.
562
00:20:49,360 --> 00:20:51,320
Baseline three, fishing resistant strengths
563
00:20:51,320 --> 00:20:52,640
for admins and critical apps.
564
00:20:52,640 --> 00:20:54,800
This is where the baseline becomes opinionated.
565
00:20:54,800 --> 00:20:56,400
A privileged token minted on the back
566
00:20:56,400 --> 00:20:58,480
of a push notification is a time bomb.
567
00:20:58,480 --> 00:21:00,640
Strengths, phyto2, certificate-based,
568
00:21:00,640 --> 00:21:04,720
pass keys, bind the assertion to a device or a key.
569
00:21:04,720 --> 00:21:06,480
That distinction matters.
570
00:21:06,480 --> 00:21:08,200
The thing most people miss is that strengths
571
00:21:08,200 --> 00:21:10,160
are not just harder MFA.
572
00:21:10,160 --> 00:21:12,160
They collapse entire classes of failure.
573
00:21:12,160 --> 00:21:15,720
No prompt bombing, no shared OTPs, no sim swap recovery.
574
00:21:15,720 --> 00:21:17,800
When you require a fishing resistant strength,
575
00:21:17,800 --> 00:21:19,600
the compiler can stop asking the network
576
00:21:19,600 --> 00:21:21,120
to be your identity perimeter.
577
00:21:21,120 --> 00:21:21,920
That is the shift.
578
00:21:21,920 --> 00:21:24,680
Now how to express that cleanly without building a labyrinth?
579
00:21:24,680 --> 00:21:26,600
Think in three policies, not 13.
580
00:21:26,600 --> 00:21:29,320
Policy A, block legacy authentication.
581
00:21:29,320 --> 00:21:31,600
Target all users, all cloud apps, client apps,
582
00:21:31,600 --> 00:21:33,200
conditions set to legacy protocols.
583
00:21:33,200 --> 00:21:34,960
No exclusions, you do not need to be clever.
584
00:21:34,960 --> 00:21:36,200
You need to be complete.
585
00:21:36,200 --> 00:21:38,760
The policy B require MFA for all cloud apps.
586
00:21:38,760 --> 00:21:40,440
Target all users, all cloud apps.
587
00:21:40,440 --> 00:21:42,920
Ground controls require multi factor authentication.
588
00:21:42,920 --> 00:21:45,040
Minimal exclusions for break class only
589
00:21:45,040 --> 00:21:47,240
and time boxed, owned and logged.
590
00:21:47,240 --> 00:21:50,080
If an exception does not have an owner and an expiry,
591
00:21:50,080 --> 00:21:51,440
it is not an exception.
592
00:21:51,440 --> 00:21:52,120
It's an often.
593
00:21:52,120 --> 00:21:56,480
Policy C, require phishing resistant authentication
594
00:21:56,480 --> 00:21:59,120
strengths for privileged roles and high value apps.
595
00:21:59,120 --> 00:22:01,360
Target directory roles and the specific enterprise apps
596
00:22:01,360 --> 00:22:04,760
that move money, modify policy or administer identity.
597
00:22:04,760 --> 00:22:06,800
Ground controls require authentication strength,
598
00:22:06,800 --> 00:22:09,320
phishing resistant or consider also an authentication
599
00:22:09,320 --> 00:22:10,680
context for PM activation.
600
00:22:10,680 --> 00:22:12,600
So elevation inherits the same bar.
601
00:22:12,600 --> 00:22:14,880
This next part separates beginners from pros
602
00:22:14,880 --> 00:22:16,680
to not stack overlapping policy scopes
603
00:22:16,680 --> 00:22:19,320
that silently weaken the strongest requirement.
604
00:22:19,320 --> 00:22:21,720
The compiler evaluates blocks first,
605
00:22:21,720 --> 00:22:23,320
then it combines ground requirements
606
00:22:23,320 --> 00:22:26,840
with and logic inside a policy, but across policies,
607
00:22:26,840 --> 00:22:29,080
the effective result is the union of requirements
608
00:22:29,080 --> 00:22:31,080
applied to the requests path.
609
00:22:31,080 --> 00:22:33,520
If a weaker policy excludes the object, it vanishes.
610
00:22:33,520 --> 00:22:35,280
That's why branches matter more than counts.
611
00:22:35,280 --> 00:22:37,560
Once you nail the baseline, everything else clicks,
612
00:22:37,560 --> 00:22:39,960
you isolate high value paths with strengths.
613
00:22:39,960 --> 00:22:42,280
You block the unobservable legacy flows.
614
00:22:42,280 --> 00:22:44,360
You stop treating MFA as a universal solvent
615
00:22:44,360 --> 00:22:45,960
and start using it as table stakes.
616
00:22:45,960 --> 00:22:47,520
Now, the blocks.
617
00:22:47,520 --> 00:22:49,360
There are only two that deserve to exist.
618
00:22:49,360 --> 00:22:52,120
Block one, legacy authentication, we already covered it.
619
00:22:52,120 --> 00:22:53,240
It's non-negotiable.
620
00:22:53,240 --> 00:22:54,880
Block two, known bad risk.
621
00:22:54,880 --> 00:22:58,000
If you have Entra ID protection, P2, high user risk
622
00:22:58,000 --> 00:23:00,720
and high sign in risk are blocks, not prompts.
623
00:23:00,720 --> 00:23:03,120
If the engine believes the credential is owned by someone else,
624
00:23:03,120 --> 00:23:05,080
you don't negotiate, you cut power.
625
00:23:05,080 --> 00:23:07,200
Everything else, use grant controls, not blocks.
626
00:23:07,200 --> 00:23:09,320
You want the compiler to shape the assurance
627
00:23:09,320 --> 00:23:11,840
to the action not strand users on the wrong side of a line
628
00:23:11,840 --> 00:23:14,160
because they moved from Wi-Fi to LTE.
629
00:23:14,160 --> 00:23:16,200
Evidence that you can pull to prove this is working
630
00:23:16,200 --> 00:23:17,280
is straightforward.
631
00:23:17,280 --> 00:23:20,880
Policy evaluation flow, where legacy protocol requests show
632
00:23:20,880 --> 00:23:23,520
blocked by policy, legacy authentication
633
00:23:23,520 --> 00:23:26,360
with zero not applied for legacy client apps.
634
00:23:26,360 --> 00:23:29,040
If you see not applied, you don't have control.
635
00:23:29,040 --> 00:23:30,000
You have a story.
636
00:23:30,000 --> 00:23:32,680
Authentication methods, registration, showing coverage
637
00:23:32,680 --> 00:23:35,200
of phishing resistant credentials for every principle
638
00:23:35,200 --> 00:23:36,440
in a privileged role.
639
00:23:36,440 --> 00:23:39,320
If a role has members with only passwords and OTPs,
640
00:23:39,320 --> 00:23:42,000
you've labeled risk admin, sign in logs filtered
641
00:23:42,000 --> 00:23:44,200
to privileged roles with authentication requirement,
642
00:23:44,200 --> 00:23:45,480
phishing resistant.
643
00:23:45,480 --> 00:23:47,720
If that field isn't present, you required nothing.
644
00:23:47,720 --> 00:23:48,800
You hoped.
645
00:23:48,800 --> 00:23:50,640
Here's the shortcut nobody teaches.
646
00:23:50,640 --> 00:23:52,920
Reduce your policy count before you raise
647
00:23:52,920 --> 00:23:54,000
your policy bar.
648
00:23:54,000 --> 00:23:56,440
Every policy you don't need is a branch you won't debug
649
00:23:56,440 --> 00:23:58,520
at 2a, inventory exclusions with owners,
650
00:23:58,520 --> 00:24:00,480
delete or time box anything without one.
651
00:24:00,480 --> 00:24:02,920
Move trusted location logic to authentication context
652
00:24:02,920 --> 00:24:05,400
tied to device compliance instead of CIDOs.
653
00:24:05,400 --> 00:24:08,360
Treat service accounts as what they are, humans or workloads.
654
00:24:08,360 --> 00:24:09,440
Humans evaluate CA.
655
00:24:09,440 --> 00:24:11,720
Workloads do not exclude neither by label.
656
00:24:11,720 --> 00:24:13,520
Common mistakes to avoid.
657
00:24:13,520 --> 00:24:16,360
Requiring MFA for admins but not requiring strengths.
658
00:24:16,360 --> 00:24:18,680
You just made prompt spam your last line of defense,
659
00:24:18,680 --> 00:24:20,360
using report only as a parking lot.
660
00:24:20,360 --> 00:24:22,600
If a policy can't go to on within a sprint,
661
00:24:22,600 --> 00:24:25,320
it belongs in backlog refinement, not production.
662
00:24:25,320 --> 00:24:27,760
Carving permanent location-based bypasses.
663
00:24:27,760 --> 00:24:29,920
The compiler can't see the difference between your office
664
00:24:29,920 --> 00:24:31,360
and an IP-sproofed range.
665
00:24:31,360 --> 00:24:32,520
Device posture is real.
666
00:24:32,520 --> 00:24:34,600
IP space is theater, quick win.
667
00:24:34,600 --> 00:24:36,000
Cut to three policies.
668
00:24:36,000 --> 00:24:38,640
Require strengths for anyone who can change authorization
669
00:24:38,640 --> 00:24:41,120
or compute and run a not applied sign-in report
670
00:24:41,120 --> 00:24:42,360
for privileged roles.
671
00:24:42,360 --> 00:24:45,080
If the list is non-empty, you have blind parts.
672
00:24:45,080 --> 00:24:46,720
Reduce them before you add anything else.
673
00:24:46,720 --> 00:24:48,760
The authorization compiler will enforce what remains.
674
00:24:48,760 --> 00:24:50,640
Make sure it's worth enforcing.
675
00:24:50,640 --> 00:24:52,160
Case study context three.
676
00:24:52,160 --> 00:24:54,680
Service principles and workload identities.
677
00:24:54,680 --> 00:24:56,760
This is where the control plane goes quiet.
678
00:24:56,760 --> 00:24:58,920
No prompts, no pop-ups, no human in the loop.
679
00:24:58,920 --> 00:25:00,760
Service principles and managed identities
680
00:25:00,760 --> 00:25:03,200
are production identities that never see MFA
681
00:25:03,200 --> 00:25:06,840
and rarely see owners when they drift, they drift silently.
682
00:25:06,840 --> 00:25:07,800
Why this matters?
683
00:25:07,800 --> 00:25:09,320
The system treats a workload the same way
684
00:25:09,320 --> 00:25:11,160
it treats a person in one critical regard.
685
00:25:11,160 --> 00:25:13,560
It means tokens that can administer your tenant.
686
00:25:13,560 --> 00:25:16,080
But unlike people, workloads don't get challenged.
687
00:25:16,080 --> 00:25:19,320
If the scope is wrong, the compiler says yes at machine speed.
688
00:25:19,320 --> 00:25:20,880
The dead signals are consistent.
689
00:25:20,880 --> 00:25:22,400
Long-lived client secrets.
690
00:25:22,400 --> 00:25:24,640
Broad graph scopes like directory.
691
00:25:24,640 --> 00:25:26,320
Read right all for the pipeline.
692
00:25:26,320 --> 00:25:28,120
Enterprise applications with no owner.
693
00:25:28,120 --> 00:25:30,240
Certificates that expire in 2034.
694
00:25:30,240 --> 00:25:31,640
Sign-in logs that never show up
695
00:25:31,640 --> 00:25:33,200
because nothing interactive happens.
696
00:25:33,200 --> 00:25:35,600
That is not resilience, that is unobserved authority.
697
00:25:35,600 --> 00:25:37,480
Here's the pattern you've already seen.
698
00:25:37,480 --> 00:25:38,880
Applied to automation.
699
00:25:38,880 --> 00:25:41,120
Intent, translation, exception.
700
00:25:41,120 --> 00:25:42,280
Often persistence.
701
00:25:42,280 --> 00:25:43,440
If you remember nothing else
702
00:25:43,440 --> 00:25:46,080
from the workload identity section, remember this.
703
00:25:46,080 --> 00:25:48,600
Every temporary elevation for a pipeline
704
00:25:48,600 --> 00:25:50,400
becomes a permanent attack path
705
00:25:50,400 --> 00:25:52,560
unless someone owns its life cycle.
706
00:25:52,560 --> 00:25:55,720
Intent, let the pipeline create app registrations
707
00:25:55,720 --> 00:25:57,000
and assign roles.
708
00:25:57,000 --> 00:26:00,680
Translation, grant directory, read right.
709
00:26:00,680 --> 00:26:02,920
All to the service principle, it's easier.
710
00:26:02,920 --> 00:26:05,840
Exception, skip rotation until after the release,
711
00:26:05,840 --> 00:26:07,240
extend the secret.
712
00:26:07,240 --> 00:26:10,680
Often, the dev who created it left,
713
00:26:10,680 --> 00:26:13,120
the app still works, nobody owns it.
714
00:26:13,120 --> 00:26:16,000
Persistence, it ships features nobody questions the scope.
715
00:26:16,000 --> 00:26:17,800
Now the incident pattern most teams deny
716
00:26:17,800 --> 00:26:19,360
until the post-mortem.
717
00:26:19,360 --> 00:26:21,880
A CICD variable leaks in a console log,
718
00:26:21,880 --> 00:26:23,640
a wiki page or an artifact.
719
00:26:23,640 --> 00:26:25,240
That variable is a client secret
720
00:26:25,240 --> 00:26:27,640
for a service principle with graph write permission.
721
00:26:27,640 --> 00:26:28,920
There is no owner to call.
722
00:26:28,920 --> 00:26:30,760
There is no rotation policy to enforce.
723
00:26:30,760 --> 00:26:32,440
The attacker doesn't need to guess a password.
724
00:26:32,440 --> 00:26:35,240
They call graph and modify app permissions,
725
00:26:35,240 --> 00:26:37,480
add credentials to an existing enterprise app
726
00:26:37,480 --> 00:26:40,280
or consent a high-risk API on behalf of your tenant.
727
00:26:40,280 --> 00:26:42,240
Nothing prompts, nothing alerts,
728
00:26:42,240 --> 00:26:44,200
unless you instrumented the right logs.
729
00:26:44,200 --> 00:26:45,120
Root cause.
730
00:26:45,120 --> 00:26:46,480
Treating a workload identity
731
00:26:46,480 --> 00:26:48,680
like a convenience instead of a principle.
732
00:26:48,680 --> 00:26:50,440
If a principle can write your directory,
733
00:26:50,440 --> 00:26:51,960
it is a shadow admin.
734
00:26:51,960 --> 00:26:53,200
Before we continue,
735
00:26:53,200 --> 00:26:55,640
you need to draw the boundary in your head.
736
00:26:55,640 --> 00:26:59,240
Service principle, managed identity and federated workload.
737
00:26:59,240 --> 00:27:01,440
The service principle is an app identity you create
738
00:27:01,440 --> 00:27:03,960
and credential with a secret or certificate.
739
00:27:03,960 --> 00:27:06,080
A managed identity is a special service principle
740
00:27:06,080 --> 00:27:08,520
as your creates and rotates for a resource.
741
00:27:08,520 --> 00:27:10,680
A federated credential lets an external system
742
00:27:10,680 --> 00:27:11,920
like GitHub Actions,
743
00:27:11,920 --> 00:27:14,840
exchange its token for yours without storing secrets.
744
00:27:14,840 --> 00:27:16,600
Each solves a different coupling problem.
745
00:27:16,600 --> 00:27:18,600
None solves over permission on its own.
746
00:27:18,600 --> 00:27:20,760
That shows up first where you gave yourself speed.
747
00:27:20,760 --> 00:27:22,200
Secrets over certificates.
748
00:27:22,200 --> 00:27:23,680
Certificates over federation.
749
00:27:23,680 --> 00:27:25,560
Owners set to the developer who created it.
750
00:27:25,560 --> 00:27:28,520
Expires set to never because rotation would break the weekend release.
751
00:27:28,520 --> 00:27:29,600
That's not an accident.
752
00:27:29,600 --> 00:27:32,440
That is design emission disguised as velocity.
753
00:27:32,440 --> 00:27:34,480
Evidence you can pull without a clicking class.
754
00:27:34,480 --> 00:27:36,160
A graph query for enterprise applications
755
00:27:36,160 --> 00:27:38,640
with app role assignments matching directory.
756
00:27:38,640 --> 00:27:40,400
And no owners, that is your high-risk list.
757
00:27:40,400 --> 00:27:43,120
If an app can write directory objects and nobody owns it,
758
00:27:43,120 --> 00:27:44,920
you have an attack path with no steward.
759
00:27:44,920 --> 00:27:46,960
Credential inventory for application registrations
760
00:27:46,960 --> 00:27:49,200
showing key credentials and password credentials
761
00:27:49,200 --> 00:27:51,000
with expiry dates beyond one year.
762
00:27:51,000 --> 00:27:53,920
Long duration correlates with forgotten rotation paths.
763
00:27:53,920 --> 00:27:56,400
Sign-in logs filtered by service principle sign-ins
764
00:27:56,400 --> 00:27:59,240
with unusual consent or app role assignment activity.
765
00:27:59,240 --> 00:28:00,320
Yes, these exist.
766
00:28:00,320 --> 00:28:02,200
If you're not looking, you won't see drift.
767
00:28:02,200 --> 00:28:03,680
Now the common failure modes.
768
00:28:03,680 --> 00:28:06,360
Failure one, one key to rule them all.
769
00:28:06,360 --> 00:28:08,520
A single service principle in a build system
770
00:28:08,520 --> 00:28:10,560
holds subscription contributor,
771
00:28:10,560 --> 00:28:12,920
key vault secrets officer and graph write.
772
00:28:12,920 --> 00:28:14,600
The pipeline needs one of those at a time.
773
00:28:14,600 --> 00:28:16,400
The principle has all of them all the time.
774
00:28:16,400 --> 00:28:18,200
Compromise equals tenant modification
775
00:28:18,200 --> 00:28:20,600
plus secrets, exfiltration plus infrastructure control.
776
00:28:20,600 --> 00:28:21,960
That is not least privileged.
777
00:28:21,960 --> 00:28:23,920
That is consolidation of blast radius.
778
00:28:23,920 --> 00:28:26,240
Failure two forever secret.
779
00:28:26,240 --> 00:28:28,080
A client secret created during an outage
780
00:28:28,080 --> 00:28:30,040
to get prod back never rotates.
781
00:28:30,040 --> 00:28:32,080
Ten months later, someone screenshots
782
00:28:32,080 --> 00:28:33,720
an environment variables page.
783
00:28:33,720 --> 00:28:35,360
The screenshot lands in a ticket.
784
00:28:35,360 --> 00:28:36,640
The secret remains valid.
785
00:28:36,640 --> 00:28:38,120
The attacker doesn't need to fish.
786
00:28:38,120 --> 00:28:40,240
They authenticate as you.
787
00:28:40,240 --> 00:28:42,720
Failure three, no owner, no review.
788
00:28:42,720 --> 00:28:45,240
An external SAS integration created via admin consent
789
00:28:45,240 --> 00:28:46,280
has owner none.
790
00:28:46,280 --> 00:28:47,600
It keeps working for years.
791
00:28:47,600 --> 00:28:48,800
The vendor changes scopes.
792
00:28:48,800 --> 00:28:50,080
Nobody gets notified.
793
00:28:50,080 --> 00:28:52,800
Your tenant silently accepts newly requested permissions
794
00:28:52,800 --> 00:28:54,840
because the app already existed.
795
00:28:54,840 --> 00:28:57,320
Governance failed at the first step, ownership.
796
00:28:57,320 --> 00:28:58,600
The uncomfortable truth.
797
00:28:58,600 --> 00:29:00,720
Conditional access won't save you here.
798
00:29:00,720 --> 00:29:02,360
Workloads do not evaluate CA.
799
00:29:02,360 --> 00:29:04,000
You cannot fix scope at sign-in.
800
00:29:04,000 --> 00:29:05,960
You can only fix scope at definition.
801
00:29:05,960 --> 00:29:07,520
What should you recognize today?
802
00:29:07,520 --> 00:29:10,440
Enterprise apps with broad graph permissions and no owners.
803
00:29:10,440 --> 00:29:12,480
Application credentials with long aspirations
804
00:29:12,480 --> 00:29:14,640
or end date time missing.
805
00:29:14,640 --> 00:29:16,440
Build systems using service principles
806
00:29:16,440 --> 00:29:19,040
with tenant-level scopes when a managed identity
807
00:29:19,040 --> 00:29:21,120
scoped to a resource would suffice.
808
00:29:21,120 --> 00:29:23,320
Human accounts labeled service excluded from CA
809
00:29:23,320 --> 00:29:25,360
because a pipeline needed a token.
810
00:29:25,360 --> 00:29:27,440
Humans evaluate CA workloads don't.
811
00:29:27,440 --> 00:29:30,240
This is a category error turned into an exception.
812
00:29:30,240 --> 00:29:32,360
Once you see those, the next move becomes obvious.
813
00:29:32,360 --> 00:29:34,320
Prefer managed identities in Azure
814
00:29:34,320 --> 00:29:36,760
to eliminate secret handling where possible.
815
00:29:36,760 --> 00:29:39,000
Use certificates over client secrets
816
00:29:39,000 --> 00:29:41,000
when you must create app registrations,
817
00:29:41,000 --> 00:29:45,360
federate external CIR-CD to avoid storing credentials
818
00:29:45,360 --> 00:29:49,240
and most importantly, cut scopes to the minimum operation needed.
819
00:29:49,240 --> 00:29:51,280
Treat workload identities as production identities
820
00:29:51,280 --> 00:29:53,320
with life cycle, ownership and rotation
821
00:29:53,320 --> 00:29:55,160
because the compiler will keep saying yes
822
00:29:55,160 --> 00:29:57,840
until you change what it's allowed to say yes to.
823
00:29:57,840 --> 00:30:01,280
Workload identities from shadow admin to governed principle.
824
00:30:01,280 --> 00:30:03,840
The foundational mistake is thinking of a service principle
825
00:30:03,840 --> 00:30:04,680
as a convenience.
826
00:30:04,680 --> 00:30:06,160
It isn't. It is a principle.
827
00:30:06,160 --> 00:30:09,040
If it can write directory objects, assign app roles
828
00:30:09,040 --> 00:30:12,120
or mint tokens that manipulate subscriptions, it is a shadow admin.
829
00:30:12,120 --> 00:30:14,840
The system doesn't care that it runs at 2 a.m. and never prompts.
830
00:30:14,840 --> 00:30:17,360
Authority without observation is still authority.
831
00:30:17,360 --> 00:30:18,360
Why this matters?
832
00:30:18,360 --> 00:30:20,040
Workload identities outnumber humans
833
00:30:20,040 --> 00:30:22,600
and the compiler never asks them for MFA.
834
00:30:22,600 --> 00:30:25,280
The consequences of doing this wrong are predictable.
835
00:30:25,280 --> 00:30:28,400
Silent privilege, durable access and escalation parts
836
00:30:28,400 --> 00:30:29,920
with no human in the loop.
837
00:30:29,920 --> 00:30:32,360
The benefit of getting it right is equally predictable.
838
00:30:32,360 --> 00:30:35,960
Scoped authority, visible ownership and bounded blast radius.
839
00:30:35,960 --> 00:30:36,960
That distinction matters
840
00:30:36,960 --> 00:30:39,200
because conditional access can't save you here.
841
00:30:39,200 --> 00:30:41,600
Your only control is definition and life cycle.
842
00:30:41,600 --> 00:30:44,920
What to do instead is not complex, but it is non-negotiable.
843
00:30:44,920 --> 00:30:47,840
First, prefer managed identities in Azure wherever possible.
844
00:30:47,840 --> 00:30:50,240
A managed identity is still a service principle,
845
00:30:50,240 --> 00:30:52,840
but the platform owns the credential and rotates it.
846
00:30:52,840 --> 00:30:56,120
You remove the class of failure called forever secret.
847
00:30:56,120 --> 00:30:57,640
More importantly, you reduce coupling.
848
00:30:57,640 --> 00:30:59,800
The identity exists in the boundary of the resource
849
00:30:59,800 --> 00:31:01,840
so it scope tends to match reality.
850
00:31:01,840 --> 00:31:04,480
A function gets function level permission to a storage account,
851
00:31:04,480 --> 00:31:06,960
not tenant level graph write for convenience.
852
00:31:06,960 --> 00:31:09,720
Second, when you must create app registrations,
853
00:31:09,720 --> 00:31:12,160
choose certificates over client secrets.
854
00:31:12,160 --> 00:31:16,080
A certificate with a sane expiry and storage in Key Vault is not perfect,
855
00:31:16,080 --> 00:31:18,440
but it collapses the easiest leak path,
856
00:31:18,440 --> 00:31:22,320
screenshots of environment variables and plain text config files.
857
00:31:22,320 --> 00:31:24,360
Pair that with short validity windows
858
00:31:24,360 --> 00:31:26,760
and a rotation schedule you actually practice.
859
00:31:26,760 --> 00:31:30,120
If you cannot rotate on demand, you do not control the principle.
860
00:31:30,120 --> 00:31:32,920
You are borrowing time from your future incident.
861
00:31:32,920 --> 00:31:34,720
Third, write size scopes.
862
00:31:34,720 --> 00:31:36,640
The reason this clicks is straightforward.
863
00:31:36,640 --> 00:31:39,080
Workload identities never get challenged at runtime.
864
00:31:39,080 --> 00:31:43,160
If you grant directory, read write all the compiler will say yes every time.
865
00:31:43,160 --> 00:31:46,240
Move to the minimum graph permission that encodes the operation.
866
00:31:46,240 --> 00:31:50,120
Use app roles on your APIs instead of broad graph grants where possible.
867
00:31:50,120 --> 00:31:53,800
At the Azure control plane, stop handing contributor at subscription
868
00:31:53,800 --> 00:31:57,320
when a resource group role or a single resource data action would suffice.
869
00:31:57,320 --> 00:31:59,000
Scope is your only guardrail.
870
00:31:59,000 --> 00:32:01,560
Fourth, assign owners and enforce life cycle.
871
00:32:01,560 --> 00:32:03,720
Owner, none is govern instead.
872
00:32:03,720 --> 00:32:08,040
Every enterprise app and app registration must have at least one accountable owner
873
00:32:08,040 --> 00:32:12,240
who is not a departed developer or a group with unknown membership.
874
00:32:12,240 --> 00:32:17,200
Owners approve permission changes, own rotation and get paged when the principle trips and alert.
875
00:32:17,200 --> 00:32:20,720
Without an owner, you will always choose product velocity over control,
876
00:32:20,720 --> 00:32:23,560
not because you're reckless, but because nobody is responsible.
877
00:32:23,560 --> 00:32:27,960
Let me show you exactly how to make this practical without turning this into a clicking class.
878
00:32:27,960 --> 00:32:31,040
Inventory the threat surface with three queries in one report,
879
00:32:31,040 --> 00:32:34,920
graph enterprise apps with app role assignments matching directory,
880
00:32:34,920 --> 00:32:36,680
and owners count equal zero.
881
00:32:36,680 --> 00:32:38,880
That is your shadow admin without a steward list.
882
00:32:38,880 --> 00:32:43,360
Work that queue first, graph application registrations where password credentials and daytime
883
00:32:43,360 --> 00:32:45,480
is null or greater than three 65 days.
884
00:32:45,480 --> 00:32:47,280
Those are your forever secrets.
885
00:32:47,280 --> 00:32:51,440
Set rotation deadlines and replace secrets with certificates or federated credentials.
886
00:32:51,440 --> 00:32:55,320
Graph service principles granted roles at subscription or management group scope.
887
00:32:55,320 --> 00:32:56,680
Map each to a workload.
888
00:32:56,680 --> 00:32:59,440
If the assignment doesn't line up with a resource that needs it,
889
00:32:59,440 --> 00:33:01,720
you found consolidated blast radius.
890
00:33:01,720 --> 00:33:06,720
Sign-in logs, service principle sign-ins with consent or app role assignment activity.
891
00:33:06,720 --> 00:33:10,520
Nothing interactive should be consenting to anything if you see it that's drift.
892
00:33:10,520 --> 00:33:13,640
Then constraint creation, this is the game changer nobody talks about.
893
00:33:13,640 --> 00:33:15,320
Most drift starts at birth.
894
00:33:15,320 --> 00:33:18,400
Guard rails at creation are cheaper than cleanups later.
895
00:33:18,400 --> 00:33:24,000
Disallow user consent for apps, require admin consent workflow with ownership as a prerequisite,
896
00:33:24,000 --> 00:33:28,440
require a tag or application ID in the display name that maps to a system of record.
897
00:33:28,440 --> 00:33:31,360
If you can't trace a principle to a service, you won't decommission it.
898
00:33:31,360 --> 00:33:35,400
Enforced conditional access for admin consent portals with fishing resistant strengths
899
00:33:35,400 --> 00:33:36,920
for the humans who approve.
900
00:33:36,920 --> 00:33:40,040
The workload doesn't evaluate CA, but your approver does.
901
00:33:40,040 --> 00:33:41,600
Now the migration choices.
902
00:33:41,600 --> 00:33:46,120
If a pipeline runs in Azure, switch to a user assigned managed identity and scope it to the
903
00:33:46,120 --> 00:33:47,120
resource it touches.
904
00:33:47,120 --> 00:33:50,600
If it runs outside Azure, federate its identity instead of storing secrets.
905
00:33:50,600 --> 00:33:54,160
GitHub actions, for example, can exchange its token for yours on every run.
906
00:33:54,160 --> 00:33:58,000
Reserve app registrations with certificates for systems that neither run in Azure nor
907
00:33:58,000 --> 00:33:59,480
support federation.
908
00:33:59,480 --> 00:34:04,560
This sequence eliminates entire classes of credential handling, common mistakes to avoid.
909
00:34:04,560 --> 00:34:07,240
Consolidating roles for convenience on one principle.
910
00:34:07,240 --> 00:34:11,160
That is an entropy generator with root on three planes, split duties, one identity
911
00:34:11,160 --> 00:34:12,160
per function.
912
00:34:12,160 --> 00:34:15,000
Relying on service human accounts to acquire tokens.
913
00:34:15,000 --> 00:34:17,160
Humans evaluate CA, workloads don't.
914
00:34:17,160 --> 00:34:22,040
Your exclusion to make the pipeline work just created a persistent blind path for people.
915
00:34:22,040 --> 00:34:26,120
Treating key voters governance, storing a secret safely is not the same as scoping the
916
00:34:26,120 --> 00:34:27,760
principle correctly.
917
00:34:27,760 --> 00:34:30,360
Resort over permission is still over permission.
918
00:34:30,360 --> 00:34:32,120
Evidence of improvement looks like this.
919
00:34:32,120 --> 00:34:36,120
The high-risk graph list shrinks to zero or to a small justified set with owners.
920
00:34:36,120 --> 00:34:40,560
Credential lifetimes collapse to 90 days or certificates with automated rotation.
921
00:34:40,560 --> 00:34:45,280
Service principle sign-in logs, stabilize to predictable patterns, tie to change windows,
922
00:34:45,280 --> 00:34:47,000
not ad hoc admin activity.
923
00:34:47,000 --> 00:34:50,720
Roll assignments move down from subscription to resource group or resource level and
924
00:34:50,720 --> 00:34:54,400
from built-in contributor to narrowly defined data actions.
925
00:34:54,400 --> 00:34:56,320
Quick win, you can achieve today.
926
00:34:56,320 --> 00:34:59,120
Make your top 10 enterprise apps with directory.
927
00:34:59,120 --> 00:35:03,840
And no owner, assign owners remove unnecessary scopes and replace secrets with certificates.
928
00:35:03,840 --> 00:35:08,720
Then switch one high value pipeline to a user assigned managed identity with resource level
929
00:35:08,720 --> 00:35:09,720
scope.
930
00:35:09,720 --> 00:35:13,200
You will have removed a shadow admin, cut a blast radius in half and proven to your developers
931
00:35:13,200 --> 00:35:15,160
that governance can be faster than drift.
932
00:35:15,160 --> 00:35:17,160
Work load identity is production identity.
933
00:35:17,160 --> 00:35:19,760
Govern it like it can change your tenant because it already can.
934
00:35:19,760 --> 00:35:21,200
Case study context 4.
935
00:35:21,200 --> 00:35:23,920
B2B guest access undermining governance.
936
00:35:23,920 --> 00:35:26,720
Personal users are where your assumptions fail fastest.
937
00:35:26,720 --> 00:35:31,000
Guests don't inherit your norms, your device posture or your escalation culture.
938
00:35:31,000 --> 00:35:34,840
Architecturally, they are identities from another tenant that your control plane chooses
939
00:35:34,840 --> 00:35:36,080
to trust.
940
00:35:36,080 --> 00:35:40,400
That distinction matters because once you invite them, enter, compile their assertions into
941
00:35:40,400 --> 00:35:44,560
your authorization graph exactly like a member unless you encode the boundary.
942
00:35:44,560 --> 00:35:46,360
The pattern is predictable.
943
00:35:46,360 --> 00:35:48,440
Evender is added temporarily for a migration.
944
00:35:48,440 --> 00:35:52,880
They can't pass your prompts so someone excludes the guest group from MFA just for a
945
00:35:52,880 --> 00:35:53,880
week.
946
00:35:53,880 --> 00:35:59,040
The guest is also placed in a nested group tied to a privileged app role to speed up testing.
947
00:35:59,040 --> 00:36:01,080
Months pass, the project ends.
948
00:36:01,080 --> 00:36:02,760
Nobody runs an access review.
949
00:36:02,760 --> 00:36:07,160
The vendor consultant changes jobs, their guest object persists with the same assignments.
950
00:36:07,160 --> 00:36:11,640
Your tenant now hosts a privileged identity controlled by another company's life cycle.
951
00:36:11,640 --> 00:36:13,440
Dead signals show up in three places.
952
00:36:13,440 --> 00:36:15,080
First, hard exclusions.
953
00:36:15,080 --> 00:36:19,760
If you see conditional access policies that explicitly exclude guests and external users
954
00:36:19,760 --> 00:36:21,840
you've dissolved your perimeter.
955
00:36:21,840 --> 00:36:25,240
Guests become the path of least resistance into sensitive apps because they never meet
956
00:36:25,240 --> 00:36:26,960
the compiler's requirements.
957
00:36:26,960 --> 00:36:29,320
Second, missing reviews.
958
00:36:29,320 --> 00:36:33,760
Access review configurations that target guests but list no reviewers assigned or never
959
00:36:33,760 --> 00:36:39,320
complete are governance in name only without a human accountability loop time always wins.
960
00:36:39,320 --> 00:36:41,720
Third, nested groups.
961
00:36:41,720 --> 00:36:43,920
Guests rarely get direct role assignments.
962
00:36:43,920 --> 00:36:48,600
They arrive via a group mapped into an app role or an Azure R-Back assignment.
963
00:36:48,600 --> 00:36:51,200
Nesting hides privileged escalation under collaboration.
964
00:36:51,200 --> 00:36:53,200
Now the near miss that turns into a headline.
965
00:36:53,200 --> 00:36:57,200
A partner system integrator is added as a guest admin during a rollout.
966
00:36:57,200 --> 00:37:01,280
To keep velocity the project team excludes the guest group from phishing resistant requirements
967
00:37:01,280 --> 00:37:04,200
and carves a trusted location for their office IPs.
968
00:37:04,200 --> 00:37:05,760
The partner later merges.
969
00:37:05,760 --> 00:37:08,920
The engineers home tenant changes IDP behaviors.
970
00:37:08,920 --> 00:37:10,920
Their device compliance post year drifts.
971
00:37:10,920 --> 00:37:15,160
Meanwhile the exclusion persists and attack compromises the partner account through a commodity
972
00:37:15,160 --> 00:37:16,160
fish.
973
00:37:16,160 --> 00:37:19,960
Your logs show a legitimate guest accessing an enterprise app with admin privileges from
974
00:37:19,960 --> 00:37:21,000
an allowed IP.
975
00:37:21,000 --> 00:37:23,560
There is no MFA challenge because you excluded it.
976
00:37:23,560 --> 00:37:26,560
There is no device check because you trusted a CIDR.
977
00:37:26,560 --> 00:37:28,360
There is no review because the project closed.
978
00:37:28,360 --> 00:37:29,360
That is not a bypass.
979
00:37:29,360 --> 00:37:30,760
That is your policy.
980
00:37:30,760 --> 00:37:34,440
Root cause treating external collaboration as a people problem instead of a control plane
981
00:37:34,440 --> 00:37:35,440
problem.
982
00:37:35,440 --> 00:37:39,920
You invited identities you don't govern then applied weaker policies to avoid friction.
983
00:37:39,920 --> 00:37:43,400
You delegated privilege by group nesting a mechanism that composes invisibly.
984
00:37:43,400 --> 00:37:44,840
You never enforce life cycle.
985
00:37:44,840 --> 00:37:48,480
The execution engine enforced what remained before we continue you need to understand
986
00:37:48,480 --> 00:37:53,600
cross tenant trust inbound trust controls which signals you accept from an external tenant
987
00:37:53,600 --> 00:37:58,400
has the user done MFA there are they on a compliant device there are they hybrid joined
988
00:37:58,400 --> 00:38:02,720
if you don't configure inbound trust your compiler cannot reuse those assurances it will
989
00:38:02,720 --> 00:38:07,440
either prompt again or if you excluded guests prompt never outbound trust defines what
990
00:38:07,440 --> 00:38:12,640
your users carry into others both require intent neither exists by default in a way that matches
991
00:38:12,640 --> 00:38:17,040
your risk evidence you can pull without a clicking class sign in logs filtered to use
992
00:38:17,040 --> 00:38:22,920
a type guest with conditional access not applied due to user excluded or application excluded
993
00:38:22,920 --> 00:38:27,520
if this intersects with high value apps you've encoded exception as design access review
994
00:38:27,520 --> 00:38:32,160
summaries showing privilege groups with guests and completion rates below 100% or reviewers
995
00:38:32,160 --> 00:38:37,400
said to auto apply disabled that's persistence by paperwork enterprise app role assignments
996
00:38:37,400 --> 00:38:42,240
where principles are groups containing guests expand the groups if guests resolve to privileged
997
00:38:42,240 --> 00:38:46,880
paths you've hidden escalation in membership cross tenant access settings inbound trust
998
00:38:46,880 --> 00:38:51,760
not configured to accept strong signals or configured broadly without tenant allow lists
999
00:38:51,760 --> 00:38:57,920
everyone can bring their MFA is not a policy it's a wish common mistakes to avoid blanket guest
1000
00:38:57,920 --> 00:39:02,640
exclusions from MFA to avoid friction friction move to incident response using group nesting to
1001
00:39:02,640 --> 00:39:07,520
convey app admin instead of granting time bound access via entitlement management with expiration
1002
00:39:07,520 --> 00:39:12,480
nesting is durable packages can expire confusing redemption with governance a guest clicking
1003
00:39:12,480 --> 00:39:17,440
and invite proves email control once it does not prove ongoing legitimacy or need assuming
1004
00:39:17,440 --> 00:39:22,720
they're in our teams equals they are safe teams is an app authorizations bands far beyond chat
1005
00:39:22,720 --> 00:39:27,840
the uncomfortable truth guests bypass your internal assumptions unless you force convergence
1006
00:39:27,840 --> 00:39:32,800
you must either accept external strong signals explicitly via cross tenant trust or require
1007
00:39:32,800 --> 00:39:37,600
your own strengths anything in between is ambiguity the compiler will resolve in favor of whatever
1008
00:39:37,600 --> 00:39:41,920
branch excludes the object what should you recognize today policies excluding guests and
1009
00:39:41,920 --> 00:39:47,840
external users or trusted locations that exist solely for vendor IPs guest objects with last sign
1010
00:39:47,840 --> 00:39:52,240
in older than your review cadence still holding app roles or group memberships no entitlement
1011
00:39:52,240 --> 00:39:58,080
management catalogs for external access all guest provisioning done at hawk no quarterly access
1012
00:39:58,080 --> 00:40:02,880
reviews scope to privileged groups that include guests or reviews that complete with don't know
1013
00:40:02,880 --> 00:40:08,640
decisions auto applied to approve the fix pattern is simple not optional constraint in bound trust
1014
00:40:08,640 --> 00:40:13,280
require phishing resistant strengths for guests accessing high value apps or accept external
1015
00:40:13,280 --> 00:40:18,240
strengths only from allow listed tenants replace ad hoc nesting with entitlement packages that
1016
00:40:18,240 --> 00:40:23,760
expire by default attach access reviews and deny role elevation by group membership and turn on
1017
00:40:23,760 --> 00:40:28,480
reviews with accountable reviewers not self review for vendors external identities are not special
1018
00:40:28,480 --> 00:40:33,680
users they are another control plane input treat them as such or they will become your most durable
1019
00:40:33,680 --> 00:40:39,840
exceptions external identities constraint trust enforce life cycle guests don't break your tenant your
1020
00:40:39,840 --> 00:40:44,800
tenant breaks itself by trusting guests without constraints architecturally a guest is just an external
1021
00:40:44,800 --> 00:40:49,920
principle whose assertions you decide to accept that means two questions matter more than everything
1022
00:40:49,920 --> 00:40:54,400
else what signals will you trust from their home tenant and how long will that trust persist without
1023
00:40:54,400 --> 00:41:00,240
human review if you're a security leader this is your job decide what you will trust from whom
1024
00:41:00,240 --> 00:41:05,120
and for how long explicitly not by accident why this matters external identities bypass your
1025
00:41:05,120 --> 00:41:10,560
internal assumptions by default they don't share your device posture your escalation paths or your
1026
00:41:10,560 --> 00:41:15,280
training if you don't encode boundaries the authorization compiler will treat them like members
1027
00:41:15,280 --> 00:41:20,720
on every path you forgot to protect that distinction matters so draw the boundary in the only place
1028
00:41:20,720 --> 00:41:27,680
that works the control plane first principle require strengths or explicitly accept external strengths
1029
00:41:27,680 --> 00:41:32,720
if a guest touches anything high value identity admin finance apps policy surfaces your options
1030
00:41:32,720 --> 00:41:37,440
are binary either require fishing resistant authentication in your tenant or configure inbound
1031
00:41:37,440 --> 00:41:42,080
cross tenant trust to accept fishing resistant signals from allow listed tenants only guests to
1032
00:41:42,080 --> 00:41:47,440
MFA somewhere is not a control with ambiguity second principle deny elevation by nesting group
1033
00:41:47,440 --> 00:41:53,280
nesting is durable opaque and composes privilege silently if a guest needs elevated access package it
1034
00:41:53,280 --> 00:41:57,280
use entitlement management with an access package that includes the app role or group
1035
00:41:57,280 --> 00:42:02,480
an expiry and an access review time boxes are blast radius windows nesting is persistence disguised
1036
00:42:02,480 --> 00:42:08,320
as convenience third principle enforce life cycle governance is not an invite email it's an ownership
1037
00:42:08,320 --> 00:42:13,120
loop assign a business owner for every external access package require justification and an
1038
00:42:13,120 --> 00:42:18,160
expiry at issuance attach a quarterly access review with accountable reviewers and auto apply
1039
00:42:18,160 --> 00:42:23,280
results don't know should never become a proof if a review account voucher access ends these are not
1040
00:42:23,280 --> 00:42:28,320
bureaucratic steps there entropy breaks before we continue you need to calibrate trust inbound
1041
00:42:28,320 --> 00:42:33,760
cross tenant settings that you accept three external assurances has the user completed MFA is the
1042
00:42:33,760 --> 00:42:38,320
device compliant is it hybrid joint none of these are universal if you accept them broadly your
1043
00:42:38,320 --> 00:42:43,040
outsourcing your perimeter to unknown policies accept them from named tenants with which you have
1044
00:42:43,040 --> 00:42:48,080
contractual assurance or don't accept them at all then require your own strengths evidence you
1045
00:42:48,080 --> 00:42:53,680
can surface quickly without turning this into a clicking class sign in logs for user type equals
1046
00:42:53,680 --> 00:42:59,440
guest where conditional access equals not applied due to exclusion access review statistics for
1047
00:42:59,440 --> 00:43:04,880
privilege groups that include guests with completion rates below 100% enterprise app role assignments
1048
00:43:04,880 --> 00:43:10,320
where the principle is a group containing guests inbound trust configured to trust all external MFA
1049
00:43:10,320 --> 00:43:15,120
each of those is a path of least resistance each is a policy choice now make the compiler do the
1050
00:43:15,120 --> 00:43:20,320
hard work define an authentication context called external privilege bind it to a conditional access
1051
00:43:20,320 --> 00:43:25,280
policy that requires fishing resistant strengths require that context for admin portals finance
1052
00:43:25,280 --> 00:43:30,400
systems and any app that modifies authorization link per activation for directory roles to the same
1053
00:43:30,400 --> 00:43:35,520
context if a guest ever elevates they meet the same bar as members create entitlement catalogs
1054
00:43:35,520 --> 00:43:41,520
per vendor or program package the minimum roles with a default 30 day expiry require sponsor approval
1055
00:43:41,520 --> 00:43:47,520
and business justification attach an access review that triggers at 25 days auto apply removal if the
1056
00:43:47,520 --> 00:43:52,880
review doesn't complete you are encoding decay into the privilege life cycle deny role elevation by
1057
00:43:52,880 --> 00:43:57,840
group membership in your process if a team asks to nest a guest containing group into an app role
1058
00:43:57,840 --> 00:44:03,040
the answer is no offer an expiring package instead nesting produces invisible escalation packages
1059
00:44:03,040 --> 00:44:08,240
produce predictable expiry constraint in bound trust maintain an allow list of partner tenants you
1060
00:44:08,240 --> 00:44:12,720
will accept strong signals from for everyone else require your own strength if a vendor says their
1061
00:44:12,720 --> 00:44:18,320
devices are compliant trust but verify by not trusting externally unless you've onboarded that tenant
1062
00:44:18,320 --> 00:44:23,520
explicitly common mistakes to avoid creating guest exclusion conditional access groups you've
1063
00:44:23,520 --> 00:44:27,680
taught the compiler to bypass policy for the identities least likely to meet your assumptions
1064
00:44:27,680 --> 00:44:33,440
assigning guests to tenant wide roles temporarily tenant wide is never temporary any privileged guest
1065
00:44:33,440 --> 00:44:38,880
path must be time bound and tied to an access review treating teams membership as governance teams
1066
00:44:38,880 --> 00:44:44,720
is collaboration authorization spans exchange sharepoint apps and azure if a guest exists only
1067
00:44:44,720 --> 00:44:49,520
because they're in a team they should not inherit anything outside that teams scope setting reviews
1068
00:44:49,520 --> 00:44:54,400
to self review for vendors self approval is not oversight make the sponsor accountable proof you can
1069
00:44:54,400 --> 00:44:59,840
show yourself in a week guests sign in to high value apps now show authentication requirement
1070
00:44:59,840 --> 00:45:07,520
phishing resistant or external MFA accepted trusted tenant no not applied access reviews for
1071
00:45:07,520 --> 00:45:12,880
privileged groups that include guests complete at 100% with auto apply enabled stale guests are
1072
00:45:12,880 --> 00:45:18,080
removed automatically entitlement packages exist for the top three vendors each with default expiry
1073
00:45:18,080 --> 00:45:23,600
and a named sponsor cross tenant in bound trust is set to none by default with a short allow list
1074
00:45:23,600 --> 00:45:28,880
populated intentionally the uncomfortable truth remains external identities are not special users
1075
00:45:28,880 --> 00:45:33,520
they are inputs to your authorization compiler constraint what you trust enforce when it ends
1076
00:45:33,520 --> 00:45:38,000
without that the most durable exceptions in your tenant will belong to people you don't employ
1077
00:45:38,000 --> 00:45:44,000
define the model identity debt and measurement signals identity debt is not a vibe it's an
1078
00:45:44,000 --> 00:45:48,960
operational state standing privilege plus ungoverned exceptions plus unowned identities when those
1079
00:45:48,960 --> 00:45:54,320
three coexist the authorization compiler in its decisions that diverge from intent and entropy
1080
00:45:54,320 --> 00:45:58,480
gross you don't need a philosophy to see it just a model in the right signals start with the model
1081
00:45:58,800 --> 00:46:03,920
standing privilege is any permission that exists outside the window of work tenant wide rolls
1082
00:46:03,920 --> 00:46:08,720
assigned permanently service principles with broad scopes that never expire group memberships
1083
00:46:08,720 --> 00:46:13,440
that convey ab admin until further notice ungoverned exceptions are branches in the execution
1084
00:46:13,440 --> 00:46:19,600
path with no owner and no end conditional access exclusions trusted locations report only policies
1085
00:46:19,600 --> 00:46:24,240
that make you feel good but do nothing legacy protocol carve outs that were temporary
1086
00:46:24,240 --> 00:46:30,080
unowned identities are principles human or workload without accountable stewards owner none on enterprise
1087
00:46:30,080 --> 00:46:34,720
apps service principles tied to departed developers guests without sponsors combine any two you get
1088
00:46:34,720 --> 00:46:39,600
risk combine all three you get debt now measure it if you can't inventory it you don't control it if
1089
00:46:39,600 --> 00:46:44,160
you can't measure it you can't pay it down so define a minimal signal set that maps directly
1090
00:46:44,160 --> 00:46:49,200
to the model and is cheap to collect if you're a security leader this is the part you should be
1091
00:46:49,200 --> 00:46:53,840
asking for in every review show me the signals that prove our intent still matches what the compiler
1092
00:46:53,840 --> 00:46:59,920
actually enforces signal one exclusions inventory conditional access policies for user group and
1093
00:46:59,920 --> 00:47:05,440
application exclusions the question is simple which paths bypass the compiler count them tag owner
1094
00:47:05,440 --> 00:47:10,560
stamp experience any exclusion without an owner and a clock is an orphan branch signal to legacy
1095
00:47:10,560 --> 00:47:15,600
authentication plot legacy protocol activity over time you're not proving an attack you're proving
1096
00:47:15,600 --> 00:47:20,560
unobservable access a flatline at zero means your block legacy policy is complete anything
1097
00:47:20,560 --> 00:47:26,640
above zero is either drift or an exception both are debt signal three non-expiring secrets and
1098
00:47:26,640 --> 00:47:31,520
long live credentials pull application registrations and enterprise apps with password credentials or key
1099
00:47:31,520 --> 00:47:37,360
credentials that are null or beyond 365 days filter for high risk scopes directory and flag those
1100
00:47:37,360 --> 00:47:43,680
with no owners that is shadow admin without lifecycle signal four broad scopes enumerate service
1101
00:47:43,680 --> 00:47:48,720
principles with graph permissions beyond what their workload needs and azure role assignments at
1102
00:47:48,720 --> 00:47:54,080
subscription or management groups scope the metric isn't only how many that it's how many with scopes
1103
00:47:54,080 --> 00:48:00,240
that don't map to a resource you can name signal five guest privilege list guest users in privilege
1104
00:48:00,240 --> 00:48:05,040
groups or app roles especially those introduced by anested groups cross reference with access
1105
00:48:05,040 --> 00:48:09,440
review completion if guests hold durable privilege and reviews don't complete with auto-apply you've
1106
00:48:09,440 --> 00:48:15,200
encoded persistence signal six synchronized admins join directory role assignments against on-prem
1107
00:48:15,200 --> 00:48:21,120
sync enabled any tenant wide role bound to a synced identity is coupling across planes that's not a
1108
00:48:21,120 --> 00:48:26,240
red dot that's a design decision to unwind translate those signals into a measurement set you can run
1109
00:48:26,240 --> 00:48:30,880
every week without a ceremony exception inventory count of CA exclusions with owner and expire
1110
00:48:30,880 --> 00:48:36,080
coverage secure score identity deltas not as a single number but as change over time for identity
1111
00:48:36,080 --> 00:48:42,720
controls you care about legacy off disabled MFA coverage privileged identity protections policy
1112
00:48:42,720 --> 00:48:48,720
count versus coverage number of CA policies and percentage of sign-ins evaluating at least one
1113
00:48:48,720 --> 00:48:53,840
baseline policy access review completion rates for privilege groups and guest catalogs these are
1114
00:48:53,840 --> 00:48:58,640
not vanity metrics they tell you where governance exists in practice minimal telemetry required to
1115
00:48:58,640 --> 00:49:03,760
support this three places sign-in logs filtered to conditional access not applied with reasons user
1116
00:49:03,760 --> 00:49:09,280
excluded or application excluded and client app legacy authentication enterprise app owner coverage
1117
00:49:09,280 --> 00:49:14,320
from graph giving you a consistent owner count per high risk principle access review outcomes with
1118
00:49:14,320 --> 00:49:19,600
completion status and auto-apply flags that's it you can add more later the goal is directional truth
1119
00:49:19,600 --> 00:49:25,200
with low overhead you'll notice what's missing screenshots of portals checklists of toggles
1120
00:49:25,200 --> 00:49:30,080
and weekly hand counting those are how you drift the compiler does not care how you feel about
1121
00:49:30,080 --> 00:49:34,720
complexity it cares what you told it yesterday your measurement must reflect that machine readable
1122
00:49:34,720 --> 00:49:39,360
inputs and machine observable outcomes now anchor this to the identity data accumulation loop so your
1123
00:49:39,360 --> 00:49:44,080
team speaks the same language intent leads to translation translations born exceptions exceptions
1124
00:49:44,080 --> 00:49:50,000
often when owners leave or from persist and mutate the authorization graph your signals map to each
1125
00:49:50,000 --> 00:49:56,000
step secure score and policy coverage show intent drifting at translation CA exclusions and not
1126
00:49:56,000 --> 00:50:02,160
applied sign-ins expose exceptions owner none and long live credentials identify orphans guest
1127
00:50:02,160 --> 00:50:07,200
reviews and rotation metrics reveal persistence you're not auditing feelings you're tracing state
1128
00:50:07,200 --> 00:50:12,640
propagation two portions first don't normalize debt into averages a single service principle with
1129
00:50:12,640 --> 00:50:20,000
directory read right all and no owner is not balanced by 10 low risk apps with owners this is blast
1130
00:50:20,000 --> 00:50:25,680
radius math not sentiment analysis second resist score chasing if a metric can go up while risk
1131
00:50:25,680 --> 00:50:31,040
stays flat drop it prefer signals that correspond to real blocking behavior or real life cycle action
1132
00:50:31,040 --> 00:50:36,240
the payoff is simple with six signals and three reports you can say something useful at any scale
1133
00:50:36,240 --> 00:50:41,200
where the compiler is bypassed where privilege is permanent where nobody is accountable that's
1134
00:50:41,200 --> 00:50:45,760
the definition of identity debt operationalized and once it's visible repayment stops being theater
1135
00:50:45,760 --> 00:50:50,880
it becomes work ship this week minimal enforceable baseline this is the part everyone postpones
1136
00:50:50,880 --> 00:50:55,280
don't you can ship a minimal enforceable baseline this week that reduces blast radius before it
1137
00:50:55,280 --> 00:51:00,000
reduces flexibility it won't fix history it will stop adding interest start with three baseline
1138
00:51:00,000 --> 00:51:05,040
policies the authorization compiler can execute without ambiguity policy one block legacy
1139
00:51:05,040 --> 00:51:10,640
authentication target all users all cloud apps client apps legacy protocols only no exclusions
1140
00:51:10,640 --> 00:51:15,360
this removes the unobservable path your logs go from we think to we blocked if someone claims
1141
00:51:15,360 --> 00:51:21,040
a business dependency they owe you a protocol upgrade plan not an exception policy to require
1142
00:51:21,040 --> 00:51:27,440
MFA for all users target all users all cloud apps grant multi factor authentication exclusions only
1143
00:51:27,440 --> 00:51:32,560
the two emergency accounts with an expiry and an owner attach an alert to any sign in where conditional
1144
00:51:32,560 --> 00:51:38,000
access equals not applied due to exclusion if you can't see the break glass path it doesn't exist
1145
00:51:38,000 --> 00:51:43,120
policy three require fishing resistant strengths for privileged roles and critical apps
1146
00:51:43,120 --> 00:51:48,560
target directory roles and named enterprise apps that modify identity money or policy
1147
00:51:48,560 --> 00:51:52,640
grant authentication strength fishing resistant
1148
00:51:52,640 --> 00:51:57,840
gassard kei dahin and disinati yad sad saddan optionally require an authentication context that
1149
00:51:57,840 --> 00:52:03,600
enforces compliant device for pm activation this collapses prompt bombing and oTP social engineering
1150
00:52:03,600 --> 00:52:08,240
on the parts that matter governance moves next these are not toggles they are intent encoded
1151
00:52:08,240 --> 00:52:12,960
to test it break glass accounts cloud only long vaulted passwords excluded only from MFA
1152
00:52:12,960 --> 00:52:17,920
and allow listed by location to a narrow egress you control document where they live who can open
1153
00:52:17,920 --> 00:52:22,880
the vault and how long it takes validate sign and showing logs and that only the baseline block legacy
1154
00:52:22,880 --> 00:52:27,840
policy evaluates put a calendar reminder to test monthly break glass isn't a username it's a
1155
00:52:27,840 --> 00:52:33,280
practice pathway privilege identity management for every tenant wide role set assignments to eligible
1156
00:52:33,280 --> 00:52:38,480
require strong authentication at activation set durations measured in work not days and require
1157
00:52:38,480 --> 00:52:43,840
justification if you have p2 link and authentication context so elevation inherits fishing resistant
1158
00:52:43,840 --> 00:52:49,360
requirements and device posture make the compiler reevaluate risk at the moment privilege appears
1159
00:52:49,360 --> 00:52:54,080
exclusions with clocks and owners inventory current conditional access exclusions for each add an
1160
00:52:54,080 --> 00:52:59,680
owner a business reason and an expiry within 30 days anything without those three gets removed
1161
00:52:59,680 --> 00:53:04,880
this single step converts offense into time box debt you can actually pay down now life cycle for
1162
00:53:04,880 --> 00:53:10,720
nonhumans owner required on enterprise apps and app registrations hard rule no owner no production
1163
00:53:11,440 --> 00:53:18,000
surface a weekly report of owner none on principles with directory scopes and rooted to the identity queue
1164
00:53:18,000 --> 00:53:23,120
replace secrets with certificates where secrets still exist target 90 day lifetimes or automated
1165
00:53:23,120 --> 00:53:28,560
rotation for pipelines outside azure move to federated credentials for those inside switch to user
1166
00:53:28,560 --> 00:53:33,040
assigned managed identities scoped to resources they touch you're not chasing perfection you're
1167
00:53:33,040 --> 00:53:37,920
removing forever secrets and shrinking scope guest lifecycle in one move entitlement management
1168
00:53:37,920 --> 00:53:43,280
for external access create a catalog per top vendor package only the roles they need attach a 30 day
1169
00:53:43,280 --> 00:53:49,520
expiry require a sponsor and attach an access review at day 25 with auto apply block group nesting as
1170
00:53:49,520 --> 00:53:54,080
an elevation mechanism in your process if someone asks to nest the answer is use the package
1171
00:53:54,080 --> 00:54:00,480
time boxes are entropy breaks nesting is persistence scope guardrails for hybrid zero synchronized
1172
00:54:00,480 --> 00:54:05,520
global administrators cloud only admin accounts for tenant wide rolls admin units that reflect real
1173
00:54:05,520 --> 00:54:10,560
seams region subsidiary function with role assignments inside them that lets you retain regional
1174
00:54:10,560 --> 00:54:15,760
delegation without spraying tenant scope it also decouples on prem health from cloud admin parts
1175
00:54:15,760 --> 00:54:20,080
evidence beats belief prove the baseline with four checks you can run in an hour sign in logs where
1176
00:54:20,080 --> 00:54:25,200
client app equals legacy authentication and conditional access equals blocked trend should converge
1177
00:54:25,200 --> 00:54:30,080
to zero attempts or 100 percent blocked any not applied means drift conditional access not
1178
00:54:30,080 --> 00:54:35,040
applied to privileged roles the target is empty if you see exclusions firing for admins you have
1179
00:54:35,040 --> 00:54:40,320
blind parts authentication methods for members of privilege roles the column you care about reads
1180
00:54:40,320 --> 00:54:44,960
phishing resistant registered if it's empty your admin label equals risk enterprise apps with
1181
00:54:44,960 --> 00:54:50,560
directory and owners count equals zero that q is your shadow admin list work at the sprint you'll get
1182
00:54:50,560 --> 00:54:56,720
pushback will break operations standing privilege is the break PM is the safety too many prompts
1183
00:54:56,720 --> 00:55:01,280
strengths for admins risk based prompts for users block legacy and prompt noise drops
1184
00:55:01,280 --> 00:55:07,280
that we trust our network the compiler doesn't it trust signals guests slow us down packages with
1185
00:55:07,280 --> 00:55:12,400
expiry are faster than incidents the order matters less than momentum ship the three policies
1186
00:55:12,400 --> 00:55:18,400
validate break glass turn on pym time box exclusions assign owners replace one secret with a certificate
1187
00:55:18,400 --> 00:55:22,880
and one pipeline with a managed or federated identity create one external access package with
1188
00:55:22,880 --> 00:55:27,680
an auto applied review then schedule the rest this baseline isn't a destination it's a floor it
1189
00:55:27,680 --> 00:55:33,680
reduces blast radius before it reduces flexibility it trades invisible ambiguity for visible control
1190
00:55:33,680 --> 00:55:39,280
and it gives you a control plane that enforces intent not memory evidence without demos queries logs
1191
00:55:39,280 --> 00:55:43,680
diagrams we're not doing a clicking class we're going to show you how the control plane behaves with
1192
00:55:43,680 --> 00:55:48,480
three artifacts you can screenshot annotate and repeat diagrams logs and short queries
1193
00:55:48,480 --> 00:55:52,560
no theatrics just state and flow start with the diagrams you'll reference all year
1194
00:55:52,560 --> 00:56:01,440
diagram one conditional access evaluation flow at the top request context user role app device location
1195
00:56:01,440 --> 00:56:07,920
risk branch one exclusion strip objects from scope before evaluation branch two blocks short
1196
00:56:07,920 --> 00:56:13,040
circuit branch three grant controls combined with and inside a policy effective requirements are
1197
00:56:13,040 --> 00:56:18,000
the union across applicable policies outcome decision plus the telemetry you expect if the policy
1198
00:56:18,000 --> 00:56:23,280
actually applied label the left edge entropy generators and pin exclusions there it teaches why
1199
00:56:23,280 --> 00:56:30,960
not applied equals blind path diagram to identity that accumulation loop intent translation exception
1200
00:56:30,960 --> 00:56:36,560
often persistence rapid circle arrow around it and note the compiler sits across every hop you will
1201
00:56:36,560 --> 00:56:42,000
point to this when someone argues their one temporary bypass can't hurt now the logs because screenshots
1202
00:56:42,000 --> 00:56:48,720
of state beat opinions log one sign in filtered to privilege rolls where conditional access result equals
1203
00:56:48,720 --> 00:56:54,720
not applied at columns for result detail and authentication requirement if the detail says user
1204
00:56:54,720 --> 00:57:00,400
excluded or application excluded that's unordered code running if authentication requirement is blank
1205
00:57:00,400 --> 00:57:06,080
the compiler required nothing one screenshot one truth log two legacy authentication filter sign in
1206
00:57:06,080 --> 00:57:11,760
where client app equals legacy authentication trend the count by day overlay conditional access result
1207
00:57:11,760 --> 00:57:17,280
a block the target is a hundred percent blocked or zero volume anything else is drift hiding in a protocol
1208
00:57:17,280 --> 00:57:23,920
not a network rule log three guest access to high value apps filter on user type equals guest and app
1209
00:57:23,920 --> 00:57:28,640
equals the admin portals or finance systems add authentication requirement and conditional access
1210
00:57:28,640 --> 00:57:34,080
result if you see not applied or MFA accepted external without inbound trust allow listing
1211
00:57:34,080 --> 00:57:39,760
you've encoded ambiguity snap the trend before and after you constrain trust query next keep them
1212
00:57:39,760 --> 00:57:45,280
short readable and survivable in a change window graph query for shadow admins without a steward
1213
00:57:45,280 --> 00:57:50,800
enterprise apps where app role assignments match directory and owners count equals zero that list
1214
00:57:50,800 --> 00:57:55,680
is your emergency queue work at first graph query for forever secrets application registrations where
1215
00:57:55,680 --> 00:58:02,080
password credentials and date time is null or greater than 365 days sought by high risk scopes present
1216
00:58:02,080 --> 00:58:07,440
on related service principles tag and owner set a rotation date replace secrets with certificates
1217
00:58:07,440 --> 00:58:12,480
or federation graph query for scope bloat service principles with role assignments advornish tenant
1218
00:58:12,480 --> 00:58:17,520
or subscription scope join to their display names and tags if you can't map to a living workload
1219
00:58:17,520 --> 00:58:24,240
you found consolidated blast radius KQL excerpts you can paste into a workbook KQL privileged
1220
00:58:24,240 --> 00:58:31,200
sign in with blind paths sign in logs where is not empty tenant ed where tostring identity info
1221
00:58:31,200 --> 00:58:36,160
rolls has any global administrator privilege draw administrator application administrator
1222
00:58:36,160 --> 00:58:41,840
summarize attempts in count as you see the blind paths count if result type equals and conditional
1223
00:58:41,840 --> 00:58:50,320
access status xe-post in not applied by bn time generated one d KQL legacy of blocked versus not
1224
00:58:50,320 --> 00:58:58,400
applied sign in logs where client abused eeklil legacy authentication summarize blocked count if
1225
00:58:58,400 --> 00:59:05,840
conditional access status xos failure not applied count if conditional access status xos
1226
00:59:05,840 --> 00:59:12,880
not applied by bn time generated one d KQL guests hitting sensitive apps sign in logs
1227
00:59:12,880 --> 00:59:21,680
where user type xos guest and app display name in microsoft entra admin center as your portal s a p s
1228
00:59:21,680 --> 00:59:30,160
for hana summarize mfa req our count if authentication requirement has fishing resistant not applied
1229
00:59:30,160 --> 00:59:37,680
count if conditional access status eklur not applied by bn time generated one d add one workbook chart
1230
00:59:37,680 --> 00:59:44,080
per query left access is count color the not applied series in red architects learn fast when red
1231
00:59:44,080 --> 00:59:50,480
fades over time for workload identities you won't see prompts you'll see changes KQL service principle
1232
00:59:50,480 --> 00:59:56,800
consent an app role activity audit logs where a a de operation type in consent to application
1233
00:59:56,800 --> 01:00:04,240
add app role assignment to service principle extend actor equals toastering initiated by app.service
1234
01:00:04,240 --> 01:00:11,360
principle display name my summarize events count by bn time generated one d actor if that chart spikes
1235
01:00:11,360 --> 01:00:16,240
outside change windows you're watching drift finally create a one page evidence board top row the
1236
01:00:16,240 --> 01:00:21,920
two diagrams middle row four tiles privilege not applied legacy blocked guests strengths shadow
1237
01:00:21,920 --> 01:00:28,640
admins without owners bottom row owner non count exclusions with owner and expiry coverage secrets 365 days
1238
01:00:28,640 --> 01:00:34,960
count update weekly no meetings no narration the board tells you if entropy is growing or shrinking
1239
01:00:34,960 --> 01:00:40,160
this is the point you don't need a lab you need artifacted truth diagrams to align mental models
1240
01:00:40,160 --> 01:00:44,880
logs to show flow under the compiler queries to find the places policy never ran that's evidence
1241
01:00:44,880 --> 01:00:51,120
without demos that's how you govern at scale paying down identity debt and 90 day remediation cadence
1242
01:00:51,120 --> 01:00:56,480
this is not a heroic weekend it's a boring disciplined loop that shrinks blast radius on a schedule
1243
01:00:56,480 --> 01:01:01,520
90 days is enough to move the compiler from ambiguity to intent without paralyzing operations
1244
01:01:01,520 --> 01:01:10,000
three phases clear artifacts no ceremonies days 30 inventory isolate and stop the bleeding
1245
01:01:10,000 --> 01:01:15,040
you're not fixing history your halting interest start with exclusions pull every conditional access
1246
01:01:15,040 --> 01:01:21,280
policy and export the exclusions for each stamp and owner a reason and an expiry anything without
1247
01:01:21,280 --> 01:01:26,800
all three gets removed or sunset in seven days create a weekly alert on silence where conditional
1248
01:01:26,800 --> 01:01:32,480
access not applied due to exclusion scope to privilege rolls if a break glass path is excluded
1249
01:01:32,480 --> 01:01:37,840
at visibility now allow list the egress exclude only from mfa and validate silence show in logs if
1250
01:01:37,840 --> 01:01:43,040
you can't see it it's not a control disabled legacy protocols everywhere don't negotiate with i-map
1251
01:01:43,040 --> 01:01:47,920
pop or basic off expect noise the noise is deferred work returning to sender lock trend should
1252
01:01:47,920 --> 01:01:52,320
converge to zero attempts or one hundred percent blocked stage pm for tenant wide rolls make
1253
01:01:52,320 --> 01:01:57,520
assignments eligible require strong auth at activation set durations you can defend and require
1254
01:01:57,520 --> 01:02:03,120
justification if you have authentication contacts tie elevation to a fishing resistant strength
1255
01:02:03,120 --> 01:02:08,880
the goal is the first elevation that reevaluates risk inventory non-human authority query enterprise
1256
01:02:08,880 --> 01:02:15,600
apps with directory and no owners application registrations with secrets older than 365 days or null
1257
01:02:15,600 --> 01:02:20,560
end dates and service principles holding subscription or tenant scope rolls that list is your shadow
1258
01:02:20,560 --> 01:02:27,040
admin queue don't debate names tag owners and publish the queue finally test break glass two cloud
1259
01:02:27,040 --> 01:02:33,760
only accounts long vaulted passwords mfa excluded location allow listed execute a sign in and
1260
01:02:33,760 --> 01:02:38,640
capture the evidence visible in logs blocked by legacy policy not blocked by strengths put the
1261
01:02:38,640 --> 01:02:44,800
test on a calendar days 31 60 replace the worst paths and collapse scope this is where velocity
1262
01:02:44,800 --> 01:02:50,240
returns replace secrets with rotation for the top 10 application registrations with forever secrets
1263
01:02:50,240 --> 01:02:54,960
switch to certificates with 90 day validity or federated credentials store private keys in
1264
01:02:54,960 --> 01:02:59,840
key vault and rehearse rotation if you can't rotate on demand you don't own the principle move
1265
01:02:59,840 --> 01:03:05,200
pipelines if the automation runs in azure convert to user assigned managed identities scope to the
1266
01:03:05,200 --> 01:03:11,440
smallest resource they touch if it runs outside azure federate identity hg get up or idc to remove
1267
01:03:11,440 --> 01:03:16,480
stored credentials this removes entire classes of failure screenshots of environment variables
1268
01:03:16,480 --> 01:03:22,160
exported configs copied secrets trim conditional access to a baseline reduced to three policies block
1269
01:03:22,160 --> 01:03:28,080
legacy mfa for all fishing resistant strengths for admins and critical apps delete policies that
1270
01:03:28,080 --> 01:03:34,400
overlap or weaken the bar any remaining exclusion needs an owner and a clock move trusted locations logic
1271
01:03:34,400 --> 01:03:40,320
into authentication contacts bound to device compliance stop trusting ciders as identity turn on
1272
01:03:40,320 --> 01:03:45,200
access reviews target privilege groups and guest catalogs assign accountable reviewers not
1273
01:03:45,200 --> 01:03:50,480
self review enable auto apply and set a cadence that aligns with risk reviews that don't complete
1274
01:03:50,480 --> 01:03:55,200
are not neutral their persistence localized power create administrative units that reflect real
1275
01:03:55,200 --> 01:04:01,040
seams and delegate roles inside them remove synchronized tenant wide roles ensure every principle
1276
01:04:01,040 --> 01:04:07,280
with our scope is cloud only and pimp eligible you're converting o unostalgia into scoped control
1277
01:04:07,280 --> 01:04:12,880
days 61 90 right size in force strengths and institutionalized decay this locks in the gains
1278
01:04:12,880 --> 01:04:18,640
right size graph permissions replace directory boom read right all with the minimum app roles required
1279
01:04:18,640 --> 01:04:25,120
by each workload or move to your own apis with app roles for azure are back drop scope from subscription
1280
01:04:25,120 --> 01:04:30,960
to resource group or resource and from contributor to precise data actions this is not paperwork it's
1281
01:04:30,960 --> 01:04:36,080
the only guard rail machines will see enforce fishing resistant for the parts that matter validate that
1282
01:04:36,080 --> 01:04:40,720
every member of a privileged role has a registered fishing resistant method where they don't pause
1283
01:04:40,720 --> 01:04:46,000
elevation eligibility until they do for pimp require the same strength via authentication context
1284
01:04:46,000 --> 01:04:51,520
elevation should not lower the bar institutionalize expiry entitlement packages for external access
1285
01:04:51,520 --> 01:04:58,000
get 30 day defaults a sponsor and review that day 25 with auto apply conditional access exclusions
1286
01:04:58,000 --> 01:05:04,560
expire by default application credentials expire by policy owner none triggers a ticket not a shrug
1287
01:05:04,560 --> 01:05:10,880
measure weekly three charts privilege sign-ins with not applied legacy auth blocked versus not applied
1288
01:05:10,880 --> 01:05:16,560
and guest hitting sensitive apps with authentication requirement at two counts owner none for high-risk
1289
01:05:16,560 --> 01:05:22,560
enterprise apps and secrets 365 days if red doesn't fade you didn't change state you changed
1290
01:05:22,560 --> 01:05:27,840
slogans close with the after action loop for every incident or near miss map it onto the identity
1291
01:05:27,840 --> 01:05:33,680
debt accumulation loop where did intent fail translation exception often persistence at a guard rail
1292
01:05:33,680 --> 01:05:39,280
at birth consent workflow requires an owner app creation requires tags break glass tests are
1293
01:05:39,280 --> 01:05:45,200
monthly exclusions auto expire you are encoding decay breaks what about objections will break operations
1294
01:05:45,200 --> 01:05:51,920
standing privilege is the break pim is the safety too many prompts strengths for admins risk-based
1295
01:05:51,920 --> 01:05:56,960
prompts for users vendors can't meet your bar allowless trusted tenants and accept their strengths
1296
01:05:56,960 --> 01:06:02,080
or require yours anything in between is ambiguity 90 days won't make you perfect it will make
1297
01:06:02,080 --> 01:06:06,720
ambiguity expensive that's the point the compiler will enforce what remains make sure what remains
1298
01:06:06,720 --> 01:06:11,840
reflects intent then repeat the loop entropy never stops neither should you objections rebuttals
1299
01:06:11,840 --> 01:06:16,720
and system behavior will break operations the system already did standing privilege is the
1300
01:06:16,720 --> 01:06:22,160
operational break you just don't notice until an incident forces a rollback privileged identity
1301
01:06:22,160 --> 01:06:28,240
management is the safety harness that converts always on risk into on when needed control architects
1302
01:06:28,240 --> 01:06:32,960
don't argue with gravity they install guardrails eligibility with justifications and short
1303
01:06:32,960 --> 01:06:38,320
activation windows is that guard rail the compiler re-evaluates risk at elevation that's not friction
1304
01:06:38,320 --> 01:06:43,200
that's intent enforced at the moment damage becomes possible too many prompts prompts are a symptom
1305
01:06:43,200 --> 01:06:47,440
of weaker assurance not a design goal when you require fishing resistant strengths for admins
1306
01:06:47,440 --> 01:06:53,760
and high value apps the prompts collapse no OTPs to retip no push fatigue no SMS fallbacks a device
1307
01:06:53,760 --> 01:06:59,520
bound assertion turns naggy MFA into a zero interaction key assertion for everyone else risk-based
1308
01:06:59,520 --> 01:07:04,320
prompts plus blocked legacy author reduce noise at the source you don't win by tuning prompts you win
1309
01:07:04,320 --> 01:07:09,760
by removing the failure class that created them we trust our network the compiler doesn't it sees
1310
01:07:09,760 --> 01:07:16,560
signals device posture roll absensitivity risk a c_id_r is not a signal it's a story trusted
1311
01:07:16,560 --> 01:07:21,360
locations teach the authorization compiler to treat an IP range as identity that's how you
1312
01:07:21,360 --> 01:07:26,800
smuggle and manage browsers and proxy sessions into privileged parts replace location bypasses
1313
01:07:26,800 --> 01:07:32,240
with authentication contexts bound to compliant devices you are moving trust from a route to
1314
01:07:32,240 --> 01:07:38,000
an attested state that distinction matters guests slow us down incidents slow you down more entitlement
1315
01:07:38,000 --> 01:07:42,960
packages with default expiry and auto applied access reviews ship faster than ad hoc nesting
1316
01:07:42,960 --> 01:07:49,120
because they encode the exit on issue no retro hunts no who approved this archaeology a 30 day
1317
01:07:49,120 --> 01:07:53,760
window with a sponsor you can name beats a nested group that outlifts the project and the vendor
1318
01:07:53,760 --> 01:07:58,880
external collaboration is a control plane choice encoded ones reuse it forever vendors can't
1319
01:07:58,880 --> 01:08:03,840
meet fishing resistant some can some can't the system already supports in bound trust allow list
1320
01:08:03,840 --> 01:08:08,800
tenants whose posture you contractually trust and accept their strong signals for everyone else
1321
01:08:08,800 --> 01:08:13,600
require your strength at your boundary you're not outlawing collaboration you're removing ambiguity
1322
01:08:13,600 --> 01:08:18,560
the compiler can't resolve safely absent explicit trust prompts are not friction they're your last
1323
01:08:18,560 --> 01:08:24,240
defense our admins need constant access they need constant ability to obtain access not standing
1324
01:08:24,240 --> 01:08:29,120
privileged the difference is blast radius with pm an alertable audible elevation stands in for
1325
01:08:29,120 --> 01:08:34,880
24 by 7 key pair it with short activation and authentication context you didn't slow an admin
1326
01:08:34,880 --> 01:08:40,320
you published a state change operations learns to plan work in windows incidents inherit accountability
1327
01:08:40,320 --> 01:08:45,680
by design this breaks automation workloads do not evaluate conditional access you break automation
1328
01:08:45,680 --> 01:08:51,120
when you miss label human accounts as service managed identities certificates and federated
1329
01:08:51,120 --> 01:08:55,600
credentials give machines the tokens they need without prompting scope is where you control them
1330
01:08:55,600 --> 01:09:00,560
if a pipeline fails after you remove directory read right or you didn't break automation
1331
01:09:00,560 --> 01:09:06,160
you revealed a design omission an overbroad grant that never matched the operation fix scope automation
1332
01:09:06,160 --> 01:09:11,360
returns our executives will hate this executives hate headlines more give them two things
1333
01:09:11,360 --> 01:09:16,160
strengths where privilege exists and fewer prompts where it doesn't for day-to-day usage prompt
1334
01:09:16,160 --> 01:09:21,360
frequency drops when legacy auth is blocked and risk-based CA is clean for privileged access the
1335
01:09:21,360 --> 01:09:26,720
requirement is non-negotiable a compromised executive token is a governance event the compiler
1336
01:09:26,720 --> 01:09:35,120
can't distinguish CEO from attacker using CEO strengths do this seems complex the current state is
1337
01:09:35,120 --> 01:09:41,520
complex overlapping policies phantom exclusions often secrets guests nested into admin roles the
1338
01:09:41,520 --> 01:09:47,520
baseline is simpler by construction three policies PM for privilege expiry by default owners on
1339
01:09:47,520 --> 01:09:54,080
principles fewer branches to debug at 2 a.m. less surface to explain in an audit complexities already
1340
01:09:54,080 --> 01:09:59,040
here you're deciding who owns it the system deterministically or humans improvisationally
1341
01:09:59,040 --> 01:10:04,000
will handle this with monitoring monitoring sees what the compiler executed it does not see what it
1342
01:10:04,000 --> 01:10:09,120
excluded conditional access not applied is a blind path no detection logic can infer a control
1343
01:10:09,120 --> 01:10:15,280
that never ran prevention isn't fashionable its physics reduce unobservable flows then monitor
1344
01:10:15,280 --> 01:10:21,280
the rest alerts mean something when the policy graph is small and intentional this will take too long
1345
01:10:21,280 --> 01:10:26,720
nonsense the system rewards order three policies ship this week PM can turn on in an afternoon
1346
01:10:26,720 --> 01:10:32,000
owners can be stamped by report secrets can be swapped for certificates one pipeline at a time
1347
01:10:32,000 --> 01:10:36,320
entitlement packages can start with one vendor you're not migrating platforms you're replacing
1348
01:10:36,320 --> 01:10:41,360
entropy generators with guardrails in place with evidence if you remember nothing else the authorization
1349
01:10:41,360 --> 01:10:46,560
compiler enforces what remains objections ask you to preserve ambiguity system behavior does
1350
01:10:46,560 --> 01:10:52,480
not negotiate it compiles inputs into decisions every time at scale change the inputs the outcomes follow
1351
01:10:52,480 --> 01:10:58,320
checklist what you can validate this week three policies exist applied and visible legacy
1352
01:10:58,320 --> 01:11:04,080
authentication is blocked tenant wide with zero exclusions confirmation sign-in logs show client app
1353
01:11:04,080 --> 01:11:08,880
exor legacy authentication and conditional access equal blocked with no not applied MFA for all
1354
01:11:08,880 --> 01:11:14,480
users is enabled exclusions exist only for two break glass accounts each with owner and expiry
1355
01:11:14,480 --> 01:11:20,160
confirmation conditional access policy be lists exactly two exclusions alert wired for any not
1356
01:11:20,160 --> 01:11:24,320
applied due to exclusion fishing resistant strengths are required for privileged roles and
1357
01:11:24,320 --> 01:11:30,640
named critical apps confirmation privilege sign-ins show authentication requirement equals fishing
1358
01:11:30,640 --> 01:11:36,320
resistant break glass is real tested and observable two cloud only accounts long vaulted passwords
1359
01:11:36,320 --> 01:11:41,920
excluded from MFA only allow listed to a narrow egress confirmation a scheduled monthly sign-in
1360
01:11:41,920 --> 01:11:46,560
appears in logs blocked by legacy policy not blocked by strengths evidence archived privileged
1361
01:11:46,560 --> 01:11:51,520
identity management is on not promised all tenant wide rolled set to eligible short activation
1362
01:11:51,520 --> 01:11:56,720
windows justification required an activation bound to an authentication context that enforces
1363
01:11:56,720 --> 01:12:01,360
fishing resistant strength confirmation one successful activation event captured with risk
1364
01:12:01,360 --> 01:12:07,040
re-evaluation in audit logs conditional access exclusions are governed every exclusion in every policy
1365
01:12:07,040 --> 01:12:12,720
has an owner a business reason and an expiry else 30 days confirmation exported policy inventory
1366
01:12:12,720 --> 01:12:18,080
shows 100% coverage a weekly task checks aspirations and removes or renews with justification
1367
01:12:18,080 --> 01:12:23,600
workload identities have stewards and lifetimes enterprise apps with directory permissions have
1368
01:12:23,600 --> 01:12:30,400
named owners owner non-count is zero or a known tracked queue confirmation graph report lists owners
1369
01:12:30,400 --> 01:12:36,720
for high-risk apps exceptions carry tickets application credentials have sane lifetimes secrets
1370
01:12:36,720 --> 01:12:42,800
it was 90 days or certificates with automated rotation end date time null so 365 days count is shrinking
1371
01:12:42,800 --> 01:12:48,320
confirmation weekly delta report scope is right sized service principles with subscription or tenant
1372
01:12:48,320 --> 01:12:53,360
scope map to living workloads unnecessary contributor grants are replaced with resource level
1373
01:12:53,360 --> 01:13:00,000
least privilege roles or data actions confirmation role assignment export shows scope moved down
1374
01:13:00,000 --> 01:13:05,760
and role names tightened external identities are constrained by design inbound cross tenant trust
1375
01:13:05,760 --> 01:13:11,120
is none by default with a short allow list for high-value apps guests meet fishing resistant
1376
01:13:11,120 --> 01:13:16,480
strength or supply trusted external MFA only from named tenants confirmation guests sign in to
1377
01:13:16,480 --> 01:13:23,040
sensitive apps show authentication requirement present no not applied entitlement packages exist
1378
01:13:23,040 --> 01:13:29,840
for top vendors with 30 day expiry sponsor and access reviews at day 25 with auto apply confirmation
1379
01:13:29,840 --> 01:13:36,480
access review completion it 100% stale guests removed measurements exist and update weekly
1380
01:13:36,480 --> 01:13:41,840
three charts privileged not applied counts legacy auth blocked versus not applied guests hitting
1381
01:13:41,840 --> 01:13:48,640
sensitive apps with authentication requirement present two counters owner none high risk and secrets
1382
01:13:48,640 --> 01:13:54,400
365 days confirmation a single evidence board shows red fading week over week one migration
1383
01:13:54,400 --> 01:14:00,240
proof a pipeline switch to a user assigned managed identity scope to a single resource and one forever
1384
01:14:00,240 --> 01:14:05,840
secret replaced with a certificate confirmation successful run logs plus retired credential ID
1385
01:14:05,840 --> 01:14:10,960
if any item fails you don't debate intent you adjust inputs to the authorization compiler key
1386
01:14:10,960 --> 01:14:16,640
takeaway and next move identity debt is standing privilege plus ungoverned exceptions plus unowned
1387
01:14:16,640 --> 01:14:22,080
identities inputs that the authorization compiler will faithfully turn into probabilistic outcomes
1388
01:14:22,080 --> 01:14:27,280
reduce ambiguity intent becomes enforceable ship the baseline this week three conditional access
1389
01:14:27,280 --> 01:14:33,360
policies tested break glass p_i_m_ for privilege owners and expires on exclusions one pipeline to manage
1390
01:14:33,360 --> 01:14:38,400
or federated identity subscribe for the deep dive on turning conditional access from execution
1391
01:14:38,400 --> 01:14:42,080
engine into enforceable policy