Files
watchman/plan/plan.md

235 lines
9.7 KiB
Markdown
Raw Permalink Normal View History

2025-09-17 12:13:02 -04:00
# Watchman — Product Plan and Roadmap
Last updated: 2025-09-17 10:54 local
This document lays out where Watchman is today, the features we will add next, and a pragmatic, incremental path to get there. It complements the existing planning notes in:
- plan/features.md — initial Free vs. Paid feature thinking
- plan/monetization.md — high-level monetization comparison
The focus here is on technical scope, sequence, and acceptance criteria.
## 1) Vision and Principles
Watchman provides multi-signal host monitoring and automated response to help detect and mitigate unauthorized access or suspicious changes on a system. Key principles:
- Defense-in-depth: multiple independent signals with clear provenance.
- Actionable by default: every detection can notify and/or trigger a safe, reversible response.
- Secure by default: hardened runtime, least-privilege, safe config parsing.
- Observability: clear logs, metrics, and health checks.
- Cross-platform where feasible; optimize for Linux first.
## 2) Current State (v0.2.x)
Already in the repository (per README and codebase):
- Monitors
- USB activity: detect increases in connected USB devices; optional unmount/reboot/notify.
- File system integrity: hash-based monitoring for specified directories (e.g., /etc, /bin, $PATH) using blake3.
- Network: detect network issues/failures.
- SSH “burn file”: remote path check that can trigger protective actions.
- Notification: Discord webhook alerts.
- Config: Settings.toml with intervals, toggles, directories, webhook URL.
- Runtime: Rust async, uses tokio/actix; prometheus crate is present.
Gaps
- Metrics exist in codebase structure but not fully surfaced/standardized.
- Limited notification channels (Discord only).
- Validation of config values and schema evolution not formalized.
- Tests are limited. No fuzzing or integration test harness.
- Cross-platform support unclear (Linux focused).
- Service management, packaging, and upgrade story can be improved.
## 3) Near-Term Goals (security and reliability first)
- Hardening: minimize privileges, sanitize command execution, robust error handling.
- Deterministic behavior: clear state machine for each monitor, idempotent actions.
- Observability: consistent metrics and structured logs for every monitor and action.
- Safer configuration: validation, defaults, and deprecation path.
## 4) Feature Roadmap (Phased)
The roadmap uses small, shippable milestones. Each item lists key deliverables and acceptance criteria.
### Milestone A — 0.3.0: Observability & Config Hygiene
- Prometheus metrics v1
- Counters for events by monitor (usb_events_total, fs_events_total, net_failures_total, burn_events_total)
- Gauges for current connected USB count, last_success_timestamp per monitor
- Histogram for monitor latency and action execution duration
- /metrics endpoint gated by bind address (default: localhost) and optional auth token
- Acceptance: metrics documented in README; basic dashboard example provided.
- Structured logging
- Add consistent, machine-parseable logs (e.g., JSON via env-controlled format)
- Include correlation IDs per tick/incident
- Acceptance: toggle via config; example jq commands in README
- Config validation
- Strongly-typed Settings with explicit defaults
- Startup validation with actionable error messages
- Acceptance: invalid config causes non-zero exit with guidance; sample Settings.toml updated
### Milestone B — 0.3.1: Notification Channels v2
- Add Slack and generic webhook support
- Pluggable notifier trait; Discord refactored to use it
- Basic rate limiting and de-dup window to avoid alert storms
- Acceptance: e2e tests that simulate events and assert notifier behavior
### Milestone C — 0.3.2: Filesystem Integrity v2
- Baseline management (init, refresh, compare)
- Exclude/include patterns; per-path policies
- Optional immutable baseline storage (append-only file) and checksum manifest
- Acceptance: CLI subcommands watchman fs init|refresh|diff and docs
### Milestone D — 0.3.3: USB Monitor v2
- Trusted device allowlist (vendor:product IDs) and policy actions (alert-only, unmount, power-cycle where supported)
- Cooldown and backoff to avoid flapping
- Acceptance: simulator/test harness to inject fake USB events
### Milestone E — 0.3.4: Network Monitor v2
- Multiple targets, success quorum, and jittered intervals
- Optional traceroute-on-failure (best effort)
- Acceptance: integration tests with a local dummy target
### Milestone F — 0.4.0: Response Actions Framework
- Action registry (unmount, reboot, kill-process, rotate-keys [stub], run-script)
- Pre- and post-conditions; dry-run mode; per-action timeouts
- Acceptance: action plans expressed in config; unit tests for each action
### Milestone G — 0.4.1: Health and Control API
- HTTP control plane (bind-local by default):
- GET /healthz, /readyz, /metrics
- POST /actions/{name} with dry-run and audit
- Acceptance: integration tests; example curl commands in README
### Milestone H — 0.4.2: Packaging & Service
- Systemd unit hardening (CapabilityBoundingSet, NoNewPrivileges, ProtectSystem, etc.)
- Deb/RPM packaging; Homebrew Tap formula for macOS CLI-only
- Acceptance: reproducible binaries, install docs, and service hardening checklist
### Milestone I — 0.5.x: Cross-Platform & Extensibility
- macOS: fs events via FSEvents; limited USB visibility; launchd plist
- Windows: filesystem via USN Journal (scoped); service integration; USB capabilities evaluated
- Plugin interface (WASM or dynamic dispatch) for third-party monitors
- Acceptance: CI builds for Linux/macOS; Windows nightly artifacts
Note: If monetization becomes relevant later, see plan/features.md and plan/monetization.md for an initial split. We will keep the open-source core useful and secure.
## 5) Architecture Notes
- Monitors
- Each monitor is an independent component with a common trait: poll(), emit events, and register metrics.
- Monitors should be stateless across ticks where possible; persisted state is explicit (e.g., fs baseline).
- Event Bus
- Internally, use a channel-based event bus to decouple detection from actions/notifications.
- Events carry severity, source, timestamp, and correlation ID.
- Actions
- Declarative action specifications (conditions + operations). Support dry-run.
- Notifiers
- Implement a notifier trait with backoff, jitter, and rate-limiting wrappers.
- Configuration
- Strongly typed, documented, validated; feature flags guarded with clear defaults.
## 6) Configuration Evolution (draft)
Add or refine keys in config/Settings.toml:
- [general]
- tick_delay_seconds, fs_tick_delay_seconds
- log_format = "text"|"json"
- metrics_bind_addr = "127.0.0.1:9898"
- metrics_auth_token = "" # optional
- [notifications]
- discord_webhook_url = "..." (existing)
- slack_webhook_url = "..."
- generic_webhook_url = "..."
- notify_dedupe_window_secs = 30
- [fs]
- enabled = true
- dirs = ["/etc", "/bin", "$PATH"]
- exclude = ["/etc/ssl/**"]
- baseline_path = "/var/lib/watchman/fs-baseline.json"
- hash = "blake3"
- [usb]
- enabled = true
- allowlist = ["abcd:1234", "1d6b:0002"]
- action_on_unauthorized = "alert|unmount|reboot|none"
- cooldown_secs = 10
- [net]
- enabled = false
- targets = ["1.1.1.1", "8.8.8.8"]
- quorum = 1
- interval_jitter_pct = 20
- [burn]
- enabled = false
- ssh_host = "hostname"
- ssh_user = "root"
- ssh_key = "/home/user/.ssh/id_rsa"
- path = "/root/.config/burn"
- check_interval_secs = 30
## 7) Security & Hardening Checklist
- Run as dedicated user; least filesystem permissions.
- Systemd hardening options enabled by default.
- Validate and sanitize all external inputs (paths, webhook URLs, command args).
- Cryptographic hashing via blake3; check for algorithm agility hooks.
- Protect secrets in memory where possible; avoid logging sensitive values.
- Optional signed baseline and config (future).
## 8) Observability & Diagnostics
- Prometheus metrics as in Milestone A.
- Structured logs with correlation IDs.
- Debug bundle command: watchman diag bundle → collects versions, last logs, metrics snapshot (no secrets).
## 9) CLI and UX
- watchman run — start monitors with current config.
- watchman fs init|refresh|diff — manage filesystem baseline.
- watchman validate — validate config and report errors.
- watchman install-service webhook=<url> — keep for quick start; document flags.
## 10) Testing Strategy
- Unit tests per monitor and notifier.
- Integration tests spawning the binary with temp configs.
- Property-based tests for config parsing/validation.
- Fuzz critical parsers (USB sysfs parsing, config loader).
- Golden tests for logs/metrics outputs.
- CI: run clippy, fmt, tests; produce artifacts for Linux (and later macOS/Windows).
## 11) Performance Targets
- Idle memory: < 150 MB typical on Linux with all monitors enabled.
- CPU: < 2% average on a modern 2-core VM at default intervals.
- Baseline diff for 100k files: < 30s on SSD; incremental checks amortized.
## 12) Risks and Mitigations
- False positives driving destructive actions → default to alert-only; require explicit opt-in for destructive actions; dry-run support.
- Platform differences (USB, FS APIs) → feature gating; per-OS implementations.
- Metric/telemetry exposure → bind-local by default; optional token; document firewalling.
## 13) Release Cadence and Versioning
- Minor iterations every 24 weeks; patch releases as needed.
- Semantic versioning: 0.x minor bumps may include breaking changes, documented in CHANGELOG.
## 14) Immediate Next Steps (for maintainers)
1. Define metric names and add minimal /metrics endpoint (A).
2. Add config validation with friendly errors (A).
3. Introduce notifier trait and migrate Discord (B).
4. Draft fs baseline CLI skeleton (C).
Track progress via issues and link them back to this plan.