Files
MarketingTool/docs/SECURITY.md
T

4.2 KiB

Security Notes

Current safety boundary

  • Automated outreach is disabled. The compose file sets AUTOMATED_OUTREACH_ENABLED=false for both services. The MVP sends no email, SMS, or other outbound communication.
  • No credentials are committed. .env.example contains non-secret names and local defaults only.
  • Authentication uses server-side sessions for browser clients. The session identifier is carried in an HttpOnly cookie; logout/revocation must invalidate the server-side session. Health endpoints are deliberately public and must remain usable without a session.
  • Containers run as an unprivileged user, drop Linux capabilities, use no-new-privileges, and use read-only root filesystems. The API data volume is the only intended writable persistent location.
  • The stdlib API remains a small MVP security boundary. Authentication/session handling does not by itself provide authorization, CSRF protection, rate limiting, MFA, or a complete audit log.

Known limitations before production

  1. Password storage: production passwords must be hashed with Argon2id using a reviewed cost/memory/parallelism policy. Never store plaintext or reversible passwords, and never log bootstrap credentials. Rehash on login when the policy changes.
  2. MFA: require phishing-resistant or TOTP MFA for administrator accounts in production, including the bootstrap admin before granting ongoing administrative access. Define recovery, enrollment, reset, and revocation procedures; do not treat a password-only bootstrap as production-ready.
  3. Authentication and authorization: enforce authorization server-side on every protected route, rotate/regenerate sessions at login and privilege changes, expire idle/absolute sessions, revoke on logout/password reset, and test tenant isolation. The bootstrap variables are one-time provisioning inputs, not a standing authentication mechanism.
  4. Cookies and CSRF: use HttpOnly, Secure (production HTTPS), and an appropriate SameSite policy. Secure cookies cannot be exercised over the local HTTP Compose URLs, and SameSite is defense-in-depth—not a complete CSRF control. Browser state-changing endpoints require CSRF tokens (or a rigorously reviewed equivalent); do not rely on CORS or cookie flags alone.
  5. SSRF: any future URL fetcher must allow only http/https, validate DNS/IP targets, block loopback/private/link-local/cloud-metadata ranges after resolution, limit redirects, enforce size/time limits, and re-check each redirect. Never fetch arbitrary user-provided URLs from the server without these controls.
  6. Input/output safety: validate schema and content types, bound request sizes, parameterize database queries, escape output, and avoid logging contact data or secrets.
  7. Secrets: inject production secrets from a secret manager or orchestrator secret store. Do not place them in images, Compose files, source, CI logs, or committed .env files. Remove bootstrap variables after first-run provisioning.
  8. Transport and perimeter: terminate TLS at a trusted ingress, restrict exposed ports, add network policy, and place admin surfaces behind appropriate access controls.
  9. Data protection: define retention and deletion rules for prospect/contact data, restrict volume access, encrypt backups, and maintain an access/audit trail.

Source and contact policy

Treat discovered business information as potentially personal or copyrighted data. Collect only what is needed for the documented product purpose, preserve source attribution where required, respect site terms and robots/access policies, and provide suppression/deletion handling. Do not infer consent to contact from public availability. Any future outreach feature requires an explicit product/legal review and must remain off by default.

CI/dependency hygiene

Pin or review base-image and dependency updates, scan images before release, use least-privilege GitHub tokens, and avoid printing environment values. CI may validate Compose with empty optional bootstrap variables and call unauthenticated health checks; it is not a substitute for Argon2id parameter review, MFA testing, or a security assessment.

Report vulnerabilities privately to the repository maintainers; do not include live credentials or personal data in an issue.