Runbook: Identity Anomaly Alert¶
Runbook Metadata¶
| Field | Value |
|---|---|
| Runbook ID | RB-001 |
| Title | Identity Anomaly — Suspicious Authentication Activity |
| Version | 1.1 |
| Status | Approved |
| Owner | SOC Tier 2 |
| MITRE ATT&CK | TA0006 (Credential Access) — T1110 (Brute Force), T1078 (Valid Accounts), T1621 (MFA Bypass) |
| Alert Sources | Impossible travel alert, MFA anomaly, authentication from Tor/VPN, failed auth threshold |
| Nexus SecOps Controls | Nexus SecOps-011, Nexus SecOps-048, Nexus SecOps-113, Nexus SecOps-119 |
| SLA | Critical: 15min acknowledgment; High: 30min |
Overview¶
What triggers this runbook: Authentication anomalies including: impossible travel (same account authenticated from two geographically distant locations within impossible timeframe), MFA bypass attempts, authentication from Tor exit nodes or known bad IPs, large numbers of failed authentication attempts followed by success, or UEBA anomaly score breach.
Why this matters: Compromised credentials are the most common initial access vector. Early detection and response to credential compromise can prevent escalation to data exfiltration, ransomware deployment, or persistent access.
Common causes:
| Cause | TP or FP | Frequency |
|---|---|---|
| Credential theft (phishing, password spray) | TP | Medium |
| VPN from unusual location (travel) | FP | High |
| Shared account used by multiple people | FP | Medium |
| Developer API access from new environment | FP | Medium |
| Attacker using stolen credentials after breach | TP | Low-Medium |
| MFA push fatigue attack | TP | Medium |
Triage Steps (Tier 1) — Target: 10 minutes¶
Step 1: Immediate Context¶
- [ ] 1.1 Note the alert type: ☐ Impossible travel ☐ Tor/bad IP ☐ MFA anomaly ☐ Brute force success ☐ UEBA spike
- [ ] 1.2 Identify affected account: ________
- [ ] 1.3 Identify authentication locations/IPs:
- Location 1: _ at _ UTC
- Location 2: _ at _ UTC
- Distance/time feasibility: ☐ Impossible ☐ Improbable ☐ Possible
Step 2: Quick Enrichment¶
Run in SIEM — replace {USER} and {TIMERANGE}:
// Last 24h authentication events for user
SigninLogs
| where UserPrincipalName == "{USER}"
| where TimeGenerated > ago(24h)
| project TimeGenerated, IPAddress, Location, ResultType, ResultDescription,
AuthenticationRequirement, ClientAppUsed, DeviceDetail
| order by TimeGenerated desc
// Active sessions for the account right now
AADNonInteractiveUserSignInLogs
| where UserPrincipalName == "{USER}"
| where TimeGenerated > ago(1h)
| summarize count() by IPAddress, Location, AppDisplayName
- [ ] 2.1 Is the suspicious IP a known Tor exit node or commercial VPN? (check TIP)
- [ ] 2.2 Does the user have a travel record or remote work request on file?
- [ ] 2.3 Are there other alerts on this account in the past 30 days?
- [ ] 2.4 What applications/data did the account access from the suspicious location?
Step 3: Contact the User (if safe to do so)¶
Do not contact the user if you suspect an insider threat or if the account may be actively monitored by an adversary.
- [ ] 3.1 Contact user via secondary channel (phone, Slack, in-person — NOT email to the potentially compromised account)
- [ ] 3.2 Ask: "Did you authenticate from [Location] at [Time]?"
- ☐ Yes, confirmed legitimate → Close as FP, document explanation
- ☐ No, I was not there → Confirmed compromise → ESCALATE IMMEDIATELY
- ☐ Cannot reach user → Treat as unconfirmed compromise → Escalate
Step 4: Triage Decision¶
If: User confirms activity as legitimate (travel, VPN use)
→ CLOSE as False Positive — document in ticket
If: User denies activity OR cannot be reached + suspicious indicators
→ ESCALATE to Tier 2 — do NOT pre-contain without approval
If: Active malicious session confirmed + critical account
→ DECLARE INCIDENT + emergency containment
Investigation Steps (Tier 2)¶
Step 5: Scope the Compromise¶
// All activity from the suspicious IP
SigninLogs
| where IPAddress == "{SUSPICIOUS_IP}"
| where TimeGenerated > ago(7d)
| summarize Users=dcount(UserPrincipalName), Apps=make_set(AppDisplayName)
by IPAddress, Location
// What did the account access after compromise?
AuditLogs
| where InitiatedBy contains "{USER}"
| where TimeGenerated > ago(7d)
| where Result == "success"
| project TimeGenerated, ActivityDisplayName, TargetResources
| order by TimeGenerated asc
- [ ] 5.1 Were any other accounts authenticated from the same suspicious IP? (pivot indicator)
- [ ] 5.2 Did the account access privileged resources or download data?
- [ ] 5.3 Were any new email rules, forwarding rules, or OAuth grants created?
- [ ] 5.4 Check for MFA method changes (attacker adding their own MFA device)
- [ ] 5.5 Identify dwell time: first suspicious event timestamp = ____
Containment Actions¶
These actions disrupt the user. Get manager approval for account disables except in emergencies.
Playbook Trigger: Account Compromise — Immediate Actions¶
Execute in sequence with approval:
- Revoke all active sessions (soft containment — user loses active logins, can re-authenticate)
- Azure AD:
Revoke-AzureADUserAllRefreshToken -ObjectId {USER_OBJECT_ID} -
This can be done without manager approval
-
Reset password (forces re-authentication on all devices)
- Requires user notification immediately after
-
Coordinate with helpdesk
-
Disable account (if active threat or cannot reach user)
- Requires Tier 2 lead + Manager approval
-
Notify manager of the action
-
Block suspicious IPs/domains (if C2 or attacker infrastructure identified)
- Submit to network team for firewall block
-
Add to SIEM watchlist
-
Remove suspicious OAuth grants or email rules (if attacker established persistence)
- Audit all OAuth grants for the account
- Review and remove unauthorized email forwarding rules
Post-Containment Investigation¶
After containment, determine:
- [ ] Was any data accessed or downloaded?
- [ ] Were any other accounts or systems used by this account during the compromise?
- [ ] What was the initial access vector? (phishing, password spray, credential dump?)
- [ ] Are there other accounts with similar compromise indicators?
Regulatory Considerations¶
If the compromised account had access to:
| Data Type | Regulation | Notification Requirement |
|---|---|---|
| EU citizen personal data | GDPR | 72 hours to supervisory authority if breach confirmed |
| PHI (health records) | HIPAA | 60 days to HHS; immediate if >500 individuals |
| Cardholder data | PCI DSS | Immediate notification to card brands |
| US federal data | FISMA | CISA notification within 1 hour of discovery |
Engage legal/compliance immediately if any regulatory data may have been accessed.
References¶
- T1078 — Valid Accounts
- T1621 — Multi-Factor Authentication Request Generation
- CISA: Phishing Guidance
- Related: RB-002 — Endpoint Malicious Behavior
RB-001 v1.1 | Reviewed: 2025-Q4 | Next review: 2026-Q4