AnalysisType: rule
Description: An Administrator enabled a user to authenticate without MFA.
DisplayName: "Duo Admin User MFA Bypass Enabled"
Enabled: true
Filename: duo_admin_user_mfa_bypass_enabled.py
Reference: https://duo.com/docs/policy#authentication-policy
Severity: Medium
Tests:
- ExpectedResult: false
Log:
action: user_update
description: '{"status": "Active"}'
isotimestamp: "2021-10-05 22:45:33"
object: bart.simpson@simpsons.com
timestamp: "2021-10-05 22:45:33"
username: Homer Simpson
Name: Account Active
- ExpectedResult: false
Log:
action: user_update
description: '{"status": "Disabled"}'
isotimestamp: "2021-10-05 22:45:33"
object: bart.simpson@simpsons.com
timestamp: "2021-10-05 22:45:33"
username: Homer Simpson
Name: Account Disabled
- ExpectedResult: true
Log:
action: user_update
description: '{"status": "Bypass"}'
isotimestamp: "2021-10-05 22:45:33"
object: bart.simpson@simpsons.com
timestamp: "2021-10-05 22:45:33"
username: Homer Simpson
Name: Bypass Enabled
- ExpectedResult: false
Log:
action: user_update
description: '{"phones": ""}'
isotimestamp: "2021-07-02 19:06:40"
object: homer.simpson@simpsons.com
timestamp: "2021-07-02 19:06:40"
username: Homer Simpson
Name: Phones Update
DedupPeriodMinutes: 60
LogTypes:
- Duo.Administrator
RuleID: "Duo.Admin.User.MFA.Bypass.Enabled"
Threshold: 1
# ------ paired body: duo_admin_user_mfa_bypass_enabled.py ------
from panther_duo_helpers import deserialize_administrator_log_event_description, duo_alert_context
def rule(event):
if event.get("action") == "user_update":
description = deserialize_administrator_log_event_description(event)
if "status" in description:
return description.get("status") == "Bypass"
return False
def title(event):
return (
f"Duo: [{event.get('username', '<username_not_found>')}] "
f"updated account [{event.get('object', '<object_not_found>')}] "
"to not require two-factor authentication."
)
def alert_context(event):
return duo_alert_context(event)