Hardening Checklist
Set a Write Token
Enable Sandbox Security Defaults
Restrict Egress
Enable gVisor (Optional)
runsc installed on the Docker host.Back Up the Master Key
MASTER_KEY protects all encrypted secrets. Store it in a password manager or secrets vault — if lost, all credentials become unrecoverable.Write Guard
All mutating API requests are protected by a write guard middleware:GET, HEAD, OPTIONS) are exempt from write guard checks and always allowed from any address.
Webhook routes (/webhooks/*) bypass IP/token checks — they use their own HMAC signature verification.
Credential Encryption
Risoluto encrypts all stored credentials using AES-256-GCM with a key derived fromMASTER_KEY via SHA-256:
DbSecretsStore) encrypts each secret individually with its own IV and auth tag, stored as separate rows. Key names are plaintext; values are encrypted.
Network Isolation
Network Isolation
risoluto-internal Docker bridge network by default. The data plane (when using control/data plane split) is not exposed to the host — it only listens on this private network.For additional isolation, use a custom Docker network:Capability Dropping
Capability Dropping
codex.sandbox.security.dropCapabilities is true (default), worker containers start with --cap-drop=ALL. Combined with noNewPrivileges: true, this ensures containers cannot escalate privileges.The resulting docker run flags:gVisor Runtime
gVisor Runtime
runsc) provides a user-space kernel that intercepts all syscalls from the container, adding a strong isolation boundary between the agent and the host kernel.--runtime=runsc to Docker. Install gVisor first:Egress Allowlists
Egress Allowlists
egressAllowlist restricts which domains worker containers can reach. When the list is non-empty, only listed domains are reachable:Seccomp Profiles
Seccomp Profiles
--security-opt=seccomp=/etc/docker/seccomp-risoluto.json to Docker.Sandbox Policy Summary
Rate Limiting
All/api/* and /metrics endpoints are rate-limited to 300 requests per 60 seconds per client. Webhook endpoints (/webhooks/linear) have a separate limit of 600 requests per 60 seconds. Exceeding the limit returns HTTP 429 Too Many Requests.