Identity, access,
and secrets.
The single foundation every other system inherits from. Workspace SSO + 1Password Business + two YubiKeys + Tailscale ACLs. Get this layer right and a single revocation kills access everywhere; get it wrong and re-rolling credentials becomes a multi-day project.
Companion to USI-RB-01 §03 (Phase 0 abridged). This runbook is the deep-dive: vault structure, key recovery, mesh ACLs, and the secrets-rotation cadence enforced from USO-ST-06 §03.
How to use this runbook.
Identity is the foundation under every other system. This runbook stands up the four-piece identity stack and codifies the policies that govern it for the lifetime of the Studio.
Run it once at Day 0. Re-read §08 (Secrets policy) and §10 (Identity checklist) every quarter, and any time a credential rotates, a key is lost, or a seat is added.
The order matters — Workspace before 1Password (so 1Password can use Workspace SSO), 1Password before YubiKey (so the keys protect the right account), YubiKey before Tailscale and GitHub (so those services can require hardware-backed 2FA from the start). Skipping the order means re-doing earlier steps with the protective layer added back later, which is the most common way credentials end up unprotected.
The four-piece stack.
One identity provider, one password manager, one hardware factor, one network mesh. Every other SaaS surface federates against this stack — nothing stands alone.
| Layer | Tool | Role | Cost |
|---|---|---|---|
| SSO / IdP | Google Workspace Business Standard | The single identity. Every SaaS surface federates here. | $14 / seat / mo |
| Vault | 1Password Business | Stores every credential, secret, and recovery code. SSO via Workspace. | $20 / seat / mo |
| Hardware factor | 2x YubiKey 5C NFC | Phishing-proof second factor for Workspace + 1Password + GitHub. | ~$110 (one-time) |
| Network mesh | Tailscale | Zero-trust mesh between workstation, NAS, and any future server. | Free tier (1 admin) |
Total cost: ~$34/mo + ~$110 one-time. Tailscale stays free until the team grows past the personal tier.
Google Workspace setup.
- Sign up at
workspace.google.com. Choose Business Standard ($14/seat/mo) — required for Shared Drives and Vault. - Enter
umbra.groupas the primary domain. - Verify domain ownership via DNS TXT record at the registrar (Cloudflare/etc).
- Add MX records pointing to Google. Disable any prior mail routes.
- Create user
abe@umbra.group. Generate a strong password in 1Password (32+ chars). - Create five Groups (not seats) for role aliases. Groups are free; seats are not:
hello@umbra.group # public inbound billing@umbra.group # invoices, finance contracts@umbra.group # legal, MSAs, SOWs security@umbra.group # security disclosures press@umbra.group # press & media inquiries
All five forward to abe@.
In Admin Console → Security
- 2-Step Verification: enforce on all users. Allowed methods: Security Key only (no SMS, no Authenticator app fallback once YubiKey is enrolled).
- Less Secure Apps: disabled.
- Session length: 8 hours, then re-auth.
- Recovery email/phone: disable user-set recovery; admin-only.
- Login challenges: enable.
- Context-Aware Access: enable; restrict admin actions to managed devices.
In Admin Console → Apps → Google Workspace
- Drive sharing: restrict external sharing to allowlisted domains.
- Gmail: enable enhanced pre-delivery scanning.
- Calendar: disable external visibility of free/busy by default.
1Password vault structure.
Six vaults, each with a specific isolation purpose. From USO-ST-06 §03.
| Vault | Holds | Access | Rotation |
|---|---|---|---|
| studio | Studio-internal SaaS credentials, dev API keys, internal infra logins. | Studio members only | 90 days |
| studio-shared | Credentials shared between Studio and a contractor for a specific scope. | Studio + named contractor | at handoff |
| client-<short> | Per-client production credentials. One vault per active client, never shared across clients. | Studio engagement team only | at handoff or 180d |
| contracts | Signed PDFs, MSA/SOW originals, e-signature certificates. | Studio Lead only | never |
| recovery | FileVault keys, hardware-key backup codes, Workspace super-admin emergency access. | Studio Lead only | 365 days (review) |
| engineering | Production API keys (Anthropic, OpenAI, etc.), deploy tokens, signing keys. | Studio engineering only | 180 days |
- Sign up for 1Password Business at
1password.com/business. One seat, $20/mo. - Create the primary identity using
abe@umbra.group. - Generate a 32-character master password. Print it. The Emergency Kit (master password + Secret Key) goes in a fireproof safe before any data lands in the vault.
- Configure SSO via Workspace OIDC (now or after Workspace is fully hardened).
- Create the six vaults named per the table above (substitute
client-templateas a placeholder for the per-client vault pattern).
- Install the desktop app and browser extension on the workstation.
- Install the 1Password CLI:
brew install 1password-cli. Verify withop signin. - Configure SSH agent: enable in 1Password → Developer. Generate a per-Studio SSH key inside the
engineeringvault. - Configure shell helper for secret injection in scripts:
op run -- <cmd>.
- For each vault, set the access policy per the table above.
- Disable the default Personal and Shared vaults — they bypass the ACL discipline.
- Configure travel mode toggle for the engineering vault (excludes it from device sync when traveling internationally).
Gate
- Six vaults visible, each with the correct ACL.
- Emergency Kit printed, signed, dated, in the safe.
op signinworks from a fresh shell using the YubiKey.
YubiKey enrollment & recovery.
Two keys, always. The primary lives on the keychain; the backup lives in the safe. Every service that supports WebAuthn / FIDO2 enrolls both keys at the same time — not one and "we'll add the backup later." The cost of enrolling later is one full re-enrollment per service, the cost of enrolling now is one minute per service.
- Two YubiKey 5C NFC keys, ordered direct from yubico.com.
- Label one P (primary), one B (backup). Use a small adhesive label, not a marker.
- Set a PIN on each key via Yubico Authenticator (8–15 chars). Same PIN on both is acceptable; the keys themselves are the second factor.
- Workspace → My Account → Security → 2-Step Verification → Add Security Key.
- Tap the primary key. Name it YK-P.
- Repeat with the backup key. Name it YK-B.
- Disable all other 2FA methods: SMS, Authenticator app, backup codes (or store backup codes in
recoveryvault and disable in UI).
- 1Password → My Profile → Manage Two-Factor Authentication → Security Key.
- Enroll both keys.
- Verify by signing out and back in using each key.
- GitHub → Settings → Password & Authentication → Security Keys. Enroll both.
- Anthropic Console: enroll both as 2FA.
- Mercury, Wave, Dropbox Sign, Tailscale: enroll wherever supported.
- For services that don't support WebAuthn (rare in this stack), use TOTP stored in 1Password's built-in TOTP — never SMS.
Tailscale mesh & ACLs.
Tailscale provides the encrypted mesh between workstation, NAS, and any future server or contractor device. Free tier covers the Studio at one admin / personal usage scale; upgrade to Personal Pro or Business when contractors join.
- Sign up at
tailscale.comusing Workspace SSO (Google identity provider). - Install the Tailscale macOS app on the MBP. Sign in.
- Install Tailscale on the Synology NAS via the Package Center.
- Confirm both devices appear on the tailnet within 2 minutes.
Edit the tailnet policy file (Admin console → Access Controls). Default-deny; explicit allow for what's actually needed.
{
"tagOwners": {
"tag:studio-workstation": ["abe@umbra.group"],
"tag:studio-nas": ["abe@umbra.group"],
"tag:contractor": ["abe@umbra.group"]
},
"acls": [
// Workstation can reach NAS for Time Machine + file shares
{ "action": "accept",
"src": ["tag:studio-workstation"],
"dst": ["tag:studio-nas:445,548,5000-5001"] },
// Contractors get only what's named per engagement
{ "action": "accept",
"src": ["tag:contractor"],
"dst": ["tag:studio-workstation:0"] } // none by default
],
"ssh": [
{ "action": "check",
"src": ["autogroup:member"],
"dst": ["tag:studio-workstation"],
"users": ["autogroup:nonroot"] }
]
}
- Tag the workstation as
tag:studio-workstation. - Tag the NAS as
tag:studio-nas. - Verify Time Machine still backs up over the mesh, and that any other ports are blocked (test from a third device if available).
GitHub organization.
The GitHub org is the engineering surface. Every commit signed, every contributor 2FA-enforced, every secret kept out of the tree.
- Create the
umbra-studioorganization. Subscribe to Team plan ($4/seat/mo). - In Org → Settings → Authentication: require 2FA org-wide. Enable IP allow lists if and when team grows.
- In Org → Settings → Member privileges: default repository permission = Read. No member can create public repos by default.
- In 1Password, generate an SSH commit-signing key in the
engineeringvault. - Add the public key to GitHub → Settings → SSH and GPG keys, marked as a signing key.
- Configure git locally:
git config --global gpg.format ssh,git config --global commit.gpgsign true. - Test by making a signed commit and verifying the green Verified badge appears on GitHub.
- Create the four template repos:
studio-shared,patterns,contracts,infra. - Create
client-template. Mark as Template repository in settings. - For each repo: enable Dependabot, enable secret scanning, require signed commits on the default branch.
- Add the standard
.gitignore,SECURITY.md, andCODEOWNERSfiles.
Secrets policy.
The rules that govern every credential stored in the Studio. Enforced manually by the Studio Lead and audited monthly.
Naming convention
<system>-<env>-<purpose>
e.g. anthropic-prod-evals
mercury-prod-debit-saas
github-prod-actions-deploy
Storage rules
- Never in Git. If a key is committed, treat as compromised — revoke and re-issue, even if the commit is reverted.
- Never in Slack. If a credential is shared in Slack, immediately re-rotate. Then delete the message and remind whoever sent it.
- Never in DM. Same logic.
- Always in 1Password. Pull at runtime via
opCLI or the 1Password SSH agent — not by copy-paste into.envfiles (the file becomes the new attack surface). - Per-environment isolation. Dev / eval / prod always separate keys. Compromising a dev key never touches prod.
Rotation cadence
| Type | Cadence | Trigger |
|---|---|---|
| Studio internal SaaS passwords | 90 days | Calendar reminder |
| Production API keys (Anthropic, etc.) | 180 days | Calendar reminder |
| Per-client production credentials | at handoff | Engagement close |
| Per-engagement scoped tokens | at handoff | Engagement close |
| Master password & YubiKey backup | 365 days (review only) | Annual policy review |
| Recovery codes / FileVault keys | never (re-print on key change) | Hardware change |
Adding & revoking seats.
The Studio scales by adding contractors and senior engineers. The 1-hour rule from USO-ST-06 §09 governs both directions: add or remove access in under an hour, end-to-end.
Adding a seat (Day 0 for a new person)
- Workspace: create the user, assign to relevant Groups, enforce 2FA, mail YubiKey to their address before first login.
- 1Password: invite via SSO. Grant access to the specific vaults their role requires — never all.
- Slack: invite, add to relevant channels.
- Notion: invite via SSO, set page-level permissions per the seven-page structure.
- Linear: invite, assign to the relevant team.
- GitHub: invite to the org, set role (typically Member, never Owner). Assign to teams that map to repos they need.
- Tailscale: invite via SSO, tag their device as
tag:contractor(least privilege). - Anthropic Console: invite, scope key access via Workspace.
- Drive: shared drives inherit Workspace identity; verify access works.
- Welcome email with the Studio handbook link, the 1Password Emergency Kit policy, and the 1-hour rule expectation.
Revoking a seat (Day-Last for an exiting person)
- Workspace: suspend the user. This kills SSO across all federated apps within ~10 minutes.
- 1Password: revoke their account. Confirm vault removal.
- Slack, Notion, Linear, GitHub, Tailscale, Anthropic: explicit removal — do not rely on SSO suspension alone for sensitive surfaces. Audit the membership lists.
- Active client vaults: rotate any credentials they had access to in the next 24 hours.
- YubiKey: physically retrieve, or revoke remotely if not retrievable, treat as Studio-SEV-2.
- Mercury debit cards issued to them: cancel.
- Email forwards: redirect their alias to
abe@for 90 days. - Document the revocation in the Studio decision log with date, person, scope, and verification evidence.
Identity checklist.
Weekly · 10 min
- Audit Workspace login activity for any unfamiliar IPs or geographies.
- Confirm the YubiKey backup is still in the safe.
- Skim 1Password Watchtower for any flagged credentials.
Monthly · 30 min
- Audit GitHub org members; remove anyone who shouldn't be there.
- Audit 1Password vault membership against the access table in §04.
- Audit Tailscale device list; revoke any stale device.
- Skim the secrets-rotation calendar and rotate anything coming due.
Quarterly · 60 min
- Rotate Studio-internal SaaS passwords (90-day cadence).
- Rotate production API keys (180-day cadence).
- Test recovery: pretend the primary YubiKey is lost; sign in via backup; restore primary status. Re-print the Emergency Kit if anything changed.
- Review the secrets policy in §08; update if a tool changed.
Annual · half-day
- Full identity stack walkthrough: re-read this runbook end-to-end, fix anything stale.
- Review and re-print the Emergency Kit.
- Order a fresh backup YubiKey to replace any 3+ year old key.
- Review the seat-add and seat-revoke checklists for any tools added in the past year.