Service Principal Sign-Ins: A blind spot that a lot are missing
SOC analysts — when was the last time you checked service principal sign-ins?
Most teams never do, because the logs aren’t even enabled by default.
AADServicePrincipalSignInLogs is a completely separate table from normal user SigninLogs. Service principals log in independently:
• No MFA
• No Conditional Access (unless you explicitly enabled workload identity policies)
• Invisible in standard sign-in dashboards
An attacker who creates or compromises a service principal gets silent, persistent access that:
→ Doesn’t appear in user logs
→ Bypasses all user-based detections
→ Survives password resets and offboarding
→ Authenticates on its own schedule
Quick start to close this gap:
- Entra ID → Monitoring & health → Diagnostic settings
- Enable ServicePrincipalSignInLogs to your Log Analytics workspace
Then run this KQL:
let CorporateIPs = dynamic(["your-corporate-range-1", "your-corporate-range-2"]);
AADServicePrincipalSignInLogs
| where TimeGenerated > ago(30d)
| where isnotempty(IPAddress) and IPAddress !in (CorporateIPs)
| summarize
TotalSignIns = count(),
SuccessCount = countif(ResultType == 0),
FailureCount = countif(ResultType != 0)
by ServicePrincipalName, AppId, IPAddress, Location
| extend FailureRate = round(toreal(FailureCount) / TotalSignIns * 100, 2)
| order by TotalSignIns desc