AnalysisType: rule
Description: Detects when SAML Authentication for Administrators is marked as Disabled or Optional.
DisplayName: "Duo Admin SSO SAML Requirement Disabled"
Enabled: true
Filename: duo_admin_sso_saml_requirement_disabled.py
Reference: https://duo.com/docs/sso#saml:~:text=Modify%20Authentication%20Sources
Severity: Medium
Tests:
- ExpectedResult: true
Log:
action: admin_single_sign_on_update
description: '{"enforcement_status": "disabled"}'
isotimestamp: "2021-10-12 21:29:22"
timestamp: "2021-10-12 21:29:22"
username: Homer Simpson
Name: Enforcement Disabled
- ExpectedResult: true
Log:
action: admin_single_sign_on_update
description: '{"enforcement_status": "optional"}'
isotimestamp: "2021-10-12 21:29:22"
timestamp: "2021-10-12 21:29:22"
username: Homer Simpson
Name: Enforcement Optional
- ExpectedResult: false
Log:
action: admin_single_sign_on_update
description: '{"enforcement_status": "required"}'
isotimestamp: "2021-10-12 21:29:22"
timestamp: "2021-10-12 21:29:22"
username: Homer Simpson
Name: Enforcement Required
- ExpectedResult: false
Log:
action: admin_single_sign_on_update
description: '{"sso_url": "https://duff.okta.com/app/duoadminpanel/abcdefghijklm/sso/saml", "slo_url": null, "idp_type": "okta", "cert": "C=US/CN=duff/L=Springfield/O=Okta/OU=SSOProvider/ST=California/emailAddress=info@okta.com - 2031-08-10 13:39:00+00:00", "require_signed_response": true, "entity_id": "http://www.okta.com/abcdefghijk"}'
isotimestamp: "2021-10-12 21:33:40"
timestamp: "2021-10-12 21:33:40"
username: Homer Simpson
Name: SSO Update
DedupPeriodMinutes: 60
LogTypes:
- Duo.Administrator
RuleID: "Duo.Admin.SSO.SAML.Requirement.Disabled"
Threshold: 1
# ------ paired body: duo_admin_sso_saml_requirement_disabled.py ------
from panther_duo_helpers import deserialize_administrator_log_event_description, duo_alert_context
def rule(event):
if event.get("action") == "admin_single_sign_on_update":
description = deserialize_administrator_log_event_description(event)
enforcement_status = description.get("enforcement_status", "required")
return enforcement_status != "required"
return False
def title(event):
description = deserialize_administrator_log_event_description(event)
return (
f"Duo: [{event.get('username', '<username_not_found>')}] "
"changed SAML authentication requirements for Administrators "
f"to [{description.get('enforcement_status', '<enforcement_status_not_found>')}]"
)
def alert_context(event):
return duo_alert_context(event)