How Holon expects to be secured when self-hosted. This is not a managed SaaS security guarantee — you operate the SI. See ADR 026 and docs/ops/deploy.md.
If you believe you found a vulnerability in this repository, open a private security advisory on the GitHub repo (or email the maintainers listed in the repo metadata). Do not file a public issue with exploit details.
| Boundary | Expectation |
|---|---|
| Browser → Experience / Identity | TLS at your Ingress; session cookie HttpOnly; CORS via explicit HOLON_CORS_ORIGINS |
| Service → service | Cluster network + JWT (HS256 or opt-in RS256 via HOLON_JWT_ALG / key maps — make gen-jwt-rsa; HOLON_JWT_REQUIRE_ASYMMETRIC in prod when required). SA/agent minting gated by HOLON_MINTABLE_PRINCIPAL_URNS; user minting Identity-only (allow_user + HOLON_ALLOW_USER_JWT_MINT) |
| AuthZ | SpiceDB ReBAC + OPA ABAC; decisions audited on logger holon.audit and durable audit_event (per-service query APIs; workspace approve except Automation SA JWT) |
| Secrets | HOLON_SECRET_BACKEND (env / kubernetes / vault / aws); JWT key values may be vault:… / env:… refs; prefer secret_ref on connectors |
| Data plane | Your Postgres, S3/Iceberg, Kafka, OpenSearch, SpiceDB datastore |
When HOLON_ENV=production (or prod), every service calls
assert_production_posture at lifespan start and refuses to boot if the
flags below are wrong. JWT minting also hard-fails without the mint
allowlist / Identity user-mint flag.
-
HOLON_ENV=production -
HOLON_ALLOW_DEV_LOGIN=false - Experience
POST /api/tokenstays off whenHOLON_ALLOW_DEV_LOGIN=false -
HOLON_INTELLIGENCE_ENABLED=falseuntil the agent package is opted in -
HOLON_ALLOW_JOBLIB_MODELSunset/false;HOLON_ALLOW_TOOL_PLUGIN_REGISTERunset/false -
HOLON_JWT_ALG=RS256+HOLON_JWT_PRIVATE_KEYS/HOLON_JWT_PUBLIC_KEYS(make gen-jwt-rsa);HOLON_JWT_REQUIRE_ASYMMETRIC=true - Intelligence Deployment
runtimeClassName= gVisor (or equivalent) when Intelligence is used - OIDC enabled; no product demo / fixture scripts in prod
-
HOLON_BOOTSTRAP_ADMIN_SECRETset for empty-instance / orphan repair -
HOLON_BOOTSTRAP_ADMIN_RESET_SECRETunset except during intentional break-glass -
HOLON_METRICS_TOKENset; scrape only from a trusted network / NetworkPolicy - Load
deploy/observability/recording rules + alerts (or Helmobservability.prometheusRule) -
HOLON_CORS_ORIGINS= real SPA origin(s) only (nolocalhost/127.0.0.1) -
HOLON_MINTABLE_PRINCIPAL_URNSset on every service (comma-separated full URNs and/or local-name suffixes; empty string OK if that service never mints SAs) -
HOLON_ALLOW_USER_JWT_MINT=trueonly on Identity; unset/false everywhere else -
HOLON_SERVING_STORE_REQUIRE_MATERIALIZED=trueon Knowledge once materialization is the read path - Connectivity / Intelligence HTTP mutations gated by SpiceDB workspace
read/write - Automation mint allowlist includes
ingest-bot(chain-trigger hops) - NetworkPolicy enabled in prod; pin
dataPlaneCidrs/intelligence.llmEgressCidrswhen known - Image tag pinned (never
latest); SBOM from publish workflow reviewed - SpiceDB schema =
docker/spicedb/schema.zed(Helm copy checked viamake check-spicedb-schema) - OpenSearch with security plugin (compose disables it for local only)
- Backups owned and drilled — docs/ops/backup-restore.md
- Ingress fronts Experience + Identity only; Knowledge/Connectivity stay internal unless intentionally exposed
Local docker-compose.yml is a dev stack: OpenSearch
discovery.type=single-node and plugins.security.disabled=true,
HOLON_ALLOW_DEV_LOGIN=true, optional empty OTLP, and HOLON_ENV left
empty so production posture checks are a no-op. Do not treat compose
defaults as a production posture.
- Example connector plugins under
services/connectivity/app/plugins/are library code only — register viaPOST /pluginswhen you need them. Filiales use/sources/ plugins. See docs/ops/seed-data.md. - Intelligence remains experimental: even with the flag off, do not enable
HOLON_ALLOW_JOBLIB_MODELSorHOLON_ALLOW_TOOL_PLUGIN_REGISTERin production (posture refuses both). Prefer gVisor (runtimeClassName) for the Intelligence Deployment; true process sandbox for plugins is still out of scope. - No soak/chaos suite (
make smoke-loadis a light probe only). Capacity validation remains an operator gate. - Backup/DR is documented, not automated — you own RPO/RTO.