Anjo Harness is meant to be a trustable harness for real businesses. Security is a first-class feature, not an afterthought.
Please do not open a public issue for security problems. Email the maintainers at
security@example.com (replace with your fork's contact) with:
- a description and impact assessment,
- reproduction steps or a proof of concept,
- any suggested remediation.
You'll get an acknowledgement within 72 hours and a fix timeline after triage.
- No secrets in git.
.gitignoreblocks.env,*.key,age.key,secrets/, and local.anjo/config. The interrogation wizard writes everything personal to git-ignored files. - Encrypted secrets in production.
SECRETS_BACKEND=sopsuses sops with age keys. Only ciphertext is ever committed. - Least privilege on the VPS. Hermes runs as a non-root
hermesuser via systemd; Docker containers drop capabilities; Caddy terminates TLS. - Authenticated Anjo↔Hermes link. SSH key auth or token-authenticated HTTPS — never an open port.
- Generate your own age key (
age-keygen) and keepage.keyoff git. - Use a dedicated bot token / SMTP credential, scoped minimally.
- Lock the VPS firewall to only the ports you need (see
infra/hetzner/firewall.md). - Rotate tokens periodically; the wizard re-runs idempotently to update config.
| Threat | Mitigation |
|---|---|
| Secret leakage via git | .gitignore + sops; CI secret-scan gate. |
| Compromised channel token | Least-scope tokens; rotate via anjo init; revoke at provider. |
| VPS takeover | Non-root systemd, firewall allowlist, fail2ban (recommended), key-only SSH. |
| Supply chain | Pinned base images; zero runtime deps in the Anjo wizard (stdlib only). |
| Alarm spam / DoS | Dedupe + rate-limit in the alarm engine before fan-out. |