Prerequisites
-
The Hermetic desktop app, and the
hermeticCLI its Install Command Line Tool… menu item puts on your PATH.README.mdhas the install, the one-time quarantine clearance for the unsigned build, and how updates arrive; this runbook assumes both are already in place. A source checkout needs Bun per.bun-versioninstead. -
An AWS profile in
~/.aws/configwith credentials for the account you want to target — SSO, assume-role, or static all work; hermetic reads the profile, neverAWS_PROFILE/AWS_ACCESS_KEY_IDdirectly (it warns if either is set, sinceaws.client()ignores them). -
One line in your tailnet policy file, pasted by hand before you create the OAuth client, because the client form only offers tags that already have an owner:
"tagOwners": { "tag:hermetic": ["autogroup:admin"] }That is the only policy edit you make. hermetic writes its own
sshandaclsentries itself once the client exists (§5.2), between// hermetic:managedmarkers, leaving every other byte of the file exactly as you wrote it. -
A Tailscale OAuth client, created by hand in the Tailscale admin console, carrying three scopes —
auth_keyswrite (mints each agent’s join key) anddevices:coreread + write (letsdoctorcheck device drift and letsrecreate/destroydelete an agent’s stale device), both restricted totag:hermetic, pluspolicy_file(lets hermetic keep the entries above current). Tailscale will not restrictpolicy_fileto a tag — it is tailnet-wide — and attachesdevices:posture_attributesanddevices:core:readto it. There is no API to create this,initcannot do it for you. A client with fewer scopes still works: with onlyauth_keysagents come up but stale devices accumulate anddoctorreports device drift as unchecked; withoutpolicy_fileyou paste thesshandaclsentries yourself (hermetic policyprints them and says what is missing). Widening it is a new client (Tailscale cannot edit an existing one’s scopes) plus a rotation — see below. -
HTTPS Certificates enabled for the tailnet (admin console → DNS; MagicDNS must be on). Every agent serves its dashboard and noVNC at
https://<fleet>-<name>.<tailnet>.ts.net(the cloud name, §6.1);init --createrefuses andhermetic doctorreports when it is off. The only cost: agent hostnames appear in public Certificate Transparency logs. -
An agent’s dashboard asks for no login. Hermes runs in its unauthenticated local mode behind a loopback reverse proxy on the box, so the tailnet ACL is the perimeter: whoever your policy file lets reach
tag:hermeticon 443 can drive every agent. Keep that ACL tight — there is no second gate, and Hermes’s audit log records no per-user identity (§6.4). That is a decision, not an oversight: Hermes does offer a password-gated posture, and hermetic declines it rather than issue and rotate a password per agent for operators already inside the tailnet. -
Enough IAM permission on the profile to create a CloudFormation stack, DynamoDB tables, an S3 bucket, and EC2/SSM resources — the exact policy is the foundation stack’s own template (unverified — never applied).