# 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 ✅