Detection rules › Panther

Databricks Attempted Logon From Denied IP

Status
Experimental
Severity
informational
Group by
sourceIPAddress, workspaceId
Log types
Databricks.Audit
Tags
Databricks, Initial Access, Reconnaissance
Reference
https://github.com/databricks-solutions/cybersec-workspace-detection-app/blob/main/base/detections/event-based/attempted_logon_from_denied_ip.py
Source
github.com/panther-labs/panther-analysis

Detects blocked login attempts from IP addresses explicitly denied by workspace IP access control policies. This excludes known service agents and telemetry operations. While these attempts were successfully blocked, they may indicate reconnaissance or unauthorized access attempts.

MITRE ATT&CK coverage

TacticTechniques
Initial AccessT1078 Valid Accounts

Rule body yaml

AnalysisType: rule
Filename: databricks_attempted_logon_from_denied_ip.py
RuleID: "Databricks.Audit.AttemptedLogonFromDeniedIP"
DisplayName: "Databricks Attempted Logon From Denied IP"
Enabled: true
Status: Experimental
LogTypes:
  - Databricks.Audit
Tags:
  - Databricks
  - Initial Access
  - Reconnaissance
Reports:
  MITRE ATT&CK:
    - TA0001:T1078 # Valid Accounts
Severity: Info
Description: >
  Detects blocked login attempts from IP addresses explicitly denied by workspace IP access
  control policies. This excludes known service agents and telemetry operations. While these
  attempts were successfully blocked, they may indicate reconnaissance or unauthorized access attempts.
Runbook: |
  1. Count all login attempts from the source IP (sourceIPAddress) in the 1 hour before and after this blocked attempt
  2. Check if the source IP is associated with known VPN services, cloud providers, or threat intelligence feeds
  3. Find all successful and failed login attempts for this user in the 24 hours around the alert to identify credential stuffing patterns
Reference: https://github.com/databricks-solutions/cybersec-workspace-detection-app/blob/main/base/detections/event-based/attempted_logon_from_denied_ip.py
Tests:
  - Name: Blocked Login from Denied IP
    ExpectedResult: true
    Log:
      timestamp: 1234567890000
      serviceName: "accounts"
      actionName: "IpAccessDenied"
      workspaceId: "1234567890123456"
      sourceIPAddress: "192.0.2.100"
      userAgent: "Mozilla/5.0"
      userIdentity:
        email: "user@example.com"
      requestParams:
        path: "/login"
      response:
        statusCode: 403
  - Name: Service Agent Blocked
    ExpectedResult: false
    Log:
      timestamp: 1234567890000
      serviceName: "accounts"
      actionName: "IpAccessDenied"
      sourceIPAddress: "192.0.2.100"
      userAgent: "Databricks-Runtime/12.0"
      userIdentity:
        email: "user@example.com"
      requestParams:
        path: "/api/data"
  - Name: Telemetry Path Blocked
    ExpectedResult: false
    Log:
      timestamp: 1234567890000
      serviceName: "accounts"
      actionName: "IpAccessDenied"
      sourceIPAddress: "192.0.2.100"
      userAgent: "Mozilla/5.0"
      userIdentity:
        email: "user@example.com"
      requestParams:
        path: "/telemetry/events"
  - Name: Token Identity Blocked
    ExpectedResult: false
    Log:
      timestamp: 1234567890000
      serviceName: "accounts"
      actionName: "IpAccessDenied"
      sourceIPAddress: "192.0.2.100"
      userAgent: "Mozilla/5.0"
      userIdentity:
        email: "12345678-1234-1234-1234-123456789012"
      requestParams:
        path: "/api/data"
  - Name: Different Action
    ExpectedResult: false
    Log:
      timestamp: 1234567890000
      serviceName: "accounts"
      actionName: "login"
      sourceIPAddress: "192.0.2.100"
      userIdentity:
        email: "user@example.com"

Detection logic

Condition

serviceName eq "accounts"
actionName eq "IpAccessDenied"
not (userAgent contains "Databricks-Service/driver" or userAgent contains "Databricks-Runtime" or userAgent contains "Delta-Sharing-SparkStructuredStreaming" or userAgent contains "RawDBHttpClient" or userAgent contains "mlflow-python" or userAgent contains "obsSDK-scala" or userAgent contains "wsfs" or userAgent contains "feature-store" or requestParams.path contains "/telemetry" or requestParams.path contains "/delta-commit" or requestParams.path contains "/health" or requestParams.path contains "/metrics" or requestParams.path contains "/status" or userIdentity.email regex_match "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}")

Exclusions

Top-level NOT(...) conjuncts: predicates this rule actively suppresses.

FieldKindExcluded values
requestParams.pathcontains/delta-commit
requestParams.pathcontains/health
requestParams.pathcontains/metrics
requestParams.pathcontains/status
requestParams.pathcontains/telemetry
userAgentcontainsDatabricks-Runtime
userAgentcontainsDatabricks-Service/driver
userAgentcontainsDelta-Sharing-SparkStructuredStreaming
userAgentcontainsRawDBHttpClient
userAgentcontainsfeature-store
userAgentcontainsmlflow-python
userAgentcontainsobsSDK-scala
userAgentcontainswsfs
userIdentity.emailregex_match[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
actionNameeq
  • IpAccessDenied
serviceNameeq
  • accounts

Output fields

Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.

FieldSource
sourceIPAddress
emailuserIdentity.email
workspaceId