
Leichtgewichtiger macOS-Erkennungsagent auf Basis der Endpoint-Security-Telemetrie von Santa.

Leichtgewichtiger macOS-Erkennungs-Sidecar für Santa, der Endpoint-Security-Telemetrie lokal mit CEL-Regeln auswertet und nur übereinstimmende Erkennungssignale an einen Backend-Server weiterleitet.
Experimentell. Entwickelt für Home-Labs und kleine Flotten. Frühe Veröffentlichung – mit Fehlern und API-Änderungen ist zu rechnen.
Santamon liest den Protobuf-Telemetriestream von Santa, wertet Erkennungsregeln mithilfe von CEL-Ausdrücken aus und sendet Sicherheitssignale an ein Backend. Die Roh-Telemetrie bleibt auf dem Endpoint – nur Erkennungen werden weitergeleitet.
Kernfunktionen:
Santamon ist ein Erkennungs-Sidecar für Santa, kein weiterer ESF-Client.
Die Entwicklung eines eigenen ESF-Tools erfordert die eingeschränkten Entitlements von Apple, Provisioning-Profile und einen sorgfältigen Umgang mit hochvolumigen Endpoint-Security-Ereignissen. Santa erledigt das bereits und ist in der Produktion bewährt.
Der Nutzen von Santamon:
Santa übernimmt die schwere Arbeit der zuverlässigen und sicheren Erfassung von Endpoint-Security-Ereignissen; Santamon konzentriert sich auf Erkennungslogik und Signalqualität.
Santa Spool → Watcher → Decoder → Rules Engine → Signal Generator → Shipper → Backend
↓ ↓
┌────────────────────────┐
│ State DB (BoltDB) │
│ • Correlation windows │
│ • Baseline tracking │
│ • Signal queue │
└────────────────────────┘
Process lineage: in-memory cache (1h TTL, 50K max)
Datenfluss:
/var/db/santa/spool/new/) auf neue Protobuf-DateienSpool-Lebenszyklus:
santa.archive_dir archiviert (Standard: /var/lib/santamon/spool_hits)Prozessherkunft:
tcc_modification erfordern macOS 15+)configs/examples/santa-config.mobileconfigSanta muss so konfiguriert werden, dass Protobuf-Ereignisse geschrieben werden. Verwende das mitgelieferte Konfigurationsprofil:
# Review and customize, then install via System Settings
open configs/examples/santa-config.mobileconfig
# Verify
santactl status | grep "Log Type"
# Should show: Log Type | protobuf
git clone https://github.com/0x4d31/santamon.git
cd santamon
make build
sudo make install
Dies installiert:
/usr/local/bin/santamon/etc/santamon/config.yaml und rules.yaml/Library/LaunchDaemons/com.santamon.plist/var/lib/santamon/Bearbeite /etc/santamon/config.yaml:
shipper:
endpoint: "https://your-backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
Setze den API-Schlüssel in der LaunchDaemon-Plist:
# Generate strong API key
openssl rand -hex 32
# Edit LaunchDaemon
sudo nano /Library/LaunchDaemons/com.santamon.plist
# Add under EnvironmentVariables:
<key>SANTAMON_API_KEY</key>
<string>your-generated-key-here</string>
# Start service
sudo make start
# Monitor logs
make logs
Hauptkonfiguration: /etc/santamon/config.yaml
agent:
id: "${HOSTNAME}"
shipper:
endpoint: "https://backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
santa:
spool_dir: "/var/db/santa/spool" # Santa spool location
archive_dir: "/var/lib/santamon/spool_hits" # Archive spool files that produced alerts
stability_wait: "2s" # Wait before reading new files
rules:
path: "/etc/santamon/rules.yaml" # File or directory
state:
db_path: "/var/lib/santamon/state.db"
sync_writes: true # Fsync after writes (safer but slower)
first_seen:
max_entries: 10000 # LRU cache for baseline rules
windows:
max_events: 1000 # Max events per correlation window
shipper:
batch_size: 100 # Signals per batch
flush_interval: "30s" # Time between flushes
timeout: "10s" # HTTP request timeout
tls_skip_verify: false # NEVER true in production
Siehe configs/santamon.yaml für alle Optionen mit ausführlichen Kommentaren.
Regeln sind CEL-Ausdrücke, die Santa-Ereignisse auswerten. Drei Typen werden unterstützt: einfach, Korrelation und Baseline.
rules:
- id: SM-014
title: "Non-interactive process invoking curl/wget"
description: |
Non-terminal, non-package-manager process launching curl or wget.
expr: |
kind == "execution" &&
event.execution.target.executable.path in ["/usr/bin/curl", "/usr/bin/wget"] &&
// Exclude interactive shells
!(
event.execution.instigator.executable.path.startsWith("/bin/bash") ||
event.execution.instigator.executable.path.startsWith("/bin/zsh") ||
event.execution.instigator.executable.path.startsWith("/bin/sh")
) &&
// Exclude Homebrew / package-manager helpers that legitimately use curl frequently
!(
event.execution.instigator.executable.path.startsWith("/opt/homebrew/") ||
event.execution.instigator.executable.path.contains("/Homebrew/")
)
severity: high
tags: ["T1105", "command-and-control"]
extra_context: ["event.execution.args"]
include_process_tree: true
enabled: true
correlations:
- id: SM-COR-001
title: "Process touching multiple credential stores"
description: "Single process accessing 3+ credential stores within 5 minutes."
expr: |
kind == "file_access" &&
event.file_access.policy_name in [
"ChromeCookies", "CometCookies", "SSHPrivateKeys",
"BrowserPasswords", "KeychainDB"
]
window: "5m"
group_by: ["event.file_access.instigator.executable.path"]
count_distinct: "event.file_access.policy_name"
threshold: 3
severity: critical
tags: ["T1539", "T1552", "credential-access"]
enabled: true
baselines:
- id: SM-BASE-001
title: "First-time unsigned binary executed from user paths"
description: "First time an unsigned binary executes from /Users paths."
expr: |
kind == "execution" &&
event.execution.decision == DECISION_ALLOW &&
event.execution.target.executable.path.startsWith("/Users/") &&
(
!has(event.execution.target.code_signature) ||
!has(event.execution.target.code_signature.team_id) ||
event.execution.target.code_signature.team_id == ""
)
track: ["event.execution.target.executable.cdhash"]
learning_period: "720h"
severity: high
tags: ["T1204.002", "initial-access"]
enabled: true
Regelorganisation: Einzelne Datei (/etc/santamon/rules.yaml) oder mehrdateiige Verzeichnisstruktur.
Vor der Bereitstellung validieren:
santamon rules validate
Siehe RULES.md für eine umfassende Anleitung.
Santamon benötigt ein Backend zum Empfangen von Signalen. Ein minimales FastAPI-Backend ist in backend/ enthalten.
Was es tut:
POST /ingest (API-Schlüssel erforderlich)GET /signals, GET /stats)POST /agents/heartbeat)Schnellstart:
cd backend
pip install fastapi uvicorn
# Set API key
export SANTAMON_API_KEY="your-key-here"
# Run (uses HTTPS if cert.pem exists, otherwise HTTP)
python backend.py

Siehe backend/README.md.
# Run agent (foreground, verbose mode)
santamon run --verbose
# Validate rules
santamon rules validate
# Show status
santamon status
# Database operations
santamon db stats # Show statistics
santamon db compact # Compact database
# Version
santamon version