sns-network-solutions/infra/sns-networking/vpn-and-access.md
Samuel James b1a35783bb Consolidate 7 divisions to 3: Networking, Digital, Support
- Merge Infrastructure + Secure + Systems → SNS Networking (Business #1)
- Merge Web + Software + Cloud → SNS Digital (planned)
- SNS Support unchanged (planned)
- Add infra/ folder with 16 FOSS-first buildable designs
- Update all agent knowledge, division briefs, legal structure
- Restructure businesses/ from 7 to 3 operating folders
2026-07-18 13:08:23 -05:00

84 lines
3.0 KiB
Markdown

# VPN & Access Control — SNS Networking
**Entity:** SNS Networking · **Status:** Partially built (WireGuard + Tailscale active)
## What it is
Zero-trust-lite access model. No service is reachable from the public internet unless
it explicitly needs to be. All management access goes through VPN. All web UIs gated
by Authelia 2FA.
## Layers
```
Layer 1: Network (WireGuard / Tailscale)
└── Can you even reach the port?
Layer 2: Authentication (Authelia + SSH keys)
└── Who are you?
Layer 3: Authorization (per-service ACLs)
└── Are you allowed to do this?
```
## Access Matrix
| What | Who | How they get in |
|------|-----|-----------------|
| Proxmox Web UI | Sam | Tailscale IP → port 8006 |
| SSH to any host | Sam | WireGuard/Tailscale → ProxyJump |
| Gitea web | Sam + future devs | Caddy → Authelia 2FA → Gitea |
| Monitoring (Grafana) | Sam | Caddy → Authelia 2FA → Grafana |
| Client websites | Public | Caddy → site (no auth) |
| Client WordPress admin | Client | Caddy → Authelia or IP-restrict |
| Vaultwarden | Sam | Caddy → Authelia 2FA → Vaultwarden |
## Authelia Configuration (key decisions)
- **Backend:** file-based users (YAML). Swap to LDAP when user count > 10.
- **2FA:** TOTP (Authelia built-in). No hardware key requirement yet.
- **Session:** 12h idle timeout, 7d absolute timeout.
- **Policy:** two_factor for all protected domains. No single_factor exceptions.
- **Integration:** Caddy `forward_auth` directive per-site.
```
# Caddyfile pattern for Authelia-protected service
grafana.internal.sns {
forward_auth authelia:9091 {
uri /api/authz/forward-auth
copy_headers Remote-User Remote-Groups Remote-Email
}
reverse_proxy grafana:3000
}
```
## Certificate Management
| Scope | Tool | Method |
|-------|------|--------|
| Public sites | Caddy (built-in ACME) | Let's Encrypt, auto-renewal |
| Internal services | Caddy (internal CA) or Step-CA | Caddy can issue self-signed internal certs automatically |
| WireGuard | Native (Noise protocol) | No PKI needed — public key exchange |
| SSH | OpenSSH keys | Ed25519 keys, no CA (until 20+ hosts) |
**Future:** SSH Certificate Authority (step-ca) when managing keys for 20+ hosts
becomes unwieldy.
## Security Posture
- **No service exposed without auth** (except public websites by design).
- **2FA mandatory** on every web UI — no exceptions.
- **Session tokens short-lived** — 12h idle forces re-auth.
- **No VPN split tunneling for management** — if you're on the mesh, you can reach
management ports. If you're not, you can't. Binary.
- **Key rotation:** SSH keys rotated annually. WireGuard keys annually.
Authelia TOTP secrets only on device change.
## Upgrade Path
- **Keycloak + LDAP:** When you have employees or multiple clients needing SSO.
- **Hardware keys (WebAuthn):** When the threat model justifies it (high-value targets).
- **SSH CA (step-ca):** When managing individual authorized_keys files across 20+ hosts
becomes toil.
- **Mutual TLS (mTLS):** For service-to-service auth if zero-trust goes full-depth.