Skip to content

Security: jowpurcinelli/anjo-harness

SECURITY.md

Security Policy

Anjo Harness is meant to be a trustable harness for real businesses. Security is a first-class feature, not an afterthought.

Reporting a vulnerability

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.

What the harness guarantees

  • No secrets in git. .gitignore blocks .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=sops uses sops with age keys. Only ciphertext is ever committed.
  • Least privilege on the VPS. Hermes runs as a non-root hermes user via systemd; Docker containers drop capabilities; Caddy terminates TLS.
  • Authenticated Anjo↔Hermes link. SSH key auth or token-authenticated HTTPS — never an open port.

Your responsibilities (as an operator)

  • Generate your own age key (age-keygen) and keep age.key off 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 model (summary)

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.

There aren't any published security advisories