Detection rules › Panther

Panther rules: tailscale

Tailscale HTTPS Disabled

#
Severity
high
Entities
actor_ids, emails, usernames
Log types
Tailscale.Audit
Reference
tailscale.com
Source
github.com/panther-labs/panther-analysis

A Tailscale User disabled HTTPS settings in your organization's tenant.

Detection logic

from panther_tailscale_helpers import is_tailscale_admin_console_event, tailscale_alert_context


def rule(event):

    action = event.deep_get("event", "action", default="<NO_ACTION_FOUND>")
    target_property = event.deep_get(
        "event", "target", "property", default="<NO_TARGET_PROPERTY_FOUND>"
    )
    return all(
        [
            action == "DISABLE",
            target_property == "HTTPS",
            is_tailscale_admin_console_event(event),
        ]
    )


def title(event):
    user = event.deep_get("event", "actor", "loginName", default="<NO_USER_FOUND>")
    target_id = event.deep_get("event", "target", "id", default="<NO_TARGET_ID_FOUND>")
    return (
        f"Tailscale user [{user}] disabled HTTPS for "
        f"[{target_id}] in your organization’s tenant."
    )


def alert_context(event):
    return tailscale_alert_context(event)

Rule specification

AnalysisType: rule
Description: A Tailscale User disabled HTTPS settings in your organization's tenant.
DisplayName: "Tailscale HTTPS Disabled"
Enabled: true
Filename: tailscale_https_disabled.py
Runbook: Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.
Reference: https://tailscale.com/kb/1153/enabling-https/#disable-https
Severity: High
DedupPeriodMinutes: 60
LogTypes:
  - Tailscale.Audit
RuleID: "Tailscale.HTTPS.Disabled"
Threshold: 1

Stages and Predicates

Fires on Tailscale.Audit events when all of the conditions below hold.

Condition

  • event.action is DISABLE
  • event.target.property is HTTPS
  • event.origin is ADMIN_CONSOLE

Indicators

These rows show field, operator, and value matches.

Output fields

Fields the rule emits when it matches, drawn from the rule's alert_context.

FieldSource
loginNameevent.actor.loginName
idevent.target.id

Response runbook

Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.

Worked example

A sample event from the rule's unit tests that triggers a match.

Sample Test Event
{
  "event": {
    "action": "DISABLE",
    "actor": {
      "displayName": "Homer Simpson",
      "id": "uodc9f3CNTRL",
      "loginName": "homer.simpson@yourcompany.io",
      "type": "USER"
    },
    "eventGroupID": "1770eb26fb58fbf67fd8fbfcc2056e66",
    "origin": "ADMIN_CONSOLE",
    "target": {
      "id": "yoururl.com",
      "name": "yoururl.com",
      "property": "HTTPS",
      "type": "TAILNET"
    }
  },
  "fields": {
    "recorded": "2023-07-19 16:10:48.385283827"
  },
  "p_any_actor_ids": [
    "uodc9f3CNTRL"
  ],
  "p_any_emails": [
    "homer.simpson@yourcompany.io"
  ],
  "p_any_usernames": [
    "andrea.youwakim"
  ],
  "p_event_time": "2023-07-19 16:10:48.172000",
  "p_log_type": "Tailscale.Audit",
  "p_parse_time": "2023-07-19 16:13:56.849092",
  "p_row_id": "5e197fb53834e39eeab7feb9198d04",
  "p_schema_version": 0,
  "p_source_id": "5d65e24a-7ebb-403b-803c-51396e03d201",
  "p_source_label": "Tailscale Audit and Network Logs",
  "time": "2023-07-19 16:10:48.172000000"
}

Tailscale Machine Approval Requirements Disabled

#
Severity
high
Entities
actor_ids, emails, md5_hashes, usernames
Log types
Tailscale.Audit
Reference
tailscale.com
Source
github.com/panther-labs/panther-analysis

A Tailscale User disabled machine approval requirement settings in your organization's tenant. This means devices can access your network without requiring approval.

Detection logic

from panther_tailscale_helpers import is_tailscale_admin_console_event, tailscale_alert_context


def rule(event):

    action = event.deep_get("event", "action", default="<NO_ACTION_FOUND>")
    target_property = event.deep_get(
        "event", "target", "property", default="<NO_TARGET_PROPERTY_FOUND>"
    )
    return all(
        [
            action == "DISABLE",
            target_property == "MACHINE_APPROVAL_NEEDED",
            is_tailscale_admin_console_event(event),
        ]
    )


def title(event):
    user = event.deep_get("event", "actor", "loginName", default="<NO_USER_FOUND>")
    return (
        f"Tailscale user [{user}] disabled device approval requirements "
        f"for new devices accessing your organization’s network."
    )


def alert_context(event):
    return tailscale_alert_context(event)

Rule specification

AnalysisType: rule
Description: A Tailscale User disabled machine approval requirement settings in your organization's tenant. This means devices can access your network without requiring approval.
DisplayName: "Tailscale Machine Approval Requirements Disabled"
Enabled: true
Filename: tailscale_machine_approval_requirements_disabled.py
Runbook: Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.
Reference: https://tailscale.com/kb/1099/device-approval/
Severity: High
DedupPeriodMinutes: 60
LogTypes:
  - Tailscale.Audit
RuleID: "Tailscale.Machine.Approval.Requirements.Disabled"
Threshold: 1

Stages and Predicates

Fires on Tailscale.Audit events when all of the conditions below hold.

