Security Checklist¶
The short version. Deployment specifics are in the Production Checklist.
Credentials¶
- Root credentials are not a development default from any Compose file
-
RECORD_STORE_ROOT_S3_ENABLED=falseonce every application has a service account - One service account per application, never one shared
- Every service account has a policy scoped to what it actually needs
- No service account holds
bucket:*unless it genuinely administers everything - Credential rotation is scheduled, and the old credential is disabled at the end of it
Keys and tokens¶
-
RECORD_STORE_CREDENTIAL_MASTER_KEYis set and 32+ characters - The master key is backed up outside the data directory
- The three management role tokens are set, distinct, and 32+ characters
-
RECORD_STORE_METRICS_SCRAPE_TOKENis set and differs from every role token - Operators hold the narrowest role that lets them do their job
- No secret is in a repository, an image layer, or a shell history
The master key cannot be rotated. It is the one item here with no recovery path.
Network¶
- 7601 is not reachable from the internet
- 7600 and 7602 are behind TLS
- The proxy preserves the
Hostheader - The proxy sets
X-Forwarded-Forand overwrites any client-supplied value -
RECORD_STORE_CONSOLE_SECURE_COOKIES=true
Verify rather than assume:
Data¶
-
storage.encryption_enableddecided deliberately - Object keys do not themselves contain sensitive identifiers — they are not encrypted
- Versioning enabled where accidental overwrite is a real risk
- Backups are encrypted or stored somewhere access-controlled
- A restore has actually been tested
Sharing¶
- Shares and embeds are disabled if the deployment does not use them
-
sharing.maximum_lifetime_daysset to something defensible -
sharing.require_expirationon - Embed origins restricted where the consuming site is known
- Both base URLs set to the correct public hosts
- Active capabilities reviewed periodically
Webhooks¶
-
webhooks.allow_httpisfalse -
webhooks.allow_private_networksisfalse - Receivers verify the
x-record-store-signatureHMAC before parsing - Receivers are idempotent on
x-record-store-event-id
Both flags default to off because a webhook URL is an administrator-supplied, server-side fetch. Turning them on makes webhook creation a privileged operation.
Monitoring¶
-
/metricsis scraped with its dedicated token - Alerts on error rate and disk space
- Audit denials are reviewed or alerted on
- Logs are collected and searchable
Ongoing¶
- Dependencies and the base image are updated on a schedule
- Release notes are read before upgrading
- Someone reviews audit denials
- Access is removed when people leave
- The runbook records where the master key is kept