# SNS Auth — CLI Identity Gateway (Future Project)

**Status**: Research / Pre-development
**Target market**: Small to mid-size businesses
**Concept**: A terminal-based authentication tool that issues short-lived credentials after hardware/passkey verification. One login → all internal tools authenticated. The `mwinit` pattern, productized for SMBs.

---

## Problem Statement

Small companies use: static API keys in `.env` files, long-lived SSH keys, shared passwords, maybe 2FA on a web UI. There is no turnkey CLI-first auth system aimed at small businesses who want to secure internal tooling (scripts, APIs, CI, servers) without a bloated web portal.

---

## Product Shape

```
sns-auth                    <- single Go binary, ~15MB
├── login                   <- FIDO2/passkey tap (or TOTP fallback)
├── status                  <- session info, expiry, scopes
├── token [--scope X]       <- mint a scoped short-lived token
├── exec -- <cmd>           <- run command with creds injected (env vars)
├── secret get/set <name>   <- encrypted secret store (age or bw-backed)
├── enroll                  <- first-time device registration
├── revoke [--all]          <- kill sessions
├── audit                   <- recent auth events
└── admin                   <- user/device/scope management (server-side)

sns-auth-server             <- lightweight daemon (systemd socket-activated)
├── /auth/begin, /auth/finish  <- WebAuthn ceremony
├── /token/issue               <- scoped token mint
├── /token/revoke              <- revocation
├── /audit/log                 <- append-only event log
├── /admin/*                   <- user/device CRUD
└── SQLite backend             <- zero external deps
```

---

## Feature Set

### Authentication
- Passwordless primary auth — FIDO2/WebAuthn hardware key or passkey
- Short-lived session tokens — 8-24hr expiry, auto-refresh, forced re-auth after expiry
- Device binding — token locked to machine fingerprint (hostname + MAC + machine-id)
- TOTP fallback — for environments without hardware keys
- Offline grace period — cached credential works N minutes without server contact

### Authorization
- Role-based scopes — each token carries explicit scopes (e.g. `infra:read`, `deploy:write`)
- Service-specific sub-tokens — `sns-auth token --scope git` mints narrow token for one service
- Deny-by-default — no scope = no access

### Credential Management
- Secrets vault integration — `sns-auth secret get <name>` fetches from encrypted store
- Automatic credential injection — `sns-auth exec -- docker push ...` injects env vars
- Rotation enforcement — tracks long-lived token expiry, warns/blocks when overdue

### Audit & Security
- Append-only audit log — every auth event logged with timestamp + device + IP
- Session revocation — `sns-auth revoke --all` kills all active sessions instantly
- Tamper detection — CLI binary checks its own integrity on launch
- Lockout policy — brute-force protection (irrelevant with FIDO2 but defense-in-depth)

### Operations
- Single binary — one Go binary, zero runtime deps
- Lightweight server — SQLite backend, runs on any Linux box
- Mesh-aware — works over private networks (NetBird, Tailscale, WireGuard)
- Graceful degradation — cached sessions survive server downtime until expiry
- Bootstrap mode — first-run device enrollment with one-time code

---

## Competitive Advantage Over Current SMB Options

| What they have now | What sns-auth provides |
|---|---|
| Shared `.env` files with API keys | Zero standing credentials — everything expires |
| Password manager + hope | Hardware key / passkey required for any credential |
| No audit trail | Every token issuance, secret access, session logged |
| SSH keys that never rotate | Short-lived SSH certs (8hr), auto-expire |
| "Who has access?" = guessing | `sns-auth admin list` shows all active sessions/devices |
| Each tool has its own login | One `sns-auth login` → all tools authenticated |

---

## Open Source Foundations (build from, not fork)

### Recommended: Clean-room build using permissive libraries

All BSD/Apache/MIT — fully closeable source:

| Library | Purpose | License |
|---------|---------|---------|
| `github.com/go-webauthn/webauthn` | WebAuthn/FIDO2 ceremonies | BSD-3 |
| `github.com/lestrrat-go/jwx` | JWT/JWE/JWK token handling | MIT |
| `github.com/mattn/go-sqlite3` | Storage (users, sessions, audit) | MIT |
| `github.com/spf13/cobra` | CLI framework | Apache-2.0 |
| `golang.org/x/crypto` | Crypto primitives (age, argon2) | BSD-3 |

### Reference implementations (study, don't fork directly)

| Project | What to steal | URL | License |
|---------|--------------|-----|---------|
| **Vouch** (vouch.sh) | UX flow: YubiKey tap → 8hr session → SSH/AWS/Git creds. Scoped token issuance, credential helper pattern. | vouch.sh | Apache-2.0/MIT (CLI) |
| **Smallstep CLI** | Command structure, browser-callback OAuth flow, cert renewal logic, shell integration. | github.com/smallstep/cli | Apache-2.0 |
| **Hanko** | Passkey auth engine, user management, JWT session handling. Go backend with clean API. | github.com/teamhanko/hanko | AGPL-3.0 (caution — study only) |
| **Passwordless-Auth-Rust** | WebAuthn + TOTP + magic link flow, JWT revocation, SQLite backend. Architecture reference. | github.com/hoangsonww/Passwordless-Auth-Rust | Check repo |

### Pieces to steal from specific projects

| Project | Steal what |
|---------|-----------|
| Kefmat/zero-trust-token-authority | Merkle tree audit log, DPoP proof-of-possession binding |
| kontext-security/kontext-cli | Credential injection pattern (`exec -- command`), scoped access model |
| kanidm/webauthn-rs | Battle-tested WebAuthn implementation (Rust reference if ever needed) |

---

## Tech Decisions

- **Language**: Go (single static binary, cross-compile, same ecosystem as Smallstep/Hanko)
- **Storage**: SQLite (zero-dependency, embedded, good enough for 10k+ users)
- **Crypto**: Ed25519 for signing, AES-256-GCM for secrets at rest, Argon2id for any key derivation
- **Transport**: HTTPS (TLS 1.3) between CLI and server; mTLS optional for high-security deployments
- **Distribution**: Single binary download, Docker image for server, systemd unit file

---

## Development Phases

| Phase | What | Estimated effort |
|-------|------|------------------|
| **1 - MVP** | Passkey auth + JWT minting, CLI client (`login`/`status`/`token`/`exec`), SQLite audit | 4-5 weekends |
| **2 - Polish** | Device enrollment, TOTP fallback, `secret` command (age-backed), branding, docs | 3-4 weekends |
| **3 - Productize** | Install script, Docker compose for server, admin TUI, pricing page, landing site | 3-4 weekends |
| **4 - Harden** | Security audit, pen-test, binary tamper detection, key ceremony documentation | Ongoing |

---

## Business Model Options

- **Open-core**: CLI + single-user server free; multi-user, team management, SSO bridge = paid
- **Per-seat**: Free for 1-3 users, paid per seat after (standard SMB model)
- **Appliance**: Ship a pre-configured LXC/VM image customers drop into their infra

---

## Notes

- Research date: 2026-08-04
- This tool does NOT compete with Okta/Auth0 (those are web-app identity providers). This is CLI-first infra auth — closer to HashiCorp Vault's auth methods but simpler and standalone.
- Potential name candidates: sns-auth, gate, sentinel, keypost (TBD)