Condition

  • event.action is DISABLE
  • event.target.property is MACHINE_APPROVAL_NEEDED
  • event.origin is ADMIN_CONSOLE

Indicators

These rows show field, operator, and value matches.

Output fields

Fields the rule emits when it matches, drawn from the rule's alert_context.

FieldSource
loginNameevent.actor.loginName

Response runbook

Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.

Worked example

A sample event from the rule's unit tests that triggers a match.

Sample Test Event
{
  "event": {
    "action": "DISABLE",
    "actor": {
      "displayName": "Homer Simpson",
      "id": "uhfQwM4CNTRL",
      "loginName": "homer.simpson@yourcompany.io",
      "type": "USER"
    },
    "eventGroupID": "6dae044c7a8998599e94657b511d28f9",
    "origin": "ADMIN_CONSOLE",
    "target": {
      "id": "panther.com",
      "name": "panther.com",
      "property": "MACHINE_APPROVAL_NEEDED",
      "type": "TAILNET"
    }
  },
  "fields": {
    "recorded": "2023-06-27 22:58:15.824694387"
  },
  "p_any_emails": [
    "homer.simpson@yourcompany.io"
  ],
  "p_any_md5_hashes": [
    "6dae044c7a8998599e94657b511d28f9"
  ],
  "p_any_usernames": [
    "homersimpson"
  ],
  "p_event_time": "2023-06-27 23:02:08.54",
  "p_log_type": "Custom.TailscaleAudit",
  "p_parse_time": "2023-06-27 23:02:08.54",
  "p_row_id": "8ec49771e630f6e8e5fdb28319d95c",
  "p_schema_version": 4,
  "p_source_id": "3acfbe1d-f7b2-4c3f-a26e-8da418fd29ef",
  "p_source_label": "Custom Tailscale Audit",
  "p_timeline": "2023-06-27 23:02:08.54",
  "time": 1687906694.915
}

Tailscale Magic DNS Disabled

#
Severity
high
Entities
actor_ids, emails, usernames
Log types
Tailscale.Audit
Reference
tailscale.com
Source
github.com/panther-labs/panther-analysis

A Tailscale User disabled magic dns settings in your organization's tenant.

Detection logic

from panther_tailscale_helpers import is_tailscale_admin_console_event, tailscale_alert_context


def rule(event):

    action = event.deep_get("event", "action", default="<NO_ACTION_FOUND>")
    target_property = event.deep_get(
        "event", "target", "property", default="<NO_TARGET_PROPERTY_FOUND>"
    )
    return all(
        [
            action == "DISABLE",
            target_property == "MAGIC_DNS",
            is_tailscale_admin_console_event(event),
        ]
    )


def title(event):
    user = event.deep_get("event", "actor", "loginName", default="<NO_USER_FOUND>")
    target_id = event.deep_get("event", "target", "id", default="<NO_TARGET_ID_FOUND>")
    return (
        f"Tailscale user [{user}] disabled Magic DNS for "
        f"[{target_id}] in your organization’s tenant."
    )


def alert_context(event):
    return tailscale_alert_context(event)

Rule specification

AnalysisType: rule
Description: A Tailscale User disabled magic dns settings in your organization's tenant.
DisplayName: "Tailscale Magic DNS Disabled"
Enabled: true
Filename: tailscale_magicdns_disabled.py
Runbook: Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.
Reference: https://tailscale.com/kb/1081/magicdns/
Severity: High
DedupPeriodMinutes: 60
LogTypes:
  - Tailscale.Audit
RuleID: "Tailscale.Magic.DNS.Disabled"
Threshold: 1

Stages and Predicates

Fires on Tailscale.Audit events when all of the conditions below hold.

Condition

  • event.action is DISABLE
  • event.target.property is MAGIC_DNS
  • event.origin is ADMIN_CONSOLE

Indicators

These rows show field, operator, and value matches.

Output fields

Fields the rule emits when it matches, drawn from the rule's alert_context.

FieldSource
loginNameevent.actor.loginName
idevent.target.id

Response runbook

Assess if this was done by the user for a valid business reason. Be vigilant to re-enable this setting as it's in the best security interest for your organization's security posture.

Worked example

A sample event from the rule's unit tests that triggers a match.

Sample Test Event
{
  "event": {
    "action": "DISABLE",
    "actor": {
      "displayName": "Homer Simpson",
      "id": "uodc9f3CNTRL",
      "loginName": "homer.simpson@yourcompany.io",
      "type": "USER"
    },
    "eventGroupID": "017676eb3de31cd31c0be96b965c2970",
    "origin": "ADMIN_CONSOLE",
    "target": {
      "id": "yoururl.com",
      "name": "yoururl.com",
      "property": "MAGIC_DNS",
      "type": "TAILNET"
    }
  },
  "fields": {
    "recorded": "2023-07-19 16:10:38.825360311"
  },
  "p_any_actor_ids": [
    "uodc9f3CNTRL"
  ],
  "p_any_emails": [
    "homer.simpson@yourcompany.io"
  ],
  "p_any_usernames": [
    "homer.simpson"
  ],
  "p_event_time": "2023-07-19 16:10:38.365000",
  "p_log_type": "Tailscale.Audit",
  "p_parse_time": "2023-07-19 16:13:56.849016",
  "p_row_id": "5e197fb53834e39eeab7feb9198904",
  "p_schema_version": 0,
  "p_source_id": "5d65e24a-7ebb-403b-803c-51396e03d201",
  "p_source_label": "Tailscale Audit and Network Logs",
  "time": "2023-07-19 16:10:38.365000000"
}