Detection rules › Panther
Panther rules: tailscale
| Rule | Severity |
|---|---|
| Tailscale HTTPS Disabled | high |
| Tailscale Machine Approval Requirements Disabled | high |
| Tailscale Magic DNS Disabled | high |
Tailscale HTTPS Disabled
#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.actionisDISABLEevent.target.propertyisHTTPSevent.originisADMIN_CONSOLE
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
event.action | eq |
| field:"EventType" kind:eq value:"DISABLE" |
event.origin | eq |
| field:"event.origin" kind:eq value:"ADMIN_CONSOLE" |
event.target.property | eq |
| field:"event.target.property" kind:eq value:"HTTPS" |
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
loginName | event.actor.loginName |
id | event.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
#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.actionisDISABLEevent.target.propertyisMACHINE_APPROVAL_NEEDEDevent.originisADMIN_CONSOLE
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
event.action | eq |
| field:"EventType" kind:eq value:"DISABLE" |
event.origin | eq |
| field:"event.origin" kind:eq value:"ADMIN_CONSOLE" |
event.target.property | eq |
| field:"event.target.property" kind:eq value:"MACHINE_APPROVAL_NEEDED" |
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
loginName | event.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
#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.actionisDISABLEevent.target.propertyisMAGIC_DNSevent.originisADMIN_CONSOLE
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
event.action | eq |
| field:"EventType" kind:eq value:"DISABLE" |
event.origin | eq |
| field:"event.origin" kind:eq value:"ADMIN_CONSOLE" |
event.target.property | eq |
| field:"event.target.property" kind:eq value:"MAGIC_DNS" |
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
loginName | event.actor.loginName |
id | event.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"
}