
Agente de detección ligero para macOS construido sobre la telemetría de Endpoint Security de Santa.

Sidecar ligero de detección para macOS Santa que evalúa la telemetría de Endpoint Security localmente con reglas CEL y reenvía solo las señales de detección coincidentes a un servidor backend.
Experimental. Creado para laboratorios domésticos y flotas pequeñas. Versión temprana: se esperan errores y cambios en la API.
Santamon lee el flujo de telemetría protobuf de Santa, evalúa las reglas de detección mediante expresiones CEL y envía señales de seguridad a un backend. La telemetría bruta permanece en el endpoint; solo se reenvían las detecciones.
Capacidades principales:
Santamon es un sidecar de detección para Santa, no otro cliente ESF.
Crear una herramienta ESF personalizada requiere los entitlements restringidos de Apple, perfiles de aprovisionamiento y un manejo cuidadoso de eventos de Endpoint Security de alto volumen. Santa ya hace esto y está probada en producción.
El valor de Santamon:
Santa se encarga del trabajo pesado de ingerir eventos de Endpoint Security de manera confiable y segura; Santamon se centra en la lógica de detección y la calidad de las señales.
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)
Flujo de datos:
/var/db/santa/spool/new/) en busca de nuevos archivos protobufCiclo de vida del spool:
santa.archive_dir (predeterminado: /var/lib/santamon/spool_hits)Linaje de procesos:
tcc_modification requieren macOS 15+)configs/examples/santa-config.mobileconfigSanta debe configurarse para escribir eventos protobuf. Usa el perfil de configuración proporcionado:
# 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
Esto instala:
/usr/local/bin/santamon/etc/santamon/config.yaml y rules.yaml/Library/LaunchDaemons/com.santamon.plist/var/lib/santamon/Edita /etc/santamon/config.yaml:
shipper:
endpoint: "https://your-backend.example.com:8443/ingest"
api_key: "${SANTAMON_API_KEY}"
Establece la clave de API en el plist del 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
Configuración principal: /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
Consulta configs/santamon.yaml para conocer todas las opciones con comentarios detallados.
Las reglas son expresiones CEL que evalúan eventos de Santa. Se admiten tres tipos: simple, correlación y línea base.
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
Organización de reglas: un solo archivo (/etc/santamon/rules.yaml) o estructura de directorio de múltiples archivos.
Valida antes de implementar:
santamon rules validate
Consulta RULES.md para obtener una guía completa.
Santamon requiere un backend para recibir señales. Se incluye un backend FastAPI mínimo en backend/.
Qué hace:
POST /ingest (requiere clave de API)GET /signals, GET /stats)POST /agents/heartbeat)Inicio rápido:
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

Consulta 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