
Zero-trust SSH-Bastion-Proxy mit Vault-gestützter Schlüsselverwaltung, RBAC-Richtliniendurchsetzung, vollständiger Sitzungsaufzeichnung und Admin-TUI für auditierbaren Zugriff auf Produktionsinfrastruktur.
Ein gehärteter, selbst gehosteter SSH-Bastion-Host mit Vault-gestützter Schlüsselverwaltung, RBAC-Richtliniendurchsetzung, vollständiger Sitzungsaufzeichnung und einer interaktiven Admin-TUI – entwickelt für Teams, die auditierbaren Zero-Trust-Zugriff auf Produktionsinfrastruktur benötigen.
Moderne Entwicklungsteams benötigen eine Möglichkeit, Entwicklern den minimal erforderlichen Zugriff zu gewähren, um ihre Arbeit zu erledigen – nicht mehr, nicht weniger. Die traditionelle SSH-Schlüsselverteilung ist fehleranfällig: Schlüssel werden geteilt, auf Laptops vergessen und erst Tage zu spät widerrufen.
ZTTP löst dies, indem es als einzige Tür in Ihre Infrastruktur fungiert:
Entwickler-Laptop
│
│ zttp
│ (Unter der Haube: SSH über Port 2224)
▼
┌─────────────────────────────────────────────────────────┐
│ ZTTP-Proxy │
│ │
│ ① Auth-Gate – bcrypt/Argon2id-Login-TUI │
│ ② RBAC-Engine – umgebungsbewusste Richtlinienprüfung │
│ ③ Vault-Abruf – ephemerer SSH-Schlüsselabruf │
│ ④ Bridge – transparenter TCP-Tunnel │
│ ⑤ Audit-Writer – ttyrec-Frame-Recorder │
└──────────┬──────────────────────────────────────────────┘
│ ssh (private IP, ephemerer Schlüssel)
▼
Zielserver
Infrastrukturdienste (Docker Compose):
.ttyrec-Format mit Zeitstempel-Frames aufgezeichnetServer (Proxy-Host):
2224make (optional, aber empfohlen)Entwickler (Client):
ssh-Befehl)git clone https://gitlab.com/Nihal799/zttp.git
cd zttp
cp .env.example .env
Bearbeiten Sie .env und setzen Sie mindestens:
PROXY_NODE_IP=<ihre-server-öffentliche-ip>
POSTGRES_PASSWORD=<ein-starkes-passwort>
VAULT_TOKEN=<ein-starker-vault-token>
⚠️ Committen Sie Ihre
.env-Datei niemals. Sie ist in.gitignoreaufgeführt.
make docker-up
# oder direkt:
docker compose -f deploy/docker-compose.yml up -d --build
make docker-ps
curl http://localhost:8080/healthz
make release PROXY_ADDR=<ihre-server-ip>:2224
Dies kompiliert Clients für alle Plattformen und aktualisiert dist/install.sh und dist/install.ps1 automatisch mit der korrekten Server-URL. Der Nginx-Container stellt diese unter http://<ihre-server-ip>:8555/ bereit.
curl -fsSL http://<proxy-ip>:8555/install.sh | bash
irm http://<proxy-ip>:8555/install.ps1 | iex
Nach der Installation verbinden Sie sich mit dem ZTTP-Gateway:
zttp
# oder direkt:
ssh -p 2224 <ihr-benutzername>@<proxy-ip>
Ihnen wird ein Terminal-Login-Bildschirm angezeigt. Nach der Authentifizierung sehen Sie eine Liste der Server, auf die Sie zugreifen dürfen.
Die gesamte Konfiguration erfolgt über Umgebungsvariablen (oder .env-Datei). Siehe .env.example für die vollständige Referenz.
ZTTP verwendet ein rollenbasiertes Modell. Jeder Benutzer erhält eine Rolle; jede Rolle hat eine Richtlinie, die definiert, auf welche Server-Umgebungen sie zugreifen kann.
Rollen und Serverzuweisungen werden über die Admin-Konsole verwaltet (siehe unten). Die RBAC-Engine führt alle Prüfungen in einer einzigen PostgreSQL-Abfrage durch – sie legt dem Client niemals offen, warum der Zugriff verweigert wurde (Enumeration-Schutz).
Verbinden Sie sich über das Gateway-Menü mit dem zttp-admin-Server oder melden Sie sich mit einem Konto an, das die Rolle security-admin besitzt.
Die Admin-Konsole bietet:
Alle Admin-Aktionen werden in
admin-actions.logim Audit-Volume protokolliert.
Alle Sitzungen werden im Docker-Volume zttp-audit-logs gespeichert (/var/log/zttp/audit/ im Container).
security-admin anmeldenCtrl+C drücken, um zurückzugehen# Aufzeichnungen auflisten
sudo ls /var/lib/docker/volumes/zttp-audit-logs/_data/
# Aufzeichnung mit ttyplay abspielen
sudo ttyplay /var/lib/docker/volumes/zttp-audit-logs/_data/<sitzungs-id>.ttyrec
# Admin-Aktions-Log lesen
sudo cat /var/lib/docker/volumes/zttp-audit-logs/_data/admin-actions.log
Anforderungen: Go 1.25+, Docker (für Cross-Kompilierung)
# Proxy + CLI für aktuelle Plattform bauen
make build
# CLI für alle Plattformen cross-kompilieren (Linux, macOS, Windows)
make release PROXY_ADDR=<proxy-ip>:2224
# Tests ausführen
make test
# Proxy lokal ausführen (erfordert laufende Postgres- und Vault-Instanzen)
make run-proxy
(Zum Abspielen der Demo klicken)
(Zum Abspielen der Demo klicken)
(Zum Abspielen der Demo klicken)
(Zum Abspielen der Demo klicken)
(Zum Abspielen der Demo klicken)
zttp/
├── cmd/
│ ├── proxy/ # Proxy-Server-Einstiegspunkt
│ └── zttp/ # CLI-Client-Einstiegspunkt
├── db/
│ └── migrations/ # PostgreSQL-Schema-Migrationen
├── deploy/
│ ├── docker-compose.yml
│ ├── Dockerfile.proxy
│ └── vault-seed.sh # Seedet Test-SSH-Schlüssel in Vault
├── dist/
│ ├── install.sh # Linux/macOS-Installer-Skript
│ └── install.ps1 # Windows-Installer-Skript
├── internal/
│ ├── audit/ # Admin-Aktionsprotokollierung
│ ├── auth/ # Benutzerauthentifizierung (bcrypt, Sperrung)
│ ├── cli/ # CLI-Client-TUI und Verbindungslogik
│ ├── config/ # Umgebungsbasierte Konfiguration
│ ├── killswitch/ # gRPC-Kill-Switch-Dienst
│ ├── proxy/ # SSH-Proxy, Gateway-TUI, Admin-TUI, Bridge
│ ├── rbac/ # Rollenbasierte Zugriffskontroll-Engine
│ ├── ratelimit/ # Pro-IP-Rate-Limiting
│ ├── session/ # Sitzungsverfolgung und DB-Speicher
│ └── vault/ # HashiCorp-Vault-SSH-Schlüssel-Client
├── proto/ # gRPC-Protokolldefinitionen
├── tools/
│ └── hashpw/ # CLI-Tool: bcrypt-Passwort-Hash generieren
├── .env.example # Konfigurationsvorlage
├── go.mod
└── Makefile
git checkout -b feat/ihr-featuremake testBitte committen Sie nicht:
.env oder Dateien, die Geheimnisse enthaltenzttp-Binary im Root ist .gitignored)Dieses Projekt ist proprietär. Alle Rechte vorbehalten.
Erstellt mit Go, PostgreSQL, HashiCorp Vault und Docker.
| Problem | ZTTP-Lösung |
|---|
| SSH-Schlüssel werden auf Laptops geteilt | Schlüssel leben ausschließlich in HashiCorp Vault – nie auf der Festplatte |
| Keine Transparenz darüber, wer was getan hat | Jeder Tastendruck wird im .ttyrec-Format aufgezeichnet |
| Pauschaler Produktionszugriff | Rollenbasierte Richtlinien-Engine erzwingt umgebungsspezifische Regeln |
| Keine Möglichkeit, eine aktive Sitzung zu stoppen | Kill-Switch-gRPC-Endpunkt beendet jede laufende Sitzung |
| Undurchsichtiger Zugriff für Auditoren | Admin-TUI mit Sitzungswiedergabe, Text-Logs und Admin-Aktions-Logs |
| Dienst | Zweck |
|---|
zttp-proxy | Der SSH-Bastion (Go-Binary) |
zttp-postgres | Control-Plane-Datenbank (Benutzer, Server, RBAC-Richtlinien) |
zttp-vault | HashiCorp Vault – speichert SSH-Private-Keys |
zttp-nginx | Stellt CLI-Installer unter /release/ bereit |
zttp-init-audit | Einmaliger Container, der Volume-Berechtigungen korrigiert |
| Variable | Standard | Beschreibung |
|---|
PROXY_LISTEN_ADDR | 0.0.0.0:2222 | SSH-Proxy-Bind-Adresse |
HTTP_LISTEN_ADDR | 0.0.0.0:8080 | HTTP-Adresse für Health-Checks |
GRPC_LISTEN_ADDR | 0.0.0.0:9090 | Kill-Switch-gRPC-Adresse |
PROXY_NODE_IP | 127.0.0.1 | Externe IP, die in CLI-Binaries eingebettet wird |
DATABASE_URL | postgres://zttp:... | PostgreSQL-Verbindungszeichenfolge |
VAULT_ADDR | http://localhost:8201 | Vault-Server-URL |
VAULT_TOKEN | dev-root-token-zttp | Vault-Root-Token (nur Dev – in Produktion AppRole verwenden) |
MAX_FAILED_ATTEMPTS | 5 | Sperrschwelle |
LOCKOUT_DURATION | 15m | Dauer der Kontosperrung |
RATE_LIMIT_PER_MIN | 10 | Maximale Login-Versuche pro Minute pro IP |
AUDIT_LOG_DIR | /var/log/zttp/audit | Pfad zum Sitzungsaufzeichnungsverzeichnis |
SOC_WEBHOOK_URL | (leer) | Optionaler Webhook für SOC-Warnmeldungen |
| Rolle | Zugriff |
|---|
security-admin | Vollzugriff auf alle Umgebungen + Admin-Konsole |
sre-tier1 | Alle Umgebungen einschließlich Produktion |
sre-tier2 | Nur Staging und Entwicklung |
dev | Nur Entwicklungsumgebung |
readonly | Entwicklungsumgebung, eingeschränkter Befehlsatz |
| Menüoption | Beschreibung |
|---|
| Benutzer hinzufügen | Neuen Benutzer mit Rollenzuweisung erstellen |
| Server hinzufügen | Zielserver registrieren (Hostname, IP, Umgebung, SSH-Benutzer) |
| Serverzugriff verwalten | Benutzerzugriff auf bestimmte Server gewähren oder entziehen |
| Benutzer anzeigen | Alle Benutzer und ihre Rollen auflisten |
| Server anzeigen | Alle registrierten Server auflisten |
| Audit-Logs anzeigen | Sitzungen durchsuchen, Aufzeichnungen wiedergeben, Text-Logs lesen |
| [ Zurück ] | Zurück zum Server-Gateway |
| Befehl | Beschreibung |
|---|
make build | Proxy und CLI für aktuelle Plattform bauen |
make release | CLI-Binaries für alle Plattformen cross-kompilieren |
make release-docker | Cross-Kompilierung in einem Docker-Container (vermeidet snap/WSL-Probleme) |
make docker-up | Alle Docker-Compose-Dienste starten |
make docker-down | Alle Dienste stoppen und Volumes löschen |
make docker-logs | Proxy-Logs verfolgen |
make docker-ps | Containerstatus anzeigen |
make test | Alle Go-Tests ausführen |
make migrate | Datenbankmigrationen anwenden |
make seed | Entwicklungsdaten seeden |
make hashpw PW=meinpasswort | bcrypt-Hash für manuelles DB-Seeding generieren |
make clean | Kompilierte Binaries und Build-Cache entfernen |
| Ebene | Mechanismus |
|---|
| Transport | Alle Client-Verbindungen sind SSH (verschlüsselt während der Übertragung) |
| Authentifizierung | bcrypt (Kosten 12) / Argon2id – Klartext ist im Schema strukturell verboten |
| Brute-Force-Schutz | Kontosperrung (5 Versuche / 15 Min.) + Pro-IP-Rate-Limiter |
| Autorisierung | Single-JOIN-RBAC-Abfrage – Ablehnungen sind immer generisch („Permission denied") |
| Geheimnisverwaltung | SSH-Private-Keys werden ausschließlich in HashiCorp Vault gespeichert und ephemer abgerufen |
| Audit-Trail | Vollständige Tastendruck-Aufzeichnung im .ttyrec-Format, unveränderliches Append-Only-Admin-Log |
| Prozessisolation | Proxy läuft als Nicht-Root (UID 65532) in einem distroless-Container |
| Kill-Switch | Jede laufende Sitzung kann per gRPC beendet werden, ohne den Proxy neu zu starten |