TC 03Vaethra reference
Access control
Multi-factor authentication, least privilege, production access, joiners and leavers, credential handling and service accounts.
01Multi-factor authentication
Required on every account, with no exception process
- Every administrative account requires MFA — Cloudflare, Supabase, GitHub, the domain registrar and the mail provider. No account with production reach can be entered with a password alone.
- Hardware-backed factors are used — WebAuthn or a platform authenticator. SMS is not used as a factor anywhere.
- Recovery codes are held offline in an encrypted store, separate from the password manager.
- There is no MFA exception process.
02Least privilege
Four principals, and what each can do
| Principal | Can | Cannot |
|---|---|---|
| Anonymous reader (Terminal, Atropos) |
Read the public record through the applications | Execute any database function, reach any administrative route, or obtain a licence-restricted record |
| API key holder | Read the record within the scope and rate limit of the key | Write anything, reach administrative routes, or obtain records excluded by the licence filter |
| The application | Call the fixed allowlist of database operations through the secret-gated function | Hold the privileged database role, or execute an operation not on the allowlist |
| Engineering owner | Deploy, run migrations, and read and change production configuration and data | Recover a stored secret or an issued API key in plaintext — neither is retrievable by anyone |
The database enforces its own half rather than relying on the application: row-level security denies by default on all 50 tables, and the public role has execute permission on none of the 77 functions. Both measured 7 September 2026.
03Production access
One holder, with grant dates available on request
- Production access is held by the engineering owner and by nobody else. The list is supplied under NDA with grant dates.
- Administrative endpoints are gated twice — an identity-aware proxy at the edge, then a bearer token inside the application. Compromising one does not grant access.
- There is no standing shell access. No SSH, no bastion, no jump host, because there is no server. Administrative action is an authenticated HTTP call or a platform console operation, both logged by the platform.
- No shared accounts. Every human principal is individually identified; automation uses service credentials not attached to a person.
- Production credentials are not present on a development machine by default. Local development runs against a local store with synthetic data.
04Access reviews
Quarterly, and on any event that changes who should have what
- Quarterly, every account on every platform is reviewed against the question of whether that principal still needs that level of access.
- Immediately after a departure, a role change, or an incident.
- API keys are reviewed alongside the account they belong to. Keys with no request in 90 days are flagged to their owner and revoked if unclaimed.
- Each review is recorded with the date, the reviewer and what changed. These records form part of the evidence pack.
05Joiners and leavers
Both directions, with stated deadlines
Onboarding
- Confidentiality undertaking signed before any access is granted.
- Background check where the role carries production access, to the extent applicable employment law permits.
- Individual accounts created with MFA enforced from first login.
- Access granted at the minimum level for the role. Production access is not granted by default and is not granted during onboarding.
- Security responsibilities set out in the engagement terms.
Offboarding
- Within one business day of a planned departure, and immediately on an involuntary one, every account is disabled.
- Any shared credential the person could have seen is rotated, not merely revoked from them.
- Device access is removed and company data removed from personal devices.
- A written record is kept of what was revoked and when.
06Credential management
Where each kind of secret is held
| Credential | Stored | Recoverable |
|---|---|---|
| Application secrets — provider keys, shared secrets | Platform secret store, encrypted, injected at runtime | No. A lost secret is rotated rather than recovered. |
| Customer API keys | SHA-256 digest in the database | No. Shown once at creation. |
| Privileged database role | Inside the database provider's environment | No. It does not cross that boundary. |
| Human account passwords | A password manager with MFA on the manager itself | By the holder only |
| MFA recovery codes | Encrypted offline store | By the holder only |
- No secret is present in the repository, in a configuration file, or in build output. Commits are scanned for credential patterns before they land.
- Rotation is annual as a minimum, and immediate on any suspicion of exposure, on a departure, or on a provider's advice.
- Customer key revocation clears the edge cache immediately, so a revoked key stops working on the next request.
07Service accounts
Three, each scoped to a single function
| Account | Scope |
|---|---|
| Application to database | A shared secret to one database-side function, which will run only the operations on a fixed allowlist. Not a database role. |
| Deployment | A scoped platform token that can deploy the application and the site and nothing else. It cannot read data. |
| Provider API keys | Read-only credentials issued by upstream data providers, each scoped to that provider's own data |
None is attached to a person, so none breaks when a person leaves. All three are in the rotation schedule and each is separately revocable.