Open-source attack-surface discovery, security posture analysis and threat intelligence for modern infrastructure.
SentinelForge is a defensive security intelligence platform that helps organizations discover and analyze their own attack surfaces. It performs safe, passive reconnaissance against authorized targets and produces structured findings, risk scores, and professional security reports.
Key capabilities:
- Asset Discovery — Root domains, subdomains, DNS records, certificates
- DNS Analysis — SPF, DMARC, DKIM, CAA, DNSSEC checks
- TLS Analysis — Certificate validity, chain issues, protocol versions, cipher suites
- HTTP Security — HSTS, CSP, X-Content-Type-Options, Referrer-Policy, cookie flags
- Technology Detection — Frameworks, CMS, servers, CDN, analytics fingerprinting
- Risk Scoring — Transparent, documented methodology with severity-weighted composites
- Threat Intelligence — IP reputation, ASN info, passive DNS enrichment
- Security Reports — JSON and PDF export with executive summaries
- Web Dashboard — Real-time security posture visualization
- CLI — Full command-line access to all scanning capabilities
- REST API — OpenAPI-documented endpoints for integration
SentinelForge is designed exclusively for defensive security assessments of infrastructure you own or have explicit authorization to test.
- Users must confirm authorization before every scan
- Private IPs, localhost, and metadata endpoints are blocked
- SSRF protections prevent scanning unauthorized targets
- The platform is not an unrestricted internet scanner
- See SECURITY.md for the full security model
| Feature | Description |
|---|---|
| Scan Pipeline | Modular scanner orchestration with 5 specialized modules |
| Real-time Dashboard | Security score, findings, assets, and risk trends |
| Findings Management | Severity, category, evidence, remediation for each finding |
| Risk Engine | Documented scoring: Critical=10, High=8, Medium=5, Low=2, Info=0 |
| CLI Tool | sentinelforge scan, check, report, assets, dashboard |
| REST API | Full CRUD with JWT authentication and OpenAPI docs |
| Threat Intel | Demo provider + CIRCL passive DNS enrichment |
| Report Generation | JSON export with executive summary, scope, findings, and recommendations |
graph TD
A[Frontend - Next.js] --> B[FastAPI Backend]
B --> C[Scan Orchestrator]
C --> D1[DNS Scanner]
C --> D2[Certificate Scanner]
C --> D3[HTTP Security Scanner]
C --> D4[Technology Scanner]
C --> D5[Threat Intel Scanner]
D1 --> E[Risk Engine]
D2 --> E
D3 --> E
D4 --> E
D5 --> E
E --> F[Database - SQLite/PostgreSQL]
B --> G[Threat Intel Provider]
G --> H[Demo Provider]
G --> I[CIRCL Passive DNS]
Components:
| Component | Technology | Purpose |
|---|---|---|
| Frontend | Next.js 14, TypeScript, Tailwind CSS | Web dashboard and UI |
| Backend | FastAPI, Python 3.11+ | API server and scan orchestration |
| Database | SQLite (demo) / PostgreSQL (production) | Persistent storage |
| CLI | Click, Rich | Terminal interface |
| Scanner | 5 modules (DNS, TLS, HTTP, Tech, Threat Intel) | Security analysis |
| Risk Engine | Weighted composite scoring | Risk quantification |
- Python 3.11+
- Node.js 18+
- npm (comes with Node)
Optional (for production):
- PostgreSQL 14+
- Redis 7+
- Docker and Docker Compose
The fastest way to get SentinelForge running locally:
# Clone the repository
git clone https://github.com/jakobxtb/SentinelForge.git
cd SentinelForge
# Backend setup
python3.11 -m venv venv
source venv/bin/activate
pip install -e ".[dev]"
# Start the backend (uses SQLite in demo mode)
APP_ENV=development \
DATABASE_URL="sqlite+aiosqlite:///sentinelforge_demo.db" \
APP_SECRET_KEY=dev-secret \
JWT_SECRET_KEY=dev-jwt-secret \
CORS_ORIGINS='["http://localhost:3000"]' \
THREAT_INTEL_DEMO_MODE=true \
uvicorn sentinelforge.main:app --host 0.0.0.0 --port 8000
# In a second terminal — Frontend
cd frontend
npm install
NEXT_PUBLIC_API_URL=http://localhost:3000 npm run devThen open:
- Dashboard: http://localhost:3000
- API Docs: http://localhost:8000/api/docs
Default demo credentials:
- Username:
demo - Password:
demo1234
# Copy environment file
cp .env.example .env
# Build and start all services
docker compose up --build
# Access:
# Dashboard: http://localhost:3000
# API: http://localhost:8000/api/docscd sentinelforge/
source venv/bin/activate
# Start with SQLite (demo mode)
APP_ENV=development \
DATABASE_URL="sqlite+aiosqlite:///sentinelforge_demo.db" \
APP_SECRET_KEY=dev-secret \
JWT_SECRET_KEY=dev-jwt-secret \
CORS_ORIGINS='["http://localhost:3000"]' \
uvicorn sentinelforge.main:app --reload --host 0.0.0.0 --port 8000The backend automatically:
- Creates database tables on startup
- Seeds a demo user (
demo/demo1234) - Registers all 5 scanner modules
- Enables rate limiting and security headers
cd frontend/
npm install
npm run devThe frontend proxies API calls to http://localhost:8000 via Next.js rewrites configured in next.config.js.
In development mode, scans execute synchronously in the API process. For production, the worker system (sentinelforge/workers/) supports async job processing via Redis + arq. To start a worker:
# Requires Redis running
arq sentinelforge.workers.run_scan_job| Page | Path | Description |
|---|---|---|
| Dashboard | /dashboard |
Security score, finding distribution, recent scans |
| Scans | /scans |
Scan history, create new scans |
| Findings | /findings |
All findings with severity/category filters |
| Assets | /assets |
Discovered asset inventory |
| Threat Intel | /threat-intel |
Intelligence providers and data sources |
| Reports | /reports |
Report generation and export |
| Settings | /settings |
Scanner config, security settings, risk scoring |
All pages show loading states, error states, and empty states when data is unavailable.
Base URL: http://localhost:8000/api/v1
OpenAPI Documentation: http://localhost:8000/api/docs
# Register
curl -X POST http://localhost:8000/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "user@test.com", "username": "testuser", "password": "password123"}'
# Login
curl -X POST http://localhost:8000/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "testuser", "password": "password123"}'
# Use token in subsequent requests
curl http://localhost:8000/api/v1/dashboard \
-H "Authorization: Bearer <token>"| Method | Path | Description |
|---|---|---|
GET |
/health |
Health check |
POST |
/api/v1/auth/register |
Register user |
POST |
/api/v1/auth/login |
Get JWT token |
GET |
/api/v1/auth/me |
Current user profile |
POST |
/api/v1/targets |
Create scan target |
GET |
/api/v1/targets |
List targets |
POST |
/api/v1/scans |
Start scan |
GET |
/api/v1/scans |
List scans |
GET |
/api/v1/scans/{id} |
Scan details with findings |
DELETE |
/api/v1/scans/{id} |
Delete scan |
GET |
/api/v1/findings |
List findings (filterable) |
PATCH |
/api/v1/findings/{id} |
Update finding |
GET |
/api/v1/assets |
List discovered assets |
GET |
/api/v1/risk-scores/{scan_id} |
Risk score details |
GET |
/api/v1/dashboard |
Dashboard statistics |
POST |
/api/v1/reports |
Generate report |
curl http://localhost:8000/health
# {"status": "healthy", "version": "0.1.0"}SentinelForge includes a full CLI for terminal-based scanning.
sentinelforge --help
sentinelforge --versionAuthenticate with the SentinelForge API.
sentinelforge login
# Prompts for username and password
# Stores JWT token in ~/.sentinelforge_tokenScan a domain for security issues.
sentinelforge scan example.com
sentinelforge scan example.com -m dns,certificateArguments:
domain— Target domain to scan (required)-m, --modules— Comma-separated scanner modules (optional, runs all if omitted)
Safety: Prompts for authorization confirmation before scanning.
List discovered assets for a domain.
sentinelforge assets example.comGenerate a security report for a completed scan.
sentinelforge report <scan-id>
sentinelforge report <scan-id> -f pdfRun a specific security check against a domain.
sentinelforge check tls example.com
sentinelforge check dns example.com
sentinelforge check http example.com
sentinelforge check all example.comList all recent scans.
sentinelforge list-scansShow dashboard summary in the terminal.
sentinelforge dashboardSentinelForge uses a modular scanner framework. Each scanner module implements the BaseScanner abstract class:
class BaseScanner(ABC):
@property
def module_type(self) -> ScannerModule: ...
async def validate_target(self, target: str) -> bool: ...
async def scan(self, target: str, progress_callback=None) -> tuple[list[Finding], list[Asset]]: ...The ScannerOrchestrator manages module registration, execution, progress tracking, and result aggregation. Each module runs with a 5-minute timeout.
- Create a new module in
sentinelforge/scanner/modules/ - Extend
BaseScannerand implement all abstract methods - Register it in
sentinelforge/scanner/modules/__init__.py - Add it to the orchestrator in
sentinelforge/api/routes.py
The DNS scanner performs passive analysis:
- Record Enumeration — A, AAAA, MX, NS, TXT, CNAME, SOA, CAA records
- SPF Check — Detects missing SPF, soft-fail, open relay (+all)
- DMARC Check — Detects missing DMARC, weak policies (p=none)
- DKIM Check — Probes common selectors (default, google, selector1, etc.)
- CAA Check — Detects Certificate Authority Authorization records
- DNSSEC Check — Tests for DNSSEC validation support
- TXT Analysis — Flags potentially sensitive data in public TXT records
- MX Redundancy — Checks for insufficient MX record redundancy
The certificate scanner analyzes TLS configuration:
- Certificate Expiration — Critical (expired), warning (7/30/90 days)
- Hostname Mismatch — SAN and wildcard verification
- Self-signed Detection — Identifies untrusted certificates
- Key Strength — Weak cipher detection (RC4, DES, 3DES, NULL)
- Protocol Versions — Tests for deprecated SSLv3, TLSv1, TLSv1.1
- Cipher Suites — Identifies weak cipher negotiation
The HTTP scanner checks security headers and configuration:
Headers checked:
Strict-Transport-Security(HSTS) — max-age, includeSubDomains, preloadContent-Security-Policy(CSP) — presence and policyX-Content-Type-Options— nosniff enforcementX-Frame-Options— clickjacking protectionReferrer-Policy— referrer leakage preventionPermissions-Policy— feature restrictionX-XSS-Protection— deprecated XSS auditor detection
Other checks:
- HTTP-to-HTTPS redirect enforcement
- Cookie security flags (Secure, HttpOnly, SameSite)
- Server header technology exposure
- X-Powered-By header leakage
- Redirect chain security
SentinelForge uses a provider abstraction for threat intelligence enrichment:
| Provider | Type | Status |
|---|---|---|
| Demo Provider | Sample data | Always available (offline) |
| CIRCL Passive DNS | Free API | Optional (requires network) |
In demo mode (default), the system provides sample threat intelligence data. For real enrichment, configure CIRCL access:
THREAT_INTEL_DEMO_MODE=falseThe ThreatIntelProvider interface makes it straightforward to add new providers.
SentinelForge uses a transparent, documented risk-scoring methodology:
| Severity | Weight |
|---|---|
| Critical | 10.0 |
| High | 8.0 |
| Medium | 5.0 |
| Low | 2.0 |
| Info | 0.0 |
| Category | Weight |
|---|---|
| TLS | 1.2 |
| DNS | 1.0 |
| HTTP | 1.0 |
| Technology | 0.8 |
| Threat Intel | 1.3 |
| Scanner Error | 0.0 |
- Finding Risk (50%) — Weighted sum of finding severity × category, log-normalized
- Configuration Risk (30%) — TLS/HTTP/DNS finding severity sum
- Asset Risk (20%) — Asset count and diversity exposure
Overall = Finding Risk × 0.50 + Configuration Risk × 0.30 + Asset Risk × 0.20
| Range | Label | Meaning |
|---|---|---|
| 0-20 | Excellent | Strong security posture |
| 20-40 | Good | Minor improvements needed |
| 40-60 | Moderate | Action recommended |
| 60-80 | High Risk | Immediate attention needed |
| 80-100 | Critical | Urgent remediation required |
This is a transparent scoring methodology, not an industry-certified standard.
SentinelForge implements multiple layers of security:
- Domain format validation (RFC-compliant regex)
- Blocked hostnames:
localhost,127.0.0.1,0.0.0.0,metadata.google.internal,169.254.169.254 - Private IP blocking: RFC 1918 (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16), link-local (169.254.0.0/16), loopback (127.0.0.0/8), IPv6 loopback/ULA/link-local - DNS resolution validation (resolved IPs checked against blocked networks)
- All HTTP requests validate target URLs against blocked networks
- Redirect URLs are sanitized to prevent open redirects
- Subprocess arguments are validated to prevent injection
- JWT-based authentication with bcrypt password hashing
- Per-user target and scan ownership
- Authorization confirmation required before every scan
- Audit logging for all security-relevant actions
- In-memory per-IP rate limiting (default: 100 requests/minute)
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 0Referrer-Policy: strict-origin-when-cross-originPermissions-Policy: camera=(), microphone=(), geolocation=()- HSTS (production mode)
- 5-minute timeout per scanner module
- 15-second HTTP request timeout
- 10-second DNS resolver timeout
| Variable | Default | Description |
|---|---|---|
APP_ENV |
development |
Environment (development/staging/production/testing) |
APP_DEBUG |
false |
Enable debug logging |
APP_SECRET_KEY |
— | Application secret (change in production!) |
APP_HOST |
0.0.0.0 |
Server bind address |
APP_PORT |
8000 |
Server port |
DATABASE_URL |
sqlite+aiosqlite:///sentinelforge.db |
Database connection string |
REDIS_URL |
redis://localhost:6379/0 |
Redis URL (optional) |
JWT_SECRET_KEY |
— | JWT signing secret (change in production!) |
JWT_ALGORITHM |
HS256 |
JWT algorithm |
JWT_EXPIRATION_MINUTES |
1440 |
Token expiration (24h default) |
CORS_ORIGINS |
["http://localhost:3000"] |
Allowed CORS origins |
SCAN_TIMEOUT_SECONDS |
300 |
Scanner module timeout |
SCAN_MAX_CONCURRENT |
5 |
Max concurrent scans |
RATE_LIMIT_REQUESTS |
100 |
Requests per window |
RATE_LIMIT_WINDOW_SECONDS |
60 |
Rate limit window |
THREAT_INTEL_ENABLED |
true |
Enable threat intel |
THREAT_INTEL_DEMO_MODE |
true |
Use demo provider only |
LOG_LEVEL |
INFO |
Log level |
LOG_FORMAT |
json |
Log format (json/console) |
See .env.example for a complete template with example values.
cd sentinelforge/
source venv/bin/activate
# Run all tests
APP_ENV=testing \
DATABASE_URL="sqlite+aiosqlite:///:memory:" \
APP_SECRET_KEY=test-secret \
JWT_SECRET_KEY=test-jwt-secret \
CORS_ORIGINS='["http://localhost:3000"]' \
pytest tests/ -v| Category | Tests | What's Tested |
|---|---|---|
| Security | 29 | SSRF, target validation, IP blocking, URL safety, subprocess safety |
| Risk Engine | 11 | Scoring, severity distribution, weight verification |
| Scanner | 9 | Orchestration, module registration, error handling |
| API | 21 | Auth, targets, scans, findings, dashboard, registration |
| Threat Intel | 7 | Provider lookup, aggregation |
| Total | 77 |
cd frontend/
npm install
npm run buildcp .env.example .env
docker compose up --builddocker compose downdocker compose logs backend
docker compose logs frontend
docker compose logs -f # Follow alldocker compose up --build --force-recreatedocker compose down -v| Service | Port | Description |
|---|---|---|
postgres |
5432 | PostgreSQL database |
redis |
6379 | Redis cache/queue |
backend |
8000 | FastAPI server |
frontend |
3000 | Next.js dashboard |
# Find process on port 8000
lsof -i :8000
# Kill it
kill <PID># For SQLite demo mode, just delete the DB file
rm sentinelforge_demo.db
# The app recreates it on startup- Verify backend is running on port 8000:
curl http://localhost:8000/health - Check
CORS_ORIGINSincludeshttp://localhost:3000 - Check
NEXT_PUBLIC_API_URLis set tohttp://localhost:3000(frontend proxies via Next.js rewrites)
SentinelForge requires Python 3.11+. Check your version:
python3 --version
# If 3.11+ not available:
python3.11 -m venv venv # Use specific version# Clear cache
rm -rf node_modules package-lock.json
npm installsentinelforge/
├── sentinelforge/ # Python package
│ ├── api/ # FastAPI routes, auth, schemas
│ ├── config/ # Pydantic settings
│ ├── database/ # SQLAlchemy models and connection
│ ├── risk_engine/ # Risk scoring engine
│ ├── scanner/ # Scanner framework
│ │ └── modules/ # DNS, TLS, HTTP, Tech, Threat Intel
│ ├── shared/ # Security utilities, SSRF protection
│ ├── threat_intelligence/ # Threat intel providers
│ ├── workers/ # Async job workers
│ ├── cli.py # CLI entry point
│ └── main.py # FastAPI application
├── frontend/ # Next.js application
│ └── src/
│ ├── app/ # Page routes (dashboard, scans, etc.)
│ ├── components/ # UI components and charts
│ └── lib/ # API client, utilities
├── tests/ # Pytest test suite
│ └── unit/ # Unit and integration tests
├── docker/ # Dockerfiles
├── docs/ # Documentation
├── .github/ # CI/CD workflows
├── docker-compose.yml # Docker Compose config
├── pyproject.toml # Python project config
├── README.md # This file
├── SECURITY.md # Security model
├── CONTRIBUTING.md # Contributing guide
├── CODE_OF_CONDUCT.md # Code of conduct
├── CHANGELOG.md # Release history
└── .env.example # Environment template
See CONTRIBUTING.md for guidelines on:
- Setting up the development environment
- Running tests before submitting PRs
- Code style and architecture guidelines
- Adding new scanner modules
See SECURITY.md for:
- Responsible disclosure policy
- Security architecture overview
- Threat model
- Deployment recommendations
If you discover a security vulnerability, please report it privately via GitHub Security Advisories.
SentinelForge is released under the MIT License.
SentinelForge is a defensive security tool designed for:
- Scanning infrastructure you own
- Assessing systems you have explicit authorization to test
- Security audits of your own domains and applications
Do not use SentinelForge to:
- Scan systems without authorization
- Perform offensive security testing
- Discover vulnerabilities in third-party infrastructure
- Conduct reconnaissance for malicious purposes
The platform includes built-in safeguards (authorization confirmation, target validation, SSRF protection) to prevent misuse. Unauthorized scanning is illegal in most jurisdictions.
- WebSocket-based real-time scan progress
- PDF report generation with visualizations
- CVE database integration (NVD API)
- Additional threat intel providers (AbuseIPDB, VirusTotal)
- Subdomain enumeration module
- Port scanning (authorized targets only)
- User roles and team management
- Scheduled scans
- Webhook notifications
- Kubernetes deployment manifests