# Tailscale ACL Policy

## Overview

Tailscale connects all Kaburu infrastructure nodes in a mesh VPN. The ACL policy restricts what each node can reach, limiting blast radius if any node is compromised.

Key concern: kaburusvr is public-facing (22 WordPress sites). If compromised, it must not be able to pivot to LAN nodes.

## Tags

Tag Nodes Purpose
—–——-———
`tag:server-hetzner` ubuntu-16gb-nbg1-1 (kaburusvr), kabururd (added 2026-08-05) Public-facing servers — restricted egress
`tag:server-lan` kaburuaibox, ubuntu-svr, truenas-scale, firewall Trusted LAN nodes — can reach kaburusvr for monitoring
`tag:nas` truenas-scale NAS — receives backup rsync from kaburusvr
`tag:workstation` kaburu-um790-main, kaburu-835, kaburu-430, kaburu-017 Admin workstations — full mesh access
`tag:mobile` pixel-9 Phone — full mesh access

## ACL Rules

```json {

"tagOwners": {
  "tag:server-hetzner": ["autogroup:owner"],
  "tag:server-lan":     ["autogroup:owner"],
  "tag:nas":            ["autogroup:owner"],
  "tag:workstation":    ["autogroup:owner"],
  "tag:mobile":         ["autogroup:owner"]
},
"hosts": {
  "kaburusvr":   "100.112.54.2",
  "kaburuaibox": "100.120.18.44",
  "truenas":     "100.74.178.14",
  "ubuntu-svr":  "100.101.7.86",
  "firewall":    "100.127.64.74"
},
"acls": [
  {"action": "accept", "src": ["tag:server-hetzner"], "dst": ["tag:nas:22"]},
  {"action": "accept", "src": ["tag:server-hetzner"], "dst": ["tag:server-lan:162"]},
  {"action": "accept", "src": ["tag:server-lan"],     "dst": ["tag:server-hetzner:22,161"]},
  {"action": "accept", "src": ["tag:server-lan"],     "dst": ["tag:server-lan:*"]},
  {"action": "accept", "src": ["tag:workstation"],    "dst": ["*:*"]},
  {"action": "accept", "src": ["tag:mobile"],         "dst": ["*:*"]},
  {"action": "accept", "src": ["autogroup:owner"],    "dst": ["*:*"]}
]

} ```

## What kaburusvr can reach (post-ACL)

Destination Port Purpose
————-—————
truenas-scale (100.74.178.14) TCP 22 Daily rsync backup via `/root/backup.sh`
kaburuaibox (100.120.18.44) UDP 162 SNMP traps (`trap2sink` in snmpd.conf)

Cannot reach: kaburuaibox SSH, ubuntu-svr, firewall, or any other LAN node.

## What can reach kaburusvr

Source Port Purpose
——–—————
kaburuaibox TCP 22 Hermes SSH (hetzner MCP, monitoring)
kaburuaibox UDP 161 Hermes SNMP poll
tag:workstation any Admin access
tag:mobile any Admin access
autogroup:owner any Owner fallback

## API token

- Stored: `/root/.secrets/tailscale` on kaburusvr - Expires: 2026-09-04 (90-day token issued 2026-06-06) - Renew at: https://login.tailscale.com/admin/settings/keys

## Applied

- Policy pushed via API: 2026-06-06 - Tags assigned via API: 2026-06-06 - Verified: SSH kaburuaibox→kaburusvr ✅, backup path kaburusvr→truenas ✅