# Security policy OpenBooks handles financial and identity data. Please report suspected vulnerabilities privately and give the maintainers a reasonable opportunity to investigate before public disclosure. ## Supported versions OpenBooks is currently in alpha. Security fixes are made on the latest published release and the `main` branch. | Version | Supported | | --- | --- | | Latest `0.1.x` alpha release | Yes | | Older builds and untagged snapshots | No | Alpha status matters: OpenBooks has not yet completed an independent security audit or penetration test and does not claim a compliance certification. Operators should perform their own risk assessment before using it for production financial data. ## Report a vulnerability Use GitHub's private vulnerability reporting: Do not open a public issue for a suspected vulnerability. Include: - affected version or commit; - deployment configuration relevant to the issue; - reproduction steps or a proof of concept; - expected and observed behavior; - likely impact and affected data; - whether the issue is already being exploited; and - a safe way to contact you. The maintainers aim to acknowledge a complete report within three business days. Investigation and remediation time depend on severity and complexity. A fix may be released before full technical details are published. OpenBooks does not currently operate a paid bug-bounty program. ## Security architecture The repository implements defense-in-depth controls including: - forced PostgreSQL row-level security for organization-owned tables; - an isolated migration owner used only by the one-shot bootstrap, with web and worker processes restricted to a `NOSUPERUSER NOBYPASSRLS` runtime role; - fail-closed runtime role checks that refuse production startup when the login, or a role it can assume, can defeat tenant isolation; - server-side RBAC and permission checks; - scoped, hashed API keys; - asynchronous, versioned scrypt password hashing with legacy compatibility and successful-login rehash, bounded to four active jobs and 32 queued jobs per web process, plus signed, server-side revocable session cookies; - PostgreSQL-backed login throttling, temporary lockout, and authentication events that store keyed email/network hashes rather than raw identifiers; - TOTP MFA with password-reauthenticated, session-bound, expiring enrollment, anti-replay steps, encrypted secrets, and salted one-time recovery-code hashes; - OIDC authorization-code SSO with state, nonce, PKCE, discovery issuer checks, asymmetric JWKS verification, and verified-email existing-user linking; - request-scoped nonce Content Security Policy in production, clickjacking and MIME-sniffing defenses, restrictive browser permissions, referrer controls, cross-origin opener/resource controls, and HSTS for TLS deployments; - encryption of stored connection secrets with `OPENBOOKS_DATA_KEY`; - database constraints for balanced postings and closed periods; - a SELECT-only database role for the SQL workbench; - sandboxed JavaScript execution; - rate limits and event/audit records on sensitive surfaces; and - idempotent deployment migrations under an advisory lock. These controls reduce risk; they are not a warranty that the application is free of vulnerabilities. ## Operator responsibilities Production operators must: - replace every example credential and keep `.env` files out of version control; - terminate TLS at a trusted reverse proxy; - restrict database, Redis, and object-storage ports to private networks; - generate `SESSION_SECRET` from at least 32 random bytes and rotate it as a coordinated all-replica cutover; - protect `OPENBOOKS_DATA_KEY` and rotate it only with a decrypt-and-re-encrypt migration for existing encrypted records; - protect and rotate `OPENBOOKS_INTERNAL_TOKEN`, database credentials, and provider secrets; - back up PostgreSQL, object storage, and the deployment configuration; - test restoration and upgrades on isolated infrastructure; - restrict administrative access; - monitor health, authentication, audit, worker, database, and backup events; - keep the host, container runtime, images, and dependencies patched; and - verify legal, tax, privacy, retention, and residency requirements for their jurisdiction. The included Compose stack is designed for evaluation and a single-host deployment. High-availability, regulated, or internet-exposed installations need an operator-designed production architecture. When enabling `OPENBOOKS_TRUST_PROXY`, the proxy must remove client-supplied `X-Forwarded-For`, `X-Real-IP`, and `CF-Connecting-IP` headers before setting trusted values. Otherwise leave it disabled; identity lockout remains active. An always-on, high deployment-wide password-attempt ceiling skips unknown-user KDF work after saturation while remaining fail-open for real accounts, so it cannot lock out the whole deployment. It is deliberately coarse and is not a replacement for an edge/WAF rate policy on internet-exposed deployments. OIDC deployments must use HTTPS, protect the optional client secret, register only the documented callback URI, and configure the provider to return a verified email claim. OIDC does not create or reactivate users. `SESSION_SECRET` rotation invalidates all browser sessions and in-progress OIDC flows and resets the privacy-hash namespace used by the short-lived login limiter; obsolete state is automatically pruned. Versioned salted MFA recovery hashes are independent of that key. Coordinate rotation across every replica. ## Disclosure Please avoid accessing data that is not yours, disrupting a service, retaining sensitive data, or using social engineering. Stop testing and report the issue if you encounter real user or financial information.