
Selbstgehostete Netzwerkerkennungs- und Suchmaschine mit kontinuierlichem Port-Scanning, tiefer Protokollanalyse über ~100 Dienste, lokaler CVE-Abgleich und Volltextsuche für Inventarisierung der Infrastruktur und Risikoüberwachung.
Selbstgehostete Netzwerkerkennung & Suche – Ihr eigenes Shodan, auf Ihrer Hardware.
TCP/UDP-Scanning · ~100 Protokoll-Sonden · TLS/JARM-Fingerabdrücke · CVE-Abgleich · Volltextsuche · Delta-Verfolgung · Benachrichtigungen
Schnellstart · Funktionen · Architektur · Dokumentation · Produktion
Wichtig. Scannen Sie nur Netzwerke, die Ihnen gehören oder für die Sie eine schriftliche Genehmigung haben. UltraViolet führt passive Diensterkennung durch – es nutzt keine Schwachstellen aus.
| Anwendungsfall |
|---|
Einzelmandant, ein Docker Compose Stack, volle Kontrolle über Ihre Daten.
Erkennung
SCAN_ALLOWED_CIDRS mit Host- und Port-LimitsTiefensonden (~100 Protokolle)
robots.txt, security.txt, Tech-StackAnreicherung
CVE & Risiko
Betrieb
viewer / operator / admin), JWT + Refresh-Tokens/metrics, optionales Grafana-Profilflowchart TB
Browser["Browser"]
FE["service-frontend<br/>React + nginx"]
API["uv-api<br/>REST · WS · metrics"]
PG[("PostgreSQL 16")]
SCAN["uv-scanner<br/>probe pipeline"]
Browser --> FE
FE -->|"/api"| API
FE -->|"/realtime"| API
API <--> PG
SCAN <--> PG
API -.->|LISTEN/NOTIFY| API
Das Release-UI-Bild proxyt /api/ und /realtime an uv-api – Single Origin, kein Frontend-Neubau pro API-URL.
Backend-Entwicklungsregeln: CLAUDE.md.
Anforderungen: Docker Engine ≥ 24, ~4 GB RAM, Linux amd64 für Produktionsimages.
git clone https://github.com/yakushstanislav/UltraViolet.git
cd UltraViolet/service-env
cp .env.example .env
mkdir -p secrets
openssl rand -hex 32 > secrets/postgres_password
openssl rand -hex 32 > secrets/auth_jwt_secret
cd ..
make dev
| URL | Zweck |
|---|---|
| http://localhost:3000 | UI (API über nginx /api/) |
| http://localhost:8080 | API direkt |
Dev-Bootstrap: admin / admin (nur wenn APP_ENV≠production).
Vollständiger Leitfaden – VitePress in service-documentation-frontend/docs/:
make docs-dev # → http://localhost:5173
In der Produktion das docs-Profil aktivieren:
cd service-env && docker compose --profile docs up -d
# → http://localhost:${UV_DOCUMENTATION_PORT:-3002}
Wichtige Abschnitte: Installation · Scannen · API · Bereitstellung · Offline-Installation.
make dev # compose prod + dev override, hot-rebuild
make dev-db # PostgreSQL nur auf :5432
cd service-api && make build
export LOGGER_NAME=uv-api LOGGER_DEBUG=true
export SERVER_ADDR=0.0.0.0 SERVER_PORT=8080
export METRICS_ADDR=0.0.0.0 METRICS_PORT=9090
export REALTIME_ADDR=0.0.0.0 REALTIME_PORT=8081
export POSTGRES_ADDR=localhost POSTGRES_PORT=5432
export POSTGRES_USERNAME=ultraviolet
export POSTGRES_PASSWORD="$(cat ../service-env/secrets/postgres_password)"
export POSTGRES_DATABASE=ultraviolet
export POSTGRES_SCHEMA_PATH="$(pwd)/deploy/migrations"
export AUTH_JWT_SECRET="$(cat ../service-env/secrets/auth_jwt_secret)"
./bin/uv-api
Frontend: cd service-frontend && npm run dev (Vite proxyt /api → :8080, /realtime → :8081).
cd service-env && make geoip-download # IPLocate MMDB → geoip/
make -C service-env cve-catalog-dump # CVE-Dump (erfordert laufendes Postgres)
make build && make lint && make frontend-build && make docs-build
Zielplattform: linux/amd64. Auf Apple Silicon setzen Sie DOCKER_PLATFORM=linux/amd64 für Offline-Archive.
git tag v0.1.0
make release VERSION=v0.1.0
make release-promote VERSION=v0.1.0 # :latest – separater Schritt
| Archiv | Inhalt |
|---|---|
ultraviolet-vX.Y.Z.tar.gz | compose, Skripte, .env.example (~50 KB, online) |
ultraviolet-vX.Y.Z-offline.tar.gz | + amd64 Docker-Images |
ultraviolet-vX.Y.Z-offline-full.tar.gz | + CVE-Seed + GeoIP-MMDB |
Online: Entpacken → cp .env.example .env → ./install.sh (Pull vom Registry).
Offline: ./install.sh (docker load, kein Pull). Upgrade: .env, secrets/ und das Postgres-Volume behalten → ./upgrade.sh.
Variablen: UV_REGISTRY (Standard docker.io/ultraviolet), DRY_RUN=1 – lokaler Smoke-Build ohne Push.
# vom Build-Rechner aus
scp dist/ultraviolet-v0.1.0-offline.tar.gz user@host:~/
# auf dem Server (Docker ≥ 24, amd64)
tar xzf ultraviolet-v0.1.0-offline.tar.gz && cd ultraviolet-v0.1.0
cp .env.example .env
./install.sh
Upgrade (Daten erhalten):
docker compose -f docker-compose.yml down
# .env + secrets/ sichern, das neue Archiv entpacken, ./upgrade.sh ausführen
Halten Sie den Verzeichnisnamen (ultraviolet-v0.1.0) stabil – das Docker-Volume postgres-data ist daran gebunden.
secrets/ speichern, niemals in Git.CORS_ALLOWED_ORIGINS auf reale UI-Origins setzen.SCAN_ALLOWED_CIDRS sowie Host/Port-Limits konfigurieren.AUTH_JWT_SECRET ändern (install.sh lehnt Platzhalter ab).APP_ENV=production setzen – uv-api lehnt admin/admin und Passwörter kürzer als 8 Zeichen ab.service-env/examples/nginx-tls.conf.AUDIT_TRUST_PROXY_HEADERS=true setzen.service-env/scripts/backup.sh + Cron; upgrade.sh erstellt ebenfalls einen Dump.TLS-Terminierung auf externem nginx – die UI nur an Loopback binden:
# docker-compose.override.yml
services:
service-frontend:
ports:
- "127.0.0.1:3000:8080"
CORS_ALLOWED_ORIGINS=https://ultraviolet.example.com
AUDIT_TRUST_PROXY_HEADERS=true
Sub-Pfad (/ultraviolet/):
VITE_BASE_PATH=/ultraviolet/ make frontend-build
# UV_BASE_PATH=/ultraviolet/ in compose – muss VITE_BASE_PATH entsprechen
Backup-Cron (täglich, 14-tägige Aufbewahrung):
0 3 * * * cd /opt/ultraviolet/service-env && ./scripts/backup.sh && find backups -name 'uv-*.dump' -mtime +14 -delete
GeoIP-Aktualisierung (1. des Monats):
0 4 1 * * cd /opt/ultraviolet/service-env && ./scripts/geoip-refresh.sh >> /var/log/uv-geoip.log 2>&1
Nach POST /v1/auth/login erhalten Sie ein access_token (Bearer) und ein refresh_token (/v1/auth/refresh).
| Rolle | Fähigkeiten |
|---|---|
viewer | Hosts lesen, Suche, CVEs, Dashboard |
operator | + Scans starten und verwalten |
admin | + Benutzer, Audit, Einstellungen |
GET /v1/me · GET /v1/version · GET /readyz (Health + Version + Commit).
Siehe CONTRIBUTING.md. Sicherheitsmeldungen: SECURITY.md. Community-Standards: CODE_OF_CONDUCT.md.
UltraViolet wird unter der MIT-Lizenz veröffentlicht.
UltraViolet – entdecken Sie, was Ihnen gehört, verstehen Sie, was sich geändert hat, behalten Sie es in Ihrem Netzwerk.
| Ergebnis |
|---|
| Perimeter & Inventar | Kontinuierliche Erkennung offener Ports und Dienste über CIDR-Bereiche |
| Infrastruktur-Suche | Volltextsuche über HTTP-Bodies, Banner, TLS, DNS und CVEs |
| Risiko & Compliance | Lokaler NVD-Abgleich plus CISA KEV und EPSS – keine Cloud-Abhängigkeit |
| Luftspalt-Bereitstellungen | Offline-Archiv mit Docker-Images, CVE-Seed und GeoIP-MMDB auf der Festplatte |
| Änderungsverfolgung | Deltas zwischen Scans, WebSocket-Ereignisse, Benachrichtigungen zu gespeicherten Suchen |
| Verzeichnis | Zweck |
|---|
service-api/ | Go: uv-api (HTTP-API, WebSocket, Worker) + uv-scanner (Pipeline) |
service-frontend/ | React 19 + Vite + RTK – Scans, Hosts, Suche, Dashboard |
service-documentation-frontend/ | VitePress – Benutzer- und Bedienerdokumentation |
service-env/ | docker-compose, Secrets, install.sh / upgrade.sh / Backup |
| Prometheus |
:9090/metrics; Grafana über das observability-Profil.service-env/scripts/geoip-refresh.sh monatlich per Cron.