Security Hardening
Ithiltir security boundaries are the admin plane, node plane, and same-origin browser access.
Admin Password
Set the admin password through monitor_dash_pwd. Do not store it in config.local.yaml.
Rotate by changing the environment variable and restarting Dash.
JWT and Cookies
Configure stable secrets before production use:
security:
jwt_secret: "<random>"
cookie_hash_key: "<random>"
cookie_block_key: "<random>"
Changing these values invalidates existing sessions.
Node Secrets
Each node should use a distinct secret. Rotate from Dash admin console, then update the local node config:
/var/lib/ithiltir-node/current/ithiltir-node report update <id> '<new-secret>'
sudo systemctl restart ithiltir-node.service
Public URL and Reverse Proxy
Production deployments should expose Dash through an HTTPS domain at the root path. Dash does not support URL subpaths such as /dash.
The reverse proxy should forward:
/api/theme/deploy/
Preserve Host, X-Forwarded-For, and X-Forwarded-Proto. Configure trusted proxy CIDRs in Dash config.
Database
PostgreSQL contains metrics history, node metadata, settings, alert rules, and notification outbox. Back up PostgreSQL before upgrades and migrations.
TimescaleDB chunks are maintained by Dash migrations and retention policies.
Config File Permissions
Dash config contains database passwords and signing keys. Release install keeps sensitive files restricted.
Linux node service runs under the ithiltir user and restricts writable paths to /var/lib/ithiltir-node.
Webhook Signing
When a webhook channel has secret, Dash sends:
X-Webhook-Signature: sha256=<hex>
The signature is HMAC-SHA256 over the raw request body.
Unsupported Production Patterns
- Dash under a URL subpath.
- Multiple Dash instances writing to the same database and Redis.
- Public exposure of the backend port without HTTPS reverse proxy.
- Shared node secret across multiple hosts.