Snowflake Login Without MFA


Description

Detect Snowflake logins without multifactor authentication

Query · python

MFA_EXCEPTIONS = {"PANTHER_READONLY", "PANTHER_ADMIN", "PANTHERACCOUNTADMIN"}


def rule(event):
    return all(
        (
            event.get("EVENT_TYPE") == "LOGIN",
            event.get("IS_SUCCESS") == "YES",
            event.get("FIRST_AUTHENTICATION_FACTOR") == "PASSWORD",
            not event.get("SECOND_AUTHENTICATION_FACTOR"),
            event.get("USER_NAME") not in MFA_EXCEPTIONS,
        )
    )


def title(event):
    source = event.get("p_source_label", "<UNKNOWN SOURCE>")
    user = event.get("USER_NAME", "<UNKNOWN USER>")
    return f"{source}: User {user} logged in without MFA"
Raw source Snowflake Login Without MFA · Panther Python
Esc
Published by panther-labs/panther-analysis ↗, licensed under Apache 2.0 ↗. Reproduced here unmodified.
AnalysisType: rule
Filename: snowflake_stream_login_without_mfa.py
RuleID: Snowflake.Stream.LoginWithoutMFA
DisplayName: Snowflake Login Without MFA
Enabled: false
LogTypes:
  - Snowflake.LoginHistory
Severity: Medium
Reports:
  MITRE ATT&CK:
    - TA0005:T1556
Description: Detect Snowflake logins without multifactor authentication
DedupPeriodMinutes: 1440
Tags:
  - Snowflake
  - '[MITRE] Defense Evasion'
  - '[MITRE] Modify Authentication Process'
Tests:
  - Name: Login With MFA
    ExpectedResult: false
    Log:
      {
        "p_event_time": "2024-10-08 14:38:46.061000000",
        "p_log_type": "Snowflake.LoginHistory",
        "p_source_label": "Snowflake Prod",
        "CLIENT_IP": "1.1.1.1",
        "EVENT_ID": "393754014361778",
        "EVENT_TIMESTAMP": "2024-10-08 14:38:46.061000000",
        "EVENT_TYPE": "LOGIN",
        "FIRST_AUTHENTICATION_FACTOR": "PASSWORD",
        "IS_SUCCESS": "YES",
        "RELATED_EVENT_ID": "0",
        "REPORTED_CLIENT_TYPE": "OTHER",
        "REPORTED_CLIENT_VERSION": "1.11.1",
        "SECOND_AUTHENTICATION_FACTOR": "OTP",
        "USER_NAME": "ckent@dailyplanet.org"
      }
  - Name: Login Without MFA
    ExpectedResult: true
    Log:
      {
        "p_event_time": "2024-10-08 14:38:46.061000000",
        "p_log_type": "Snowflake.LoginHistory",
        "p_source_label": "Snowflake Prod",
        "CLIENT_IP": "1.2.3.4",
        "EVENT_ID": "393754014361778",
        "EVENT_TIMESTAMP": "2024-10-08 14:38:46.061000000",
        "EVENT_TYPE": "LOGIN",
        "FIRST_AUTHENTICATION_FACTOR": "PASSWORD",
        "IS_SUCCESS": "YES",
        "RELATED_EVENT_ID": "0",
        "REPORTED_CLIENT_TYPE": "OTHER",
        "REPORTED_CLIENT_VERSION": "1.11.1",
        "USER_NAME": "luthor@lexcorp.com"
      }


# ------ paired body: snowflake_stream_login_without_mfa.py ------

MFA_EXCEPTIONS = {"PANTHER_READONLY", "PANTHER_ADMIN", "PANTHERACCOUNTADMIN"}


def rule(event):
    return all(
        (
            event.get("EVENT_TYPE") == "LOGIN",
            event.get("IS_SUCCESS") == "YES",
            event.get("FIRST_AUTHENTICATION_FACTOR") == "PASSWORD",
            not event.get("SECOND_AUTHENTICATION_FACTOR"),
            event.get("USER_NAME") not in MFA_EXCEPTIONS,
        )
    )


def title(event):
    source = event.get("p_source_label", "<UNKNOWN SOURCE>")
    user = event.get("USER_NAME", "<UNKNOWN USER>")
    return f"{source}: User {user} logged in without MFA"

Detection rules belong to the projects that publish them and remain under their own licenses. This site indexes and links to them; it claims no rights in them.