The probe agent learns to watch from inside.

The addons agent has one job: watch your infrastructure from a box that isn’t part of it, so an outage your app can’t log still becomes an alert. That job hasn’t changed. But as of 0.2.0, the same binary has a second one — installed on the box you care about, it watches from inside, continuously, at the kernel.

Sensors, not checks

A check runs on a schedule: every sixty seconds, ask the question, report the answer. That’s the right shape for “is the site up” and the wrong shape for “did someone just change my firewall” — a rule added and removed between two runs never existed as far as a poll is concerned.

Sensors don’t poll. The agent subscribes to the kernel and reports the moment something happens. Seven ship in 0.2.0, all Linux, all off until agent.enable_sensors names them:

  • nftwatch — the nftables ruleset, reported the instant it changes. A rule added at 3 a.m. is an alert, not a surprise in next week’s audit.
  • network — every inbound TCP connection attempt, seen by a pass-only eBPF/XDP program that can observe but has no drop, redirect, or rewrite path.
  • authwatch — SSH and sudo authentication events out of the system journal, strictly matched against the distribution’s exact message forms rather than guessed at.
  • filewatch — an explicit set of files and shallow directories. inotify is only the wake-up; every event settles into a full reconciliation, so an atomic editor replace is a confirmed change, not a missed one.
  • listeningports — the kernel’s own socket inventory against a baseline you declare. A listener that appeared without being declared is an event; so is one that vanished.
  • servicewatch — an explicit list of systemd units: failures, recoveries, restart loops, changed unit files, and a service whose command quietly became a different binary.
  • pressure — kernel PSI stall triggers for CPU, memory, and I/O. The kernel wakes the sensor only when workloads were actually stalled past your threshold; one event per crossing, one per recovery.

Sensor events travel the same ingest plane as everything else, so there’s nothing new to learn on the alerting side: your rules threshold them, repeats collapse, ladders escalate, your phone rings.

What never leaves the box

Every sensor was built with the same rule: send the fact, not the material. nftwatch sends ruleset hashes and object counts — never your rules. network aggregates by port and redacted remote prefix — packet payloads and exact addresses never enter an event. authwatch never sends usernames or raw journal lines, and reduces remote addresses to a /24 or /64 before they leave the host. filewatch sends type, owner, mode, and SHA-256 — never contents. servicewatch sends no journal text, command lines, or unit-file contents.

Privileges follow the same posture. The agent’s stock systemd unit keeps an empty capability set; the kernel-attached sensors each get one narrow capability through a local drop-in you write (CAP_NET_ADMIN for nftwatch, CAP_BPF plus CAP_NET_ADMIN for network), and the release’s own VM test suite proves each capability is necessary by removing them one at a time. Several sensors need nothing added at all.

Two new checks, while we’re at it

The scheduled side grows too. hostmetrics reads CPU time, load averages, memory and swap gauges, and paging rates straight from /proc — unprivileged, with thresholds living in tower rules where they can match your workload instead of a hardcoded 80%. securityupdates reports pending updates and security updates from apt, whether a reboot is required, and how stale the package metadata is — an unpatched box and a mirror that stopped syncing are both a rule away from paging someone.

Signed by hardware now

0.2.0 also changes how releases are signed. The signing key no longer exists as a file anywhere — it’s resident on a hardware token and can’t be extracted from it. Verification got easier at the same time: signatures are SSH signatures, so the stock ssh-keygen already on your machine checks them, with nothing to install. The download section has the two commands.

Turn one on

agent:
  enable_sensors: [nftwatch, network]

sensors:
  - id: host-firewall
    sensor: nftwatch
    with: { netns: host, settle: 250ms, reconcile: 5m }
  - id: public-ingress
    sensor: network
    with:
      interfaces: [eth0]
      direction: ingress
      ports: [22, 80, 443]
      window: 60s

The addons page has the full tour, download, and verification; the agent-readable version at /addons/index.md means your AI agent can do the whole setup for you. And the agent’s heartbeat now reports sensors, sensor_events, and sensor_failures about itself — so a sensor that stops sensing is, of course, just one more rule.

← All posts