Work through this before production use. Items are ordered by how much they matter.
The Shellius host itself
Shellius can sign a certificate for any bootstrapped host, so it is the most sensitive machine you run.
- [ ] Put it on its own host, not alongside unrelated services.
- [ ] Terminate TLS in front of it. Never serve it over plain HTTP.
- [ ] Restrict who can reach the host over SSH, and do not manage it with Shellius itself — that is a circular dependency during an outage.
- [ ] Keep the Docker daemon and host OS patched. Docker socket access is root.
Secrets
- [ ] Every secret in
.env.prodis freshly generated, not copied from the example file. - [ ]
.env.prodis mode0600and owned by the account running the stack. - [ ]
SERVER_ENCRYPTION_KEYis backed up off the machine and you have verified the backup is readable. - [ ] Secrets are not in your shell history, a ticket, or a chat thread.
- [ ] You know how to rotate
JWT_SECRET(it signs everyone out) if you need to.
Accounts and roles
- [ ] The seeded admin password was changed at first sign-in.
- [ ] There is more than one super admin, so you are not locked out — but not many more.
- [ ] Built-in roles were reviewed rather than assumed.
adminandsuper_adminholdaccess.prod_bypassby default. - [ ]
prodBypassEnabledis off unless you have a specific reason. With it off, nobody skips production approval, including super admins. - [ ] SSO is configured if you have an identity provider, so offboarding a person actually removes their access.
Policies
- [ ] A deny policy covering
prodexists and is written before the allow rules. - [ ]
autoApproveis used only fordemo,dev, andstaging. - [ ] Principals are specific accounts, not
root. - [ ]
maxSessionDurationis hours, not days. - [ ]
allowKeyDownloadis off unless a workflow genuinely needs it. - [ ] Approver routing is set to a group or named users, not left to fall back to the requester's manager by accident.
Target hosts
- [ ] Static keys in
authorized_keyswere removed after certificate access was confirmed working. Leaving them means you still have the original problem. - [ ] Hosts are tagged with the environment they actually are. A production host tagged
devbypasses approval. - [ ]
PermitRootLoginis off, and root is not in any policy's principals. - [ ] You have a break-glass route into each host that does not depend on Shellius being up —
check-principalsfails closed.
Operations
- [ ] Database backups run on a schedule and are shipped off the machine.
- [ ] You have restored a backup into a scratch deployment and confirmed the CA public key matched.
- [ ] The Prometheus endpoint is behind
METRICS_TOKENand not publicly exposed. - [ ] SMTP works — without it, nobody is notified that a production request is waiting.
- [ ] Someone reviews the audit log on a schedule. An unread log is not a control.
Understand the trade-offs
Read the threat model before you decide this is enough. In particular: a compromised Shellius host means a compromised fleet, and approval stops accidents rather than a determined insider.