enodia-sentinal/enodia_sentinel
Luna 34bc09041a Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch
Answers two hard questions: "what guards the hashes FIM trusts?" and "how do we
make the sensor itself hard to silently disable?" — within the honest limit that
a root attacker who shares your privileges can't be fully stopped on-box, only
made loud.

- pkgdb.py: guards the package DB that `pacman -Qkk` trusts. Anchors a
  fingerprint of /var/lib/pacman/local (refreshed ONLY by the pacman hook) and
  cross-checks pacman.log; a DB change with no logged transaction is flagged
  pkgdb_tamper (CRITICAL, sid 100021) — catches an attacker rewriting a stored
  checksum to mask a modified binary. Verified end-to-end against a simulated
  hash-overwrite.
- selfprotect.py: Sentinel's own binaries/config/units/hook are always in the
  FIM watch set (self-integrity); a heartbeat is written each loop; an external
  `watchdog` command polls a remote dashboard and pushes if the sensor goes
  silent or unreachable — silence becomes the alarm.
- daemon: heartbeat + slow-cadence pkgdb check; DB anchor re-anchored in
  build_fim_baseline so the pacman hook refreshes it after each transaction
- web: /api/status now reports heartbeat_age/stale; dashboard shows it
- cli: pkgdb-check, watchdog (--url/--token/--max-age, bypasses min-severity)
- config: pkgdb_verify/_interval, heartbeat_max_age
- README: threat model (trust-anchor problem) + hardening layers (immutability,
  signed-package + external anchor); reframes "anti-rootkit" as tamper-evidence
- tests: +8 (DB fingerprint, anchor/transaction logic, pacman.log parse,
  heartbeat + watchdog verdicts). 80/80 pass

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 22:27:50 -07:00
..
detectors Add false-positive triage via package-ownership provenance 2026-05-31 22:05:00 -07:00
events Add event-driven eBPF execve layer with a Snort-style rule engine 2026-05-31 07:16:53 -07:00
notify Add read-only web dashboard and phone push notifications 2026-05-31 16:18:00 -07:00
static Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
__init__.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
alert.py Add event-driven eBPF execve layer with a Snort-style rule engine 2026-05-31 07:16:53 -07:00
cli.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
config.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
daemon.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
fim.py Add file integrity monitoring (Tripwire-style), auto-refreshed via pacman hook 2026-05-31 22:18:42 -07:00
netutil.py Relicense under GPL-3.0-or-later 2026-05-31 06:52:34 -07:00
pkgdb.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
provenance.py Add false-positive triage via package-ownership provenance 2026-05-31 22:05:00 -07:00
selfprotect.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00
snapshot.py Add read-only web dashboard and phone push notifications 2026-05-31 16:18:00 -07:00
system.py Relicense under GPL-3.0-or-later 2026-05-31 06:52:34 -07:00
triage.py Add false-positive triage via package-ownership provenance 2026-05-31 22:05:00 -07:00
web.py Add tamper-evidence: package-DB integrity, self-integrity, dead-man's switch 2026-05-31 22:27:50 -07:00