AnalysisType: rule
Filename: duo_user_bypass_code_used.py
RuleID: "DUO.User.BypassCode.Used"
DisplayName: "Duo User Bypass Code Used"
Enabled: true
DedupPeriodMinutes: 5
LogTypes:
- Duo.Authentication
Tags:
- Duo
Severity: Low
Description: A Duo user's bypass code was used to authenticate
Reference: https://duo.com/docs/adminapi#authentication-logs
Runbook: Follow up with the user to confirm they used the bypass code themselves.
Tests:
- Name: bypass_code_used
ExpectedResult: true
Log:
{
"access_device": { "ip": "12.12.112.25", "os": "Mac OS X" },
"auth_device": { "ip": "12.12.12.12" },
"application": { "key": "D12345", "name": "Slack" },
"event_type": "authentication",
"factor": "duo_push",
"reason": "bypass_user",
"result": "success",
"user": { "name": "example@example.io" },
}
- Name: good_auth
ExpectedResult: false
Log:
{
"access_device": { "ip": "12.12.112.25", "os": "Mac OS X" },
"auth_device": { "ip": "12.12.12.12" },
"application": { "key": "D12345", "name": "Slack" },
"event_type": "authentication",
"factor": "duo_push",
"reason": "user_approved",
"result": "success",
"user": { "name": "example@example.io" },
}
- Name: denied_old_creds
ExpectedResult: false
Log:
{
"access_device": { "ip": "12.12.112.25", "os": "Mac OS X" },
"auth_device": { "ip": "12.12.12.12" },
"application": { "key": "D12345", "name": "Slack" },
"event_type": "authentication",
"factor": "duo_push",
"reason": "out_of_date",
"result": "denied",
"user": { "name": "example@example.io" },
}
# ------ paired body: duo_user_bypass_code_used.py ------
def rule(event):
return event.get("reason") == "bypass_user" and event.get("result") == "success"
def title(event):
user = event.deep_get("user", "name", default="Unknown")
return f"Bypass code for Duo User [{user}] used"
def alert_context(event):
return {
"factor": event.get("factor"),
"reason": event.get("reason"),
"user": event.deep_get("user", "name", default=""),
"os": event.deep_get("access_device", "os", default=""),
"ip_access": event.deep_get("access_device", "ip", default=""),
"ip_auth": event.deep_get("auth_device", "ip", default=""),
"application": event.deep_get("application", "name", default=""),
}