
Agent de détection macOS léger, basé sur la télémétrie Endpoint Security de Santa.

Sidecar de détection macOS léger pour Santa qui évalue la télémétrie Endpoint Security localement avec des règles CEL et transmet uniquement les signaux de détection correspondants à un serveur backend.
Expérimental. Conçu pour les laboratoires maison et les petits parcs. Version précoce – attendez-vous à des bugs et à des changements d'API.
Santamon lit le flux de télémétrie protobuf de Santa, évalue les règles de détection à l'aide d'expressions CEL et envoie les signaux de sécurité à un backend. La télémétrie brute reste sur l'endpoint—seules les détections sont transmises.
Fonctionnalités principales :
Santamon est un sidecar de détection pour Santa, pas un autre client ESF.
Construire un outil ESF personnalisé nécessite les entitlements restreints d'Apple, des profils de provisionnement et une gestion minutieuse des événements Endpoint Security à haut volume. Santa fait déjà cela et est éprouvé en production.
La valeur de Santamon :
Santa s'occupe du gros du travail d'ingestion des événements Endpoint Security de manière fiable et sûre ; Santamon se concentre sur la logique de détection et la qualité des signaux.
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)
Flux de données :
/var/db/santa/spool/new/) pour les nouveaux fichiers protobufCycle de vie du spool :
santa.archive_dir (par défaut : /var/lib/santamon/spool_hits)Filiation des processus :
tcc_modification nécessitent macOS 15+)configs/examples/santa-config.mobileconfigSanta doit être configuré pour écrire des événements protobuf. Utilisez le profil de configuration fourni :
# 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
Ceci installe :
/usr/local/bin/santamon/etc/santamon/config.yaml et rules.yaml/Library/LaunchDaemons/com.santamon.plist/var/lib/santamon/Modifiez /etc/santamon/config.yaml :
shipper:
endpoint: "https://your-backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
Définissez la clé API dans le plist du LaunchDaemon :
# 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
Configuration principale : /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
Voir configs/santamon.yaml pour toutes les options avec commentaires détaillés.
Les règles sont des expressions CEL qui évaluent les événements Santa. Trois types sont pris en charge : simple, corrélation et 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
Organisation des règles : fichier unique (/etc/santamon/rules.yaml) ou structure de répertoire multifichier.
Valider avant le déploiement :
santamon rules validate
Voir RULES.md pour un guide complet.
Santamon nécessite un backend pour recevoir les signaux. Un backend FastAPI minimal est inclus dans backend/.
Ce qu'il fait :
POST /ingest (nécessite une clé API)GET /signals, GET /stats)POST /agents/heartbeat)Démarrage rapide :
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

Voir 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