Orin – Production-Grade Offline Forensic Investigation & Integrity Engine
Project description
Orin — Offline Linux Forensics & Integrity Engine
Point-in-time forensic snapshot platform for Linux — built for analysts who operate where cloud connectivity is prohibited. Designed for air-gapped, offline, and forensically sensitive environments.
Orin captures point-in-time snapshots of critical OS state, compares them against trusted baselines, identifies anomalous behaviour, and produces tamper-evident evidence bundles — all without any network access, telemetry, or cloud dependencies. Built for air-gapped networks, classified environments, and forensically sensitive systems.
Contents
- Why Orin?
- Quick Start
- Installation
- Usage
- Capabilities
- Configuration
- Threat Detection
- Testing
- Contributing
- Security
- Documentation
Why Orin?
Most Linux security tools require a persistent daemon, a cloud backend, continuous network connectivity, or a large footprint of third-party packages — none of which are compatible with hardened, air-gapped, or forensically sensitive environments.
Orin requires none of these. It operates entirely from the Python standard library, reads directly from kernel interfaces (/proc, /sys, /var/log), and stores all evidence locally.
| Orin | Falco | osquery | Wazuh | |
|---|---|---|---|---|
| Runtime dependencies | stdlib (+ libbpf optional) | Kernel driver / eBPF | Standalone binary | Agent + manager |
| Network required | Never | Optional | Optional | Yes |
| Cloud dependencies | Zero | Optional | Optional | Required |
| Air-gap safe | ✅ Out-of-the-box | ⚠️ Complex setup | ⚠️ Complex setup | ❌ Requires manager |
| Multi-tenant hub | ✅ | ❌ | ❌ | ⚠️ Manager-only |
| Offline threat intel | ✅ STIX / CSV / TAXII | ❌ | ❌ | ❌ |
| Forensic evidence signing | ✅ HMAC-SHA256 + AES-256-GCM | ❌ | ❌ | ❌ |
| Anti-forensics detection | ✅ wtmp / lastlog | ❌ | ❌ | ❌ |
| Real-time eBPF streaming | ✅ Ring-buffer consumer | ✅ Full IDS | ⚠️ Via extensions | ❌ |
Target use cases: Security engineers, forensic analysts, incident responders, and system administrators operating in air-gapped environments, SCIFs, classified networks, industrial control systems, and any infrastructure where data must remain strictly on-premises.
Quick Start
# One-time initialization — creates the vault and records trusted baselines
sudo orin init
# Core workflow
sudo orin collect # Capture a system state snapshot
sudo orin analyze # Evaluate against threat detection rules
sudo orin report # Generate a forensic briefing
# Automate collection every 10 minutes
sudo orin schedule --install
# Launch the local web dashboard (prints a one-time access token)
sudo orin serve
# Scan a remote host over SSH (stdlib-only agent; pure-Bash fallback available)
sudo orin scan --host 192.168.1.50 --user root --init
# Real-time eBPF telemetry streaming (requires libbpf)
sudo orin stream --verbose
# Prune old snapshots
sudo orin vault prune --older-than 30
# Centralized fleet hub for multi-tenant forensic management
sudo orin hub-serve 8000 --host 0.0.0.0 --cert /path/to/cert.pem --key /path/to/key.pem
Installation
Requirements: Python ≥ 3.10 (only required for source installation). Optional: system
libbpffor real-time eBPF streaming.
Method A — Pre-compiled Offline Setup Bundle (Recommended)
For air-gapped systems or targets without a Python environment, download the standalone release tarball orin-1.2.0-linux-x86_64.tar.gz and run:
tar -xzf orin-1.2.0-linux-x86_64.tar.gz
cd orin-1.2.0-linux-x86_64
chmod +x install.sh && ./install.sh
This securely deploys the pre-compiled orin binary, default configuration templates, and rules locally (under $HOME/.local/bin for user mode or /usr/local/bin for system mode) with zero internet dependencies.
Method B — Automated Installer from Source
If installing directly from the source directory:
chmod +x install.sh && ./install.sh
Method C — System-wide (via pip)
sudo pip install . --break-system-packages
Method C — Development mode
pip install -e .
PYTHONPATH=src python -m orin.main <subcommand>
Optional: Enable eBPF real-time streaming
Runtime hosts only need the system libbpf shared library — no compiler or kernel headers required.
# Debian / Ubuntu
sudo apt-get install libbpf1
# RHEL / Rocky / Alma
sudo dnf install libbpf
To modify and recompile the eBPF source itself:
sudo ./scripts/setup_ebpf.sh --build
See EBPF_TROUBLESHOOTING.md for kernel/BTF prerequisites and common errors.
Usage
All subcommands that read privileged files (/proc/kallsyms, /var/log/auth.log, etc.) produce richer output when run as root.
init → collect → analyze → report
↓
delta / diff / export / verify / serve / schedule / stream
Tip: Use
orin schedule --installto automate thecollect → analyzecycle. Useorin streamfor real-time eBPF telemetry (requireslibbpf).
orin init
Create the SQLite vault and record immutable baselines for trusted kernel modules, user accounts, and SUID/SGID binaries.
sudo orin init
orin collect
Harvest a full system state snapshot and persist it to the vault.
sudo orin collect
sudo orin collect --parallel --workers 4 # Concurrent collection (~15× faster)
See PARALLEL_COLLECTION_FEATURE.md.
orin analyze
Evaluate the latest snapshot against all threat detection rules and produce a severity-tiered risk score (0–100).
sudo orin analyze
orin report
Compile a forensic briefing from the latest snapshot and unresolved alerts.
sudo orin report --format html --output /tmp/orin_report.html
sudo orin report --format markdown --output /tmp/orin_report.md
orin stream
Launch the eBPF real-time telemetry consumer. Streams execve, connect, and openat events via the kernel ring buffer into SQLite.
sudo orin stream --verbose
orin serve
Start a local forensic web console on 127.0.0.1:8000. A one-time session token is printed to the terminal on each start.
sudo orin serve
sudo orin serve --port 9090
sudo orin serve --no-auth # Trusted networks only
orin scan
Agentless remote scan over SSH. Uses a stdlib-only Python agent with a pure-Bash fallback for Python-less systems.
sudo orin scan --host 192.168.1.50 --user root --key ~/.ssh/id_ed25519
sudo orin scan --host 192.168.1.50 --user root --init # Initialize baseline
See SSH_GUIDE.md.
orin schedule
Install or remove the automated collect → analyze cron job.
sudo orin schedule --install --interval 10
sudo orin schedule --status
sudo orin schedule --remove
orin vault
Manage snapshot lifecycle.
sudo orin vault stats
sudo orin vault prune --older-than 30 --dry-run
sudo orin vault prune --keep-last 10 --execute
sudo orin vault prune --keep-last 10 --no-preserve-critical --execute
orin delta / orin diff / orin export / orin verify
sudo orin delta --base 1 --target 3
orin diff /backups/orin_day1.db /var/lib/orin/orin_vault.db
sudo orin export --snapshot 2 --secret "passphrase"
orin verify --file orin_export_snap_2.json --secret "passphrase"
Capabilities
Orin implements 57 forensic capabilities across 8 functional domains. See CAPABILITIES.md for the full annotated reference.
Collection modules: Process Tree Harvester · Network Socket Auditor · Kernel Module & Symbol Auditor · User & SSH Key Inventory · File Integrity Monitor · Auth Log Parser & Sigma Engine · In-Memory Executable Recovery · Promiscuous Mode Auditor · Binary Session Auditor · Hidden Process Detector · Package Integrity Engine · Scheduled Task Harvester · eBPF & File Descriptor Auditor · DNS Forensics & Tunneling Detection · Triggered PCAP Capture · Privilege & Identity Tracker
Analysis & detection: Threat Detection Rules Engine · Forensic Alert Auto-Resolution · YARA Engine · Sigma Rule Evaluator · MITRE ATT&CK Mapper · Snapshot Comparator · Timeline Delta Calculator · AI Forensic Triage (Ollama)
Evidence handling: Cryptographic Export (HMAC-SHA256) · Encrypted Vault (AES-256-GCM) · Offline Threat Intel Importer
Operations: Local Web Dashboard · Fleet Hub · Agentless SSH Scanner · Automated Scheduler · Parallel Collection Engine · Vault Lifecycle Management · Agent Self-Defense Hardening · Health & Readiness Probes
Performance notes:
- Stat-based FIM cache:
os.stat()metadata (mtime,ctime,size) is compared before any SHA-256 hash is computed; unchanged files are never read. - Lazy SHA-256 in package integrity: MD5 is checked first; SHA-256 is computed only on confirmed mismatch, eliminating redundant hashing on clean systems.
Project Structure
orin/
├── orin_config.json # User configuration (optional)
├── install.sh # Automated installer
├── pyproject.toml # Packaging metadata
├── src/orin/
│ ├── main.py # CLI entry point & subcommand router
│ ├── core/
│ │ ├── agent_signing.py # HMAC-SHA256 remote agent signing & verification
│ │ ├── config.py # JSON config loader with deep-copy defaults
│ │ ├── credentials.py # Secure credential handling
│ │ ├── crypto.py # HMAC-SHA256 signing, AES-256-GCM vault encryption
│ │ ├── database.py # SQLite ORM, connection pool, WAL mode
│ │ ├── health.py # /health, /ready, /api/metrics endpoints
│ │ ├── hub_server.py # Fleet hub server (orin hub-serve)
│ │ ├── logging.py # JSON structured logging with rotation
│ │ ├── notifier.py # Alert forwarding: webhooks, syslog, retry
│ │ ├── rate_limiter.py # SSH rate limiting with exponential backoff
│ │ ├── scanner.py # SSH agentless scanner orchestrator
│ │ ├── scheduler.py # Cron automation (orin schedule)
│ │ ├── self_defense.py # AppArmor / SELinux / Seccomp hardening
│ │ ├── self_verify.py # Runtime self-integrity check
│ │ ├── server.py # HTTP server + REST API + auto-token auth
│ │ ├── validators.py # Input validation & sanitization
│ │ └── dashboard.html # Single-page forensic console
│ ├── collectors/
│ │ ├── connections.py # /proc/net TCP/UDP socket parser
│ │ ├── crontabs.py # Cron job harvester & anomaly detector
│ │ ├── deleted_binaries.py # In-memory deleted executable recovery
│ │ ├── dns_forensics.py # DNS tunneling & DGA detection
│ │ ├── ebpf.py # eBPF program, pinned map & ld.so.preload auditor
│ │ ├── integrity.py # SHA-256 FIM with stat-cache acceleration
│ │ ├── kernel.py # LKM enumeration & kallsyms rootkit analysis
│ │ ├── logs.py # Auth log & journald collection
│ │ ├── parallel.py # ThreadPoolExecutor parallel collection engine
│ │ ├── persistence.py # Persistence mechanism detection
│ │ ├── pkg_integrity.py # dpkg md5sums verification
│ │ ├── privilege_audit.py # PAM / eBPF privilege escalation & credential tracking
│ │ ├── processes.py # /proc process tree harvester
│ │ ├── promisc.py # IFF_PROMISC flag auditor
│ │ ├── remote_agent.py # Stdlib-only remote collection agent (Python)
│ │ ├── remote_agent.sh # Pure-Bash fallback remote agent
│ │ ├── session_audit.py # wtmp / lastlog parser & anti-forensics detector
│ │ ├── suid.py # SUID/SGID discovery & baselining
│ │ ├── triggered_pcap.py # PCAP capture on forensic triggers
│ │ └── users.py # /etc/passwd & SSH authorized_keys inventory
│ └── analysis/
│ ├── diff.py # Snapshot comparator
│ ├── engine.py # Threat detection rules engine
│ ├── reporter.py # Markdown & HTML report generator
│ ├── timeline.py # Timeline delta calculator
│ └── unhide.py # Hidden process detector
└── tests/ # See docs/TESTING.md
Configuration
Orin searches for orin_config.json in ./ then /etc/orin/, falling back to built-in defaults. The keys below cover the most commonly tuned options. For a complete reference — all config keys, environment variables, and CLI credential flags — see CONFIGURATION.md.
{
"expected_ports": [22, 80, 443, 631, 3306, 5432, 6379, 8080, 8443],
"whitelisted_processes": ["code", "chrome", "language_server"],
"critical_paths": ["/etc/passwd", "/etc/shadow", "/etc/ssh/sshd_config", "/etc/sudoers", "/etc/crontab"],
"critical_dirs": ["/etc/cron.d", "/etc/systemd/system"]
}
Encrypted Evidence Vault
export ORIN_VAULT_PASSPHRASE="your-strong-passphrase"
sudo orin init
sudo orin collect
All snapshot data is encrypted before SQLite storage using AES-256-GCM with PBKDF2-HMAC-SHA256 key derivation (600,000 iterations). Without a passphrase, the vault operates in unencrypted mode with full backward compatibility.
Secure credential input alternatives:
--secret-file /path/to/pass.txt # File with mode 0600
--secret-prompt # Interactive masked prompt
--secret-env-var MY_VAR # Custom environment variable name
Alert Forwarding
Push critical alerts to analysts without polling the dashboard. Supports Slack Block Kit, Microsoft Teams Adaptive Cards, generic JSON webhooks, and syslog — all via Python stdlib (urllib.request).
{
"notifications": {
"enabled": true,
"min_severity": "high",
"syslog": { "enabled": true, "facility": "LOG_LOCAL0", "tag": "orin-alert" },
"webhooks": [
{
"name": "ops-slack",
"url": "http://192.168.1.10:8080/slack-webhook",
"format": "slack",
"min_severity": "critical",
"timeout_seconds": 10,
"enabled": true
}
],
"retry": { "max_attempts": 3, "backoff_seconds": 5 },
"audit_log": "/var/log/orin/notification_audit.log"
}
}
Forwarding runs automatically after every orin analyze. Failed deliveries retry with exponential backoff and are recorded in the JSONL audit log; they never abort the analysis cycle.
Threat Detection
See THREAT_DETECTION.md for the complete rule catalogue, covering:
- Process & execution anomalies (kernel thread masquerade, reverse shells, volatile-path execution)
- Kernel & rootkit indicators (suspicious
kallsymsentries, eBPF program anomalies) - Persistence mechanisms (SSH key drift, unauthorized accounts, cron job changes)
- Network & communications (promiscuous mode, DNS tunneling, DGA detection, C2 beaconing)
- File integrity & tampering (FIM violations, package integrity, YARA signature matches)
- Identity & privilege escalation (PAM brute force, sudo abuse, credential access)
Testing
ORIN_TEST_FAST=1 pytest --cov=orin --cov-report=term-missing
The CI pipeline enforces an 85% minimum coverage gate. See TESTING.md for environment setup, test modes, and contributor guidelines.
Contributing
Contributions are welcome. Before opening a pull request:
- Run
ORIN_TEST_FAST=1 pytestand confirm the 85% coverage gate passes. - New test files belong in
tests/, prefixedtest_*.py. - Review ROADMAP.md for current priorities to avoid duplicate effort.
- Keep collectors stdlib-only where possible — Orin's zero-dependency posture is a core design requirement.
Security
To report a vulnerability, do not open a public issue. Use GitHub's private security advisory workflow or contact the maintainer directly. See SECURITY.md for the disclosure process and response timelines.
Documentation
| Document | Description |
|---|---|
| DOCUMENTATION.md | Full practitioner's guide — architecture, workflows, module internals |
| CAPABILITIES.md | Complete annotated capability reference (57 modules) |
| CONFIGURATION.md | All config keys, environment variables, and CLI flags |
| THREAT_DETECTION.md | Complete threat detection rule catalogue |
| DASHBOARD_GUIDE.md | Dashboard architecture, API reference, and JavaScript function reference |
| SSH_GUIDE.md | Remote scanning, host key verification, and rate limiting |
| AGENT_SIGNING_GUIDE.md | HMAC-SHA256 agent signing for remote deployments |
| DATABASE_INTERNALS.md | Connection pool, PRAGMAs, and encrypted storage internals |
| PARALLEL_COLLECTION_FEATURE.md | Concurrent collection via ThreadPoolExecutor |
| EBPF_TROUBLESHOOTING.md | eBPF streaming setup, kernel prerequisites, error reference |
| SCHEMA.md | SQLite database schema reference |
| STATUS.md | Platform support matrix, deployment assumptions, known limitations |
| ROADMAP.md | Project direction and phased development plan |
| TESTING.md | Test setup, coverage requirements, and contributor guidelines |
| SECURITY.md | Vulnerability reporting and security design notes |
License
GNU AGPLv3 — see LICENSE for details.
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 orin-1.2.0.tar.gz.
File metadata
- Download URL: orin-1.2.0.tar.gz
- Upload date:
- Size: 448.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f1dfdac8002c1210d3772147600ec72e1300f7c3737e2dd3efa416deffafcb7
|
|
| MD5 |
9dd096159c644cefb1a5eedcfd670d20
|
|
| BLAKE2b-256 |
011dd3c8c035fcebdaabf1971f338d30d601bfb20d18ca9cbf1e0b12c25e2325
|
Provenance
The following attestation bundles were made for orin-1.2.0.tar.gz:
Publisher:
python-publish.yml on jaradat13/orin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orin-1.2.0.tar.gz -
Subject digest:
1f1dfdac8002c1210d3772147600ec72e1300f7c3737e2dd3efa416deffafcb7 - Sigstore transparency entry: 1804266380
- Sigstore integration time:
-
Permalink:
jaradat13/orin@a7874bf4b30daa8cec2355690caba960a1b95cc3 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/jaradat13
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@a7874bf4b30daa8cec2355690caba960a1b95cc3 -
Trigger Event:
release
-
Statement type:
File details
Details for the file orin-1.2.0-py3-none-any.whl.
File metadata
- Download URL: orin-1.2.0-py3-none-any.whl
- Upload date:
- Size: 341.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7daab8bb2e4b790108286717a77acf6d96cd3934c3dc68a0ef33971baced7f4f
|
|
| MD5 |
d76235cf77e4c2160a9f513bb379ae73
|
|
| BLAKE2b-256 |
e830bb9e0152260f47336b09bb030341778593d5dcc115b75a0342383dfdece5
|
Provenance
The following attestation bundles were made for orin-1.2.0-py3-none-any.whl:
Publisher:
python-publish.yml on jaradat13/orin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orin-1.2.0-py3-none-any.whl -
Subject digest:
7daab8bb2e4b790108286717a77acf6d96cd3934c3dc68a0ef33971baced7f4f - Sigstore transparency entry: 1804266462
- Sigstore integration time:
-
Permalink:
jaradat13/orin@a7874bf4b30daa8cec2355690caba960a1b95cc3 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/jaradat13
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@a7874bf4b30daa8cec2355690caba960a1b95cc3 -
Trigger Event:
release
-
Statement type: