Remote-Pulse Tailscale ACL Application Runbook¶
Owner: Ramón
Source: ADR-0008 Apéndice E
Cadence: Apply once during F8, review quarterly
Prerequisites¶
- Access to
https://login.tailscale.com/admin/acls(admin role on tailnetmonxas) - HuJSON syntax familiarity (JSON + comments + trailing commas)
tailscaleCLI installed (for tagging hosts)- Access to affected hosts via SSH
Backup Current Policy¶
CRITICAL: Always backup before applying changes.
- Navigate to
https://login.tailscale.com/admin/acls - Click "Show ACL" → Select all → Copy
- Save to
secrets/tailscale-acl-backup-$(date +%Y%m%d-%H%M).hujson
# Example (manual paste required)
mkdir -p secrets
vim secrets/tailscale-acl-backup-20260525-1430.hujson
Note: secrets/ is gitignored. Keep backups safe.
Apply Policy¶
Option A: Web UI (Recommended for first-time)¶
- Open
ansible/roles/remote_pulse_server/files/tailscale-acl-policy.hujson - Copy entire contents
- Navigate to
https://login.tailscale.com/admin/acls - Paste into editor
- Click "Save"
- Wait for auto-validation: Green checkmark = tests passed
Option B: API (Advanced)¶
export TAILSCALE_API_KEY="tskey-api-..."
export TAILNET="monxas.ts.net"
curl -fsS -X POST "https://api.tailscale.com/api/v2/tailnet/$TAILNET/acl" \
-u "$TAILSCALE_API_KEY:" \
-H "Content-Type: application/hujson" \
--data-binary "@ansible/roles/remote_pulse_server/files/tailscale-acl-policy.hujson"
Validate Tests¶
Tests run automatically on policy save. Confirm all pass:
- Web UI: Green indicators next to each test
- API response: Check JSON output for
"tests": "passed"
If any test fails: 1. Do NOT proceed with tagging 2. Review test error messages 3. Fix policy or tests 4. Re-apply
Apply Tags to Hosts¶
After ACL is live, tag devices.
Tag the Server (LXC 280)¶
ssh [email protected]
tailscale up --reset --advertise-tags=tag:rp-server --hostname=rp-server
tailscale status | head -1 # Confirm "rp-server" tag applied
Tag Agents by Group¶
Prod agents (homelab infra):
Family agents (Carmelo Mac, etc.):
ssh <user>@<host>
tailscale up --reset --advertise-tags=tag:rp-agent-family --hostname=$(hostname -s)
Iarq agents (client projects):
Default agents (transitional, e.g. mac-ramon-test):
ssh <user>@<host>
tailscale up --reset --advertise-tags=tag:rp-agent-default --hostname=$(hostname -s)
Bulk tagging helper:
Validate Connectivity¶
Test 1: Admin Full Access¶
From Ramón's laptop:
ssh [email protected] # Should succeed with passkey check
Test 2: Server → Agent¶
From LXC 280:
Test 3: Agent → Server¶
From any agent:
curl -v http://rp-server.monxas.ts.net:8080/v1/health # Should succeed
ssh [email protected] # Should FAIL (server SSH not exposed to agents)
Test 4: Lateral Movement Blocked¶
From tag:rp-agent-iarq host:
Test 5: Family User Isolation¶
From family user's laptop (after adding to group:family):
ssh user@<family-agent>.monxas.ts.net # Should succeed
ssh root@<prod-agent>.monxas.ts.net # Should FAIL
Rollback¶
If connectivity breaks or tests fail:
- Open
https://login.tailscale.com/admin/acls - Paste contents of backup file (
secrets/tailscale-acl-backup-<date>.hujson) - Click "Save"
- Verify connectivity restored
Post-rollback: - Review what went wrong - Fix policy offline - Re-apply with updated version
Adding Users to Groups¶
To populate group:family or group:iarq:
- Edit ACL policy
- Add user email to group array:
"group:family": ["[email protected]", "[email protected]"], - Save policy (tests re-run automatically)
- Notify user to accept Tailscale invite
User onboarding checklist: - User joins tailnet via invite link - User installs Tailscale on their device - User authenticates with their identity provider - Admin applies group membership via ACL - User can now SSH to their tagged agents
Review Cadence¶
- Quarterly: Review tags, groups, and rules
- On new host group: Update ACL before enrolling first host
- On security incident: Immediate review + potential tag revocation
Troubleshooting¶
"Permission denied" on SSH despite ACL¶
- Check Tailscale SSH is enabled:
tailscale status --json | jq .Self.SSH - Verify host has correct tag:
tailscale status --json | jq .Self.Tags - Confirm user is in correct group: Check ACL
groupssection
"Connection timeout" between hosts¶
- Check ACL
aclssection for missing src→dst rule - Run
tailscale ping <destination>to test reachability - Review Tailscale admin console "Access controls" tab for denied connections
ACL tests fail on save¶
- Read error message carefully (indicates which test failed)
- Common issues:
- Typo in tag name
- User email not in tailnet
- Port number mismatch
- Fix and re-save
References¶
- ADR-0008 Apéndice E (policy design rationale)
/Users/ramonkamibayashicarrera/homelab-infra/docs/docs/reference/rp-tailscale-tags.md(tag→group mapping)- Tailscale ACL docs:
https://tailscale.com/kb/1018/acls