Repository navigation
v0.5.0
First public release of the source code on GitHub.
Added
REDIS_PASSWORD_FILEfor the API, worker and gateway, as an alternative toREDIS_PASSWORD. The example compose file now passes the Redis password as a secret (created byinit.sh), so it no longer appears in any container's environment.OIDC_ALLOW_UNVERIFIED_SIGNUPfor providers that verify email addresses but do not send theemail_verifiedclaim (such as Entra ID). It only allows sign-up, never linking to an existing local account.- OCI labels (title, description, license, source and creation date) on the web, API and worker images.
SECURITY.mdwith the vulnerability reporting policy, anddocs/SECURITY-NOTES.mdwith the authorization model and a deployment checklist.CONTRIBUTING.mdand an individual Contributor License Agreement (based on the Apache ICLA v2.2).
Changed
- The project name is written as InfraWard in every text: web, API, worker, enrollment script and documentation. This includes the TOTP issuer; authenticators that are already set up keep their label. Lowercase identifiers (
infraward, paths and keys) are unchanged. - The API docs (
/docsand/openapi.json) are off by default in production; setDOCS_PUBLIC=trueto enable them. PUBLIC_URLmust use HTTPS in production, except for loopback addresses.
Fixed
- The web terminal no longer loses the output of commands that finish immediately.
Security
- Patched vulnerable dependencies (including fastify, zod, fast-uri, body-parser, multer, undici and vite) and hardened the pnpm supply chain (minimum release age, no trust downgrades, no exotic sub-dependencies).
- Login is also rate-limited per account, not only per IP (
LOGIN_ACCOUNT_THROTTLE_*, with counters in Redis viaTHROTTLE_STORAGE). Only failures count, a successful login resets the counter, and networks the account has recently signed in from are not blocked, so a single IP cannot lock out another account. - Resetting or changing a password now also revokes the user's API tokens.
- Automatic OIDC sign-up requires a verified email address, so nobody can create an account with someone else's email.
- The enrollment script refuses a symlinked (or foreign-owned)
~/.sshorauthorized_keysin the inventory user's home and writes them as that user, so it can no longer be tricked into overwriting root's keys. - The OpenBao client never follows HTTP redirects, so AppRole credentials and tokens cannot be forwarded to another host.
- Scan exclusion patterns are matched without regular expressions, which removes a ReDoS on patterns with many
*. - The web terminal does not accept input until the API has recorded the session opening.
- The enrollment token is no longer written to the nginx access log.
- nginx sends X-Frame-Options, CSP
frame-ancestors, HSTS,nosniffand Referrer-Policy on every location, and the production build no longer needsscript-src 'unsafe-inline'. - Container images: updated base images (nginx 1.31 on Alpine 3.24), npm and corepack removed from the API image, Trivy 0.76.1, and every image is scanned for fixable critical vulnerabilities before it is pushed. The worker runs on Ubuntu 26.04 for the OpenSSH client fix (CVE-2026-60002).
- Example compose file: Redis password, an internal network for PostgreSQL, Redis and OpenBao,
cap_drop: ALL,no-new-privileges, read-only root filesystems and non-root users.