Release gate
- Deploy a signed, pinned release; never use
latest. - Run
./casebender preflight. - Publish only Nginx ports 80 and 443.
- Use trusted TLS and redirect HTTP to HTTPS.
- Keep PostgreSQL, Redis, OpenSearch, API, ingestion, and processors on internal networks. Permit web and worker to reach only the approved external object-storage and malware-scanner endpoints.
- Store
.env, encryption keys, and license material in an approved secret store with least-privilege access. - Require the same
AUDIT_INTEGRITY_SECRETon everyweb,api, andworkerprocess that writes chained audit records. - Preserve
AUDIT_INTEGRITY_SECRETwith the database recovery set across upgrades and restores. Rotating or losing it prevents verification of the existing audit chain. - Complete one-time activation and MFA enrollment.
- Configure exact-host HTTPS egress allowlists only where needed.
- Centralize redacted security and audit logs.
- Verify encrypted backups and a tested restore.
- Apply the Storage Security Baseline; production bundles do not embed MinIO.
Before promotion
pnpm security:compare <current-findings.json> to block new critical or high
findings and reconcile every baseline fingerprint.
The Runtime Security workflow must also pass on the release commit. It starts
the production images and fails when:
- a reachable Server Action is missing from
scripts/security/server-action-allowlist.json, or authenticates after it reads data; - an anonymous caller receives data from any non-public Server Action;
- the ZAP baseline or OpenAPI scan reports a failing alert.
Independent rescan
A finding is not closed by the engineer who fixed it. After remediation is merged, a different reviewer rescans the exact commit and records the result:scripts/security/codex-findings-map.json becomes
verified-closed, or reopened when the rescan reports the same finding ID or
fingerprint again. The command exits non-zero, and pnpm security:policy fails, while any
finding is reopened. The scanner must differ from the remediation author.