Ares — AI-native host security investigator for Linux: continuous eBPF telemetry with minute-by-minute AI investigation.
Project description
Ares
AI-native host security investigator for Linux.
Continuous eBPF telemetry with minute-by-minute AI investigation.
An AI-native host investigation and response layer for production Linux infrastructure.
Ares continuously records process, network, filesystem, identity and persistence events, runs deterministic detection in real time, and every minute runs an AI investigation cycle that reconstructs suspicious activity into an evidence-backed verdict.
The design principle (spec §1):
The daemon records what happened. The detection engine decides what deserves attention. The AI investigator determines what the evidence means.
Architecture
kernel/OS ──► sensors ──► redaction + enrichment ──► SQLite store
│
streaming detector ──► immediate critical path
│ (evidence capture)
▼
one-minute scheduler ──► correlation ──► cases ──► AI investigator
│
policy + response ──► notifications / approved actions
| Layer | Module | Spec |
|---|---|---|
| Continuous daemon | ares.daemon |
§6.1 |
| Sensors (eBPF + procfs/psutil fallback) | ares.sensors |
§8 |
| Event schema | ares.events |
§9 |
| Redaction | ares.redaction |
§11 |
| Enrichment | ares.enrichment |
§10 |
| Streaming detection | ares.detection |
§12 |
| Correlation | ares.correlation |
§16 |
| Baseline | ares.baseline |
§17 |
| Cases | ares.cases |
§18 |
| AI investigator | ares.investigator |
§19 |
| Policy + response | ares.policy, ares.response |
§22 |
| Scheduler | ares.scheduler |
§15 |
| Storage | ares.storage |
§23 |
| CLI | ares.cli |
§29 |
Platform support
The first release targets Linux (Ubuntu/Debian/Amazon Linux/Rocky/Alma). The sensor layer is abstracted: eBPF is preferred on Linux, with an automatic procfs/psutil/inotify fallback (spec §8.2) that also lets the full pipeline run on macOS for development.
Install
pip install -e ".[dev,fs]" # from source
Optional extras: ai (Anthropic-native provider), api (local HTTP API),
fs (watchdog filesystem watcher). The OpenAI SDK (used for OpenRouter) is a
core dependency.
Quick start (dev, no root)
export ARES_STATE_DIR="$HOME/.ares" # dev state dir
ares init
ares daemon run # terminal 1: collect + detect
ares investigator run # terminal 2: one-minute investigation cycle
ares status
ares cases list
AI investigation (OpenRouter by default)
The default provider is OpenRouter, so you can run any model with two environment variables — no code or config changes:
export OPENROUTER_API_KEY=sk-or-...
export OPENROUTER_MODEL=anthropic/claude-3.5-sonnet # any OpenRouter model id
Other backends (set investigation.model_provider to match):
| Provider | Env vars |
|---|---|
openrouter (default) |
OPENROUTER_API_KEY, OPENROUTER_MODEL |
openai / self-hosted gateway |
OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL |
anthropic |
ANTHROPIC_API_KEY (pip install -e ".[ai]") |
local |
none — deterministic, no external model (spec §11.3) |
If no credentials are present the investigator automatically falls back to
local, so a fresh install runs with zero configuration and lights up the
moment you set the env vars. Secrets are read from the environment, never stored
in config. See examples/ares.env.example.
Notifications
Ares pushes incidents out over outbound-only channels — nothing inbound has to be exposed on the host. Configure any subset via env vars:
export ARES_NOTIFY_MIN_SEVERITY=high # global floor
export ARES_SLACK_WEBHOOK=https://hooks.slack.com/... # recommended default
export ARES_PAGERDUTY_ROUTING_KEY=... # pages on-call (critical)
export ARES_NOTIFY_WEBHOOK=https://ops.internal/ares # route anywhere
export ARES_SMTP_HOST=smtp.example.com ARES_SMTP_TO=secops@example.com # email
ares notify channels # show what's active
ares notify test # send a test alert through every channel
| Channel | Best for | Threshold |
|---|---|---|
| Slack | team visibility, rich formatting | global min_severity |
| Generic webhook | routing into your own tooling | global min_severity |
| Email / SMTP | universal fallback | global min_severity |
| PagerDuty | waking on-call for real incidents | own min_severity (default critical) |
Alert fatigue is controlled by the global severity floor, PagerDuty's separate higher threshold, and case deduplication (repeat activity updates one case / one PagerDuty incident rather than paging repeatedly).
Response safety
- Default mode is
recommend: nothing destructive runs automatically. - Only allow-listed evidence actions (hash/capture/preserve) run without approval. Containment/recovery actions require explicit operator approval and carry rollback metadata (spec §22.3).
delete_fileandexecute_generated_shell_commandare prohibited; the language model never receives shell access (spec §22.3).
Python API
from ares import Ares
client = Ares.from_config("examples/config.yaml")
print(client.status())
for case in client.cases.list(status="open"):
print(case["title"], case["risk_score"])
Testing
pytest # unit + integration + attack simulations (safe fixtures)
Status
This repository implements Phase 1 and the core of Phase 2 (spec §36). The
eBPF programs (bpf/) and privileged response helper are Linux integration
steps; see docs/ for the roadmap and security model.
Licensed under Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ares_agent-0.1.0.tar.gz.
File metadata
- Download URL: ares_agent-0.1.0.tar.gz
- Upload date:
- Size: 80.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
511704d23526d9ad438ca7883dd75e86d1990e6946d813a57df4de43e5dc55ff
|
|
| MD5 |
6c57b6cc2fc482a04708cdf381b5ba1e
|
|
| BLAKE2b-256 |
5b91cd47976c6b6fd9dc775f318cb15cc5318adace06d06846fbb47e32aa5197
|
Provenance
The following attestation bundles were made for ares_agent-0.1.0.tar.gz:
Publisher:
release.yml on kossisoroyce/ares
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ares_agent-0.1.0.tar.gz -
Subject digest:
511704d23526d9ad438ca7883dd75e86d1990e6946d813a57df4de43e5dc55ff - Sigstore transparency entry: 2296963594
- Sigstore integration time:
-
Permalink:
kossisoroyce/ares@0286c28c8495f7cc33144826f02d9197f237fd83 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kossisoroyce
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0286c28c8495f7cc33144826f02d9197f237fd83 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ares_agent-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ares_agent-0.1.0-py3-none-any.whl
- Upload date:
- Size: 84.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c869864338299fa7b53900a57d3da6ce068d3bc0986dae400895054b02616a9b
|
|
| MD5 |
58b92c5e86e5c77d028ca120c923f490
|
|
| BLAKE2b-256 |
13de60fc11ca090a0e24494d64e42b7d1c7d9cb7d03f3bdc852684036f66010e
|
Provenance
The following attestation bundles were made for ares_agent-0.1.0-py3-none-any.whl:
Publisher:
release.yml on kossisoroyce/ares
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ares_agent-0.1.0-py3-none-any.whl -
Subject digest:
c869864338299fa7b53900a57d3da6ce068d3bc0986dae400895054b02616a9b - Sigstore transparency entry: 2296963655
- Sigstore integration time:
-
Permalink:
kossisoroyce/ares@0286c28c8495f7cc33144826f02d9197f237fd83 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kossisoroyce
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0286c28c8495f7cc33144826f02d9197f237fd83 -
Trigger Event:
push
-
Statement type: