The Conditional Access Policy Was In Report-Only Mode
The policy existed.
MFA was configured. Device compliance was configured. Risk controls were configured. The named locations looked right.
On the surface, the tenant looked protected.
But when the suspicious sign-in occurred, the user was still allowed in.
The policy had evaluated the session.
It had even shown what would have happened.
But it never blocked anything.
Because the Conditional Access policy was still in Report-Only mode.
This Agent Foskett briefing investigates a real-world Microsoft Entra ID security gap: controls that were designed, documented and visible β but not actually enforcing protection.
Briefing summary
A Conditional Access policy in Report-Only mode can look like a control, but it does not enforce access decisions. GEMXIT investigates policies that evaluate sign-ins, show expected outcomes and still allow risky sessions through.
What happened
Why Report-Only mode matters
First hunt: find sign-ins evaluated by Conditional Access
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
SigninLogs | where TimeGenerated > ago(7d) | project TimeGenerated, UserPrincipalName, AppDisplayName, IPAddress, Location, ResultType, ConditionalAccessStatus, ConditionalAccessPolicies, DeviceDetail | order by TimeGenerated desc
Second hunt: look for Report-Only outcomes
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
SigninLogs | where TimeGenerated > ago(7d) | extend CAPolicies = todynamic(ConditionalAccessPolicies) | mv-expand CAPolicies | extend PolicyName = tostring(CAPolicies.displayName), PolicyResult = tostring(CAPolicies.result) | where PolicyResult has "reportOnly" | project TimeGenerated, UserPrincipalName, AppDisplayName, PolicyName, PolicyResult, ResultType, IPAddress, Location | order by TimeGenerated desc
Third hunt: review policy changes and exclusions
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
AuditLogs | where TimeGenerated > ago(30d) | where OperationName has_any ( "Add conditional access policy", "Update conditional access policy", "Delete conditional access policy" ) | project TimeGenerated, OperationName, InitiatedBy, TargetResources, Result | order by TimeGenerated desc
Where this becomes dangerous
What should organisations do?
How GEMXIT approaches Conditional Access reviews
Final thought
It is protection when it enforces.
It is: βIs Conditional Access actually enforcing?β
Continue the investigation with The MFA Was On Just Not Everywhere, Just This One Exception, The Dashboard Was Green, The Login Came Through A Trusted Device, The Session Token Never Expired, The User Was Added To A Privileged Group At 3:12AM, Identity and Access Security, Entra ID Security, Zero Trust and the GEMXIT Security Review.
Develop IT. Protect IT. GEMXIT PTY LTD | GEMXIT UK LTD