Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
73b4787
Add Tailscale (CCF) solution
noodlemctwoodle May 11, 2026
f556403
Tailscale (CCF): add hunting queries + Standard/Premium workbooks
noodlemctwoodle May 12, 2026
a97e95f
Tailscale (CCF): pre-emptive CI fixes (mirrors UniFi PR fix-up)
noodlemctwoodle May 12, 2026
05a01ef
Tailscale (CCF): rename to *_Audit_CL, fix OAuth, add 5 Premium rules
noodlemctwoodle May 12, 2026
4e1dc8a
Tailscale (CCF): rename network-tier hunting queries to 'Tailscale Pr…
noodlemctwoodle May 12, 2026
7e261e9
Tailscale (CCF): full Free/Standard coverage (9 pollers, 8 tables, 16…
noodlemctwoodle May 12, 2026
7f7272b
Tailscale Premium (CCF): full expansion to 11 pollers + posture content
noodlemctwoodle May 12, 2026
d47c4a5
Tailscale (CCF): merge 3 DNS tables into single Tailscale_Dns_CL
noodlemctwoodle May 12, 2026
630a82d
Tailscale (CCF): redesign workbooks to match UniFi visual style
noodlemctwoodle May 12, 2026
808e032
Tailscale (CCF): switch /devices poller to ?fields=all (expose routes)
noodlemctwoodle May 12, 2026
147721b
Tailscale (CCF): fix Settings panel - readable values + tier-correct …
noodlemctwoodle May 12, 2026
d6e72e3
Tailscale (CCF): add 4 analytic rules + 4 hunts on new device fields
noodlemctwoodle May 12, 2026
b296bcd
fix(tailscale): pre-emptive CI compliance (mirror UniFi Copilot review)
noodlemctwoodle May 12, 2026
bc258a6
fix(tailscale): connector publisher 'Custom' -> 'Community'
noodlemctwoodle May 12, 2026
ccb8266
feat(tailscale): rebuild Standard workbook with 9-tab forensic UX
noodlemctwoodle May 13, 2026
7c3ee1f
feat(tailscale): finalize 3.0.0 for upstream PR submission
noodlemctwoodle May 19, 2026
40c18b8
docs(tailscale): credit Tailscale for tailnet upgrade enabling Premiu…
noodlemctwoodle May 19, 2026
caabafc
docs(tailscale): refine Tailscale acknowledgement - flow logs, no tri…
noodlemctwoodle May 19, 2026
7edc476
docs(tailscale): tighten Tailscale acknowledgement to generic thanks
noodlemctwoodle May 19, 2026
dff0769
docs(tailscale): sync README with current content counts and schema
noodlemctwoodle May 19, 2026
a1221a9
docs(tailscale): drop VPN-tunnel-events bullet, sync Premium counts
noodlemctwoodle May 19, 2026
8c33407
docs(tailscale): replace fictional ASIM-parser claim with a planned-w…
noodlemctwoodle May 19, 2026
0beedf0
feat(tailscale): add vimNetworkSessionTailscale ASIM NetworkSession p…
noodlemctwoodle May 19, 2026
35c26ce
fix(tailscale): align CustomTables schemas + finish hunt description …
noodlemctwoodle Jun 15, 2026
9ca7207
Merge remote-tracking branch 'upstream/master' into add-tailscale-ccf…
noodlemctwoodle Jun 15, 2026
63221a6
chore(tailscale): regenerate Package/ against current upstream V3 too…
noodlemctwoodle Jun 15, 2026
c0089a1
fix(tailscale): address PR #14482 Copilot review feedback
noodlemctwoodle Jun 16, 2026
74a07e6
fix(tailscale): resolve PR #14482 CI build failures (KQL + logo)
noodlemctwoodle Jun 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -355,3 +355,6 @@ Hunting Queries/DeployedQueries.json

.arm-ttk


# Local-only helper scripts (not for upstream submission)
.local-helpers/
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{ "Name": "Tailscale_Audit_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "EventTime", "Type": "datetime" },
{ "Name": "EventGroupID", "Type": "string" },
{ "Name": "EventType", "Type": "string" },
{ "Name": "ActionDetails", "Type": "string" },
{ "Name": "Actor", "Type": "dynamic" },
{ "Name": "Action", "Type": "string" },
{ "Name": "Target", "Type": "dynamic" },
{ "Name": "Origin", "Type": "dynamic" },
{ "Name": "New", "Type": "dynamic" },
{ "Name": "Old", "Type": "dynamic" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
{
"Name": "Tailscale_Devices_CL",
"Properties": [
{
"Name": "TenantId",
"Type": "string"
},
{
"Name": "SourceSystem",
"Type": "string"
},
{
"Name": "TimeGenerated",
"Type": "datetime"
},
{
"Name": "DeviceId",
"Type": "string"
},
{
"Name": "DeviceName",
"Type": "string"
},
{
"Name": "Hostname",
"Type": "string"
},
{
"Name": "User",
"Type": "string"
},
{
"Name": "Os",
"Type": "string"
},
{
"Name": "ClientVersion",
"Type": "string"
},
{
"Name": "UpdateAvailable",
"Type": "bool"
},
{
"Name": "Authorized",
"Type": "bool"
},
{
"Name": "IsExternal",
"Type": "bool"
},
{
"Name": "Created",
"Type": "datetime"
},
{
"Name": "LastSeen",
"Type": "datetime"
},
{
"Name": "Expires",
"Type": "datetime"
},
{
"Name": "KeyExpiryDisabled",
"Type": "bool"
},
{
"Name": "BlocksIncomingConnections",
"Type": "bool"
},
{
"Name": "Addresses",
"Type": "dynamic"
},
{
"Name": "Tags",
"Type": "dynamic"
},
{
"Name": "EnabledRoutes",
"Type": "dynamic"
},
{
"Name": "AdvertisedRoutes",
"Type": "dynamic"
},
{
"Name": "ClientConnectivity",
"Type": "dynamic"
},
{
"Name": "MachineKey",
"Type": "string"
},
{
"Name": "NodeKey",
"Type": "string"
},
{
"Name": "Distro",
"Type": "string"
},
{
"Name": "SshEnabled",
"Type": "bool"
},
{
"Name": "ConnectedToControl",
"Type": "bool"
},
{
"Name": "TailnetLockKey",
"Type": "string"
},
{
"Name": "TailnetLockError",
"Type": "string"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{ "Name": "Tailscale_Dns_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "ConfigType", "Type": "string" },
{ "Name": "Nameservers", "Type": "dynamic" },
{ "Name": "MagicDNS", "Type": "bool" },
{ "Name": "SearchPaths", "Type": "dynamic" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
{
"Name": "Tailscale_Keys_CL",
"Properties": [
{
"Name": "TenantId",
"Type": "string"
},
{
"Name": "SourceSystem",
"Type": "string"
},
{
"Name": "TimeGenerated",
"Type": "datetime"
},
{
"Name": "KeyId",
"Type": "string"
},
{
"Name": "Description",
"Type": "string"
},
{
"Name": "UserId",
"Type": "string"
},
{
"Name": "Created",
"Type": "datetime"
},
{
"Name": "Expires",
"Type": "datetime"
},
{
"Name": "Revoked",
"Type": "datetime"
},
{
"Name": "Capabilities",
"Type": "dynamic"
},
{
"Name": "KeyType",
"Type": "string"
},
{
"Name": "ExpirySeconds",
"Type": "int"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{ "Name": "Tailscale_Network_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "NodeId", "Type": "string" },
{ "Name": "FlowStart", "Type": "datetime" },
{ "Name": "FlowEnd", "Type": "datetime" },
{ "Name": "SrcNode", "Type": "dynamic" },
{ "Name": "SrcUser", "Type": "string" },
{ "Name": "SrcNodeName", "Type": "string" },
{ "Name": "SrcOs", "Type": "string" },
{ "Name": "SrcTags", "Type": "dynamic" },
{ "Name": "SrcAddresses", "Type": "dynamic" },
{ "Name": "DstNodes", "Type": "dynamic" },
{ "Name": "DstCount", "Type": "int" },
{ "Name": "DstNodeId", "Type": "string" },
{ "Name": "DstNodeName", "Type": "string" },
{ "Name": "DstUser", "Type": "string" },
{ "Name": "DstOs", "Type": "string" },
{ "Name": "DstTags", "Type": "dynamic" },
{ "Name": "DstAddresses", "Type": "dynamic" },
{ "Name": "VirtualTraffic", "Type": "dynamic" },
{ "Name": "SubnetTraffic", "Type": "dynamic" },
{ "Name": "ExitTraffic", "Type": "dynamic" },
{ "Name": "PhysicalTraffic", "Type": "dynamic" },
{ "Name": "HasVirtualTraffic", "Type": "bool" },
{ "Name": "HasSubnetTraffic", "Type": "bool" },
{ "Name": "HasExitTraffic", "Type": "bool" },
{ "Name": "HasPhysicalTraffic", "Type": "bool" },
{ "Name": "IsRelayed", "Type": "bool" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{ "Name": "Tailscale_PostureIntegrations_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "IntegrationId", "Type": "string" },
{ "Name": "Provider", "Type": "string" },
{ "Name": "CloudId", "Type": "string" },
{ "Name": "ClientId", "Type": "string" },
{ "Name": "TenantId_Provider", "Type": "string" },
{ "Name": "ConfigOverwrites", "Type": "dynamic" },
{ "Name": "Status", "Type": "dynamic" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{ "Name": "Tailscale_Settings_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "DevicesApprovalOn", "Type": "bool" },
{ "Name": "DevicesAutoUpdatesOn", "Type": "bool" },
{ "Name": "DevicesKeyDurationDays", "Type": "int" },
{ "Name": "UsersApprovalOn", "Type": "bool" },
{ "Name": "UsersRoleAllowedToJoinExternalTailnets", "Type": "string" },
{ "Name": "NetworkFlowLoggingOn", "Type": "bool" },
{ "Name": "RegionalRoutingOn", "Type": "bool" },
{ "Name": "PostureIdentityCollectionOn", "Type": "bool" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{ "Name": "Tailscale_Users_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "UserId", "Type": "string" },
{ "Name": "DisplayName", "Type": "string" },
{ "Name": "LoginName", "Type": "string" },
{ "Name": "TailnetId", "Type": "string" },
{ "Name": "UserType", "Type": "string" },
{ "Name": "Role", "Type": "string" },
{ "Name": "Status", "Type": "string" },
{ "Name": "DeviceCount", "Type": "int" },
{ "Name": "Created", "Type": "datetime" },
{ "Name": "LastSeen", "Type": "datetime" },
{ "Name": "CurrentlyConnected", "Type": "bool" },
{ "Name": "ProfilePicUrl", "Type": "string" }
]}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{ "Name": "Tailscale_Webhooks_CL",
"Properties":[
{ "Name": "TenantId", "Type": "string" },
{ "Name": "SourceSystem", "Type": "string" },
{ "Name": "TimeGenerated", "Type": "datetime" },
{ "Name": "EndpointId", "Type": "string" },
{ "Name": "EndpointUrl", "Type": "string" },
{ "Name": "ProviderType", "Type": "string" },
{ "Name": "CreatorLoginName", "Type": "string" },
{ "Name": "Created", "Type": "datetime" },
{ "Name": "LastModified", "Type": "datetime" },
{ "Name": "Subscriptions", "Type": "dynamic" }
]}
Original file line number Diff line number Diff line change
Expand Up @@ -314,5 +314,6 @@
"UniFiSiteManagerConnectorDefinition",
"UtimacoESKMConnector",
"GSDetectionAlerts",
"VaikoraSecurityCenter"
"TailscaleCCF",
"TailscalePremiumCCF"
]
Comment thread
noodlemctwoodle marked this conversation as resolved.
1 change: 1 addition & 0 deletions Logos/Tailscale.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
id: 6b052c8d-5de8-eab0-1956-69a297765a32
name: "Tailscale: Auth key created"
description: |
Identifies when a new Tailscale auth key is generated. Auth keys allow unattended device enrollment into the tailnet - confirm it was expected and revoke if not.
severity: Low
status: Available
requiredDataConnectors:
- connectorId: TailscaleCCF
dataTypes:
- Tailscale_Audit_CL
queryFrequency: 15m
queryPeriod: 15m
triggerOperator: gt
triggerThreshold: 0
tactics:
- Persistence
relevantTechniques:
- T1098
query: |
Tailscale_Audit_CL
| where Action == "CREATE"
| where tostring(Target.type) == "AUTH_KEY"
| extend ActorLogin = tostring(Actor.loginName)
| extend KeyDescription = tostring(New.description)
| extend Reusable = tostring(New.reusable)
| extend Ephemeral = tostring(New.ephemeral)
| project TimeGenerated, ActorLogin, KeyDescription, Reusable, Ephemeral, Origin, New
entityMappings:
- entityType: Account
fieldMappings:
- identifier: FullName
columnName: ActorLogin
incidentConfiguration:
createIncident: true
groupingConfiguration:
enabled: true
reopenClosedIncident: false
lookbackDuration: 5h
matchingMethod: AllEntities
groupByEntities: []
kind: Scheduled
version: 1.0.0
Loading