This commit is contained in:
2026-08-26 07:30:25 +02:00
parent 596ae70736
commit e56506a4df
13 changed files with 3172 additions and 1 deletions
+231 -1
View File
@@ -1,2 +1,232 @@
# pawtoolbox
# PAW Toolbox
Eine zusammengeführte Go-Anwendung für eine Privileged Access Workstation (PAW). Sie vereint die bisherigen Projekte `virtual-appstore`, `virtual-clipboard` und `virtual-clipboard-generator`, ergänzt einen einfachen Dateiaustausch und bündelt typische Sysadmin-/AD-Werkzeuge in einer gemeinsamen Oberfläche.
## Enthaltene Funktionen
### Kernfunktionen
- **App Launcher**: zentrale Kachelübersicht aus `apps.json`, Suche und Kategorien.
- **Virtuelle Zwischenablage**: persistente Räume und Verläufe, klickbare Raumverwaltung mit Öffnen/Leeren/Löschen, SSE-Aktualisierung und JSON-Persistenz.
- **Secrets**: maskierte Clipboard-Einträge, TTL und optional einmaliger Abruf.
- **Passwortgenerator**: kryptographisch zufällige Kennwörter; direkte Übergabe in einen Clipboard-Raum ohne separaten Dienst.
- **Dateiaustausch**: Upload, Download und Delete; zufällige interne Datei-ID, SHA-256-Prüfsumme und konfigurierbares Größenlimit.
- **Ein Binary / ein Container**: alle Web-Funktionen liegen auf demselben Port.
### Integrierte Admin-Werkzeuge
1. **Onboarding Assistant** erzeugt sAMAccountName, UPN, E-Mail, DisplayName, `New-ADUser` und Gruppenbefehle; kann ein Kennwort als einmaliges Secret ablegen.
2. **Hash / File Inspector** Dateigröße, MIME-Type, Erweiterung, erste Bytes sowie MD5, SHA-256 und SHA-512.
3. **Certificate Inspector** X.509-Details, SANs, Gültigkeit, Key Usage, EKU und Thumbprints für PEM/CER/CRT/DER; PFX/P12 über lokales OpenSSL.
4. **JSON / XML / YAML Formatter** JSON/XML formatieren, minifizieren und validieren; YAML konservativ normalisieren und auf häufige Strukturfehler prüfen.
5. **Text Diff** zeilenweiser Vergleich zweier Texte bis 500 Zeilen pro Seite.
6. **AD Converter** UUID/GUID ↔ AD-Bytefolge, SID ↔ Binär-Hex sowie ISO/Unix/Windows FILETIME/LDAP GeneralizedTime.
7. **DNS Lookup** A, AAAA, CNAME, MX, TXT, SRV und PTR.
8. **IP / Subnet Calculator** IPv4 und IPv6, Netzbereich und für IPv4 zusätzlich Netzmaske/Broadcast/Hostbereich.
9. **Base64 / Hex / URL Encoder** UTF-8-basiertes Encodieren und Decodieren.
10. **PowerShell Command Builder** Generator für häufige AD-Befehle; führt keine Befehle aus.
11. **CSV Viewer** CSV laden, Trennzeichen erkennen, filtern und gefilterte Daten exportieren.
12. **Connectivity Checker** gezielter TCP-Test auf genau einen Host/Port.
13. **Regex Tester** Regex mit Flags gegen Text testen und Treffer/Gruppen anzeigen.
14. **Text Transformer** trimmen, sortieren, deduplizieren, Groß-/Kleinschreibung, Prefix/Suffix und Reihenfolge.
15. **ZIP Archive Viewer** ZIP-Inhalt und Größen anzeigen, ohne Dateien zu extrahieren.
16. **Encoding Converter** UTF-8, Windows-1252, ISO-8859-1 und UTF-16 lesen und als UTF-8 bzw. UTF-8-BOM speichern.
## Wo werden Daten verarbeitet?
Die Werkzeuge **Onboarding, Formatter, Diff, AD Converter, Encoder, PowerShell Builder, CSV Viewer, Regex Tester, Text Transformer und Encoding Converter** laufen vollständig im Browser.
Die folgenden Werkzeuge benötigen die Toolbox-API:
- Hash/File Inspector
- Certificate Inspector
- ZIP Archive Viewer
- DNS Lookup
- Connectivity Checker
- IP/Subnet Calculator
Dateien für die drei Inspektionswerkzeuge werden nur für die jeweilige Anfrage eingelesen und nicht in den normalen Dateiaustausch übernommen. Das Analyse-Limit liegt bei 64 MiB.
**Wichtig:** DNS Lookup und Connectivity Checker laufen aus Netzsicht des **PAW-Toolbox-Servers**. Sie zeigen nicht automatisch die Netzsicht der Browser-/Tier-VM an.
## Typische Workflows
### Sandbox -> geprüfte Datei -> Zielsystem
1. Datei im Bereich **Dateien** hochladen.
2. In der Sandbox-VM dieselbe PAW Toolbox öffnen und die Datei herunterladen.
3. Datei prüfen; bei Bedarf im **Hash / File Inspector** die Prüfsumme dokumentieren.
4. Die geprüfte Datei wieder hochladen und Quelle/Bearbeiter angeben.
5. Auf der Ziel-VM herunterladen.
6. Nicht mehr benötigte Dateien löschen.
Die SHA-256-Prüfsumme wird für jeden Upload angezeigt und zusätzlich beim Download im Header `X-Content-SHA256` mitgegeben.
### Tier-0 -> AD-Onboarding -> Tier-2 Office
1. Unter **Werkzeuge → Onboarding Assistant** Stammdaten erfassen.
2. Naming-Daten und den erzeugten `New-ADUser`-Befehl verwenden.
3. Über **Kennwort generieren + einmalig ablegen** ein Initialkennwort erzeugen. Das Kennwort wird als Secret mit TTL im gewählten Raum abgelegt.
4. In Tier-2 den Raum, z. B. `onboarding`, unter **Zwischenablage** öffnen.
5. Secret explizit abrufen; bei einmaligem Abruf wird der Servereintrag anschließend entfernt.
6. Onboarding-Brief in Office erstellen.
Der Onboarding Assistant führt selbst **keine** AD-Befehle aus.
## Sicherheitsmodell
Die Anwendung ist technisch bewusst ein Transferpunkt zwischen VM-/Tier-Kontexten. Dadurch wird sie selbst zu einer sicherheitskritischen Komponente.
- **TLS verwenden** oder TLS an einem vertrauenswürdigen Reverse Proxy terminieren. Basic Auth niemals unverschlüsselt über ein nicht vertrauenswürdiges Netz verwenden.
- Zugriff auf den Dienst per Firewall/ACL ausschließlich von der PAW bzw. den vorgesehenen Verwaltungsnetzen erlauben.
- `AUTH_USER`/`AUTH_PASS` oder vorgeschaltete Authentisierung aktivieren. Für produktive Tier-Grenzen ist eine identitätsbasierte Authentisierung am Reverse Proxy empfehlenswert.
- Clipboard-Räume und Inhalte werden standardmäßig **vollständig persistent** in `clipboard.json` gespeichert, einschließlich maskierter Secrets (`CLIPBOARD_PERSIST_SECRETS=true`). TTL und One-Time-Verhalten bleiben erhalten: abgelaufene bzw. verbrauchte Einträge werden entfernt. **Maskierung ist keine Verschlüsselung:** persistierte Secret-Werte liegen serverseitig in der mit Modus `0600` geschriebenen JSON-Datei und `/data` muss entsprechend geschützt werden. Wer Secrets bewusst nur im RAM halten möchte, kann `CLIPBOARD_PERSIST_SECRETS=false` setzen.
- Der Dateibereich ist **kein Malware-Scanner**. Die Sandbox-Prüfung bleibt ein expliziter Arbeitsschritt.
- Ein zentraler Dateiaustausch kann eine Tier-Grenze überbrücken. Netzwerk- und Betriebsregeln sollten klar festlegen, welche Richtungen und Dateitypen erlaubt sind.
- DNS-/TCP-Werkzeuge ermöglichen dem angemeldeten Benutzer bewusst Abfragen aus Sicht des Toolbox-Servers. Zugriff auf diese Oberfläche daher entsprechend schützen.
- Das Verzeichnis `/data` sollte auf einem geschützten Datenträger liegen; Rechte und Backup-Verfahren entsprechend behandeln.
- MD5 und SHA-1 werden nur für Kompatibilität/Identifikation angezeigt. Für Integritätsprüfungen sollte SHA-256 oder stärker verwendet werden.
## Start mit Docker Compose
```bash
mkdir -p data
cp apps.json data/apps.json
docker compose up -d --build
```
Danach: `http://<PAW-Toolbox>:8080`
Der Runtime-Container enthält `openssl`, damit PFX/P12-Zertifikate lokal analysiert werden können.
## HTTPS direkt im Container
Beispielvariablen:
```text
SERVER_MODE=https
ADDR=:8443
TLS_CERT_FILE=/certs/server.pem
TLS_KEY_FILE=/certs/server.key
HTTP_REDIRECT_ENABLED=true
HTTP_REDIRECT_ADDR=:8080
```
Die Zertifikate müssen in den Container gemountet werden.
## Wichtige Umgebungsvariablen
| Variable | Standard | Bedeutung |
|---|---:|---|
| `ADDR` | `:8080` | Listen-Adresse |
| `SERVER_MODE` | `http` | `http` oder `https` |
| `APPS_JSON` | `/data/apps.json` | App-Launcher-Konfiguration |
| `DATA_DIR` | `/data` | Datenbasis für Dateiaustausch |
| `CLIPBOARD_DATA` | `/data/clipboard.json` | Clipboard-Persistenz |
| `MAX_PER_ROOM` | `200` | Max. Clipboard-Einträge je Raum |
| `CLIPBOARD_PERSIST_SECRETS` | `true` | Secrets im persistenten Clipboard-Snapshot speichern |
| `FILE_MAX_BYTES` | `268435456` | Max. Uploadgröße, Standard 256 MiB |
| `AUTH_USER` | leer | Optionaler Basic-Auth-Benutzer |
| `AUTH_PASS` | leer | Optionales Basic-Auth-Kennwort |
| `PWGEN_LENGTH` | `20` | Passwortlänge |
| `PWGEN_MIN_LOWER` | `2` | Min. Kleinbuchstaben |
| `PWGEN_MIN_UPPER` | `2` | Min. Großbuchstaben |
| `PWGEN_MIN_DIGITS` | `2` | Min. Ziffern |
| `PWGEN_MIN_SYMBOLS` | `2` | Min. Sonderzeichen |
| `PWGEN_NO_AMBIGUOUS` | `true` | Mehrdeutige Zeichen vermeiden |
| `PWGEN_NO_SEQ` | `true` | Sequenzen vermeiden |
| `PWGEN_NO_REPEAT` | `true` | Direkte Wiederholungen vermeiden |
| `PWGEN_UNIQUE` | `false` | Nur einzigartige Zeichen |
| `PWGEN_EXCLUDE` | leer | Zeichen ausschließen |
| `PWGEN_CHARSET` | leer | Zusätzliche Zeichen |
| `PWGEN_TEMPLATE` | leer | Optionales Template (`l`, `L`, `d`, `s`) |
| `PWGEN_SYMBOLS` | eingebaut | Sonderzeichensatz |
## Clipboard API-Kompatibilität
Die bisherigen Kernpfade bleiben erhalten:
```text
POST /api/{room}/clip
GET /api/{room}/latest
GET /api/{room}/history
DELETE /api/{room}/history
DELETE /api/{room}
GET /api/{room}/stream
```
Ergänzt wurden die persistente Raumverwaltung und der explizite Secret-Abruf:
```text
GET /api/rooms Raum-Namen auflisten
POST /api/rooms Leeren Raum anlegen/persistieren (`{"name":"tier0"}`)
GET /api/rooms/details Räume mit Anzahl/Secrets/letzter Aktivität
GET /api/{room}/clip/{id} Maskierten/One-Time-Eintrag explizit abrufen
```
Dieser Pfad dient insbesondere dem expliziten Abruf maskierter bzw. einmaliger Secrets.
Beispiel zum Ablegen eines Secrets:
```json
{
"type": "password",
"content": "Beispielwert",
"author": "admin",
"secret": true,
"one_time": true,
"ttl_minutes": 15
}
```
## Datei-API
```text
GET /api/files
POST /api/files multipart/form-data: file, optional uploader
GET /api/files/{id}
DELETE /api/files/{id}
```
Originaldateinamen werden nur als Metadaten verwendet. Serverseitig wird die Datei unter einer zufälligen ID gespeichert; dadurch werden Pfadtraversal und Namenskollisionen vermieden.
## Werkzeug-APIs
```text
POST /api/tools/file-inspect multipart/form-data: file
POST /api/tools/cert-inspect multipart/form-data: file, optional password
POST /api/tools/archive multipart/form-data: file
POST /api/tools/dns JSON: name, type
POST /api/tools/connectivity JSON: host, port, timeout_ms
POST /api/tools/subnet JSON: cidr
```
## Datenlayout
```text
/data/apps.json
/data/clipboard.json
/data/files.json
/data/files/<zufällige-id>.bin
Die **Dateiablage ist persistent**: Dateiinhalt und Metadaten werden unter `/data` gespeichert. Mit dem mitgelieferten `compose.yaml` wird `./data:/data` als Bind-Mount eingebunden, sodass Uploads Container-Neustarts und Neu-Erstellungen überstehen. Werden `/data` bzw. `./data` gelöscht, sind auch die gespeicherten Dateien entfernt.
```
Die Analysewerkzeuge legen hochgeladene Dateien nicht in `/data/files` ab.
## Migration aus den drei alten Containern
1. Dieses Projekt bauen und zunächst parallel auf einem Test-Port starten.
2. Gewünschte externe Kacheln aus dem alten `apps.json` übernehmen. Die bisherigen Clipboard-/Passwort-/ProjectSend-Kacheln können entfallen, da diese Funktionen integriert sind.
3. Falls bestehende **nicht geheime** Clipboard-Historie übernommen werden soll, die alte Snapshot-Datei als `/data/clipboard.json` kopieren. Vorher sensible Altwerte entfernen.
4. Funktionsprüfung aus allen vorgesehenen Tier-VMs durchführen.
5. Alte Clipboard- und Passwortgenerator-Container abschalten, sobald keine Clients mehr direkt auf deren Ports zugreifen.
## Build ohne Docker
```bash
go build -o paw-toolbox .
ADDR=:8080 APPS_JSON=./apps.json DATA_DIR=./data CLIPBOARD_DATA=./data/clipboard.json ./paw-toolbox
```
Für PFX/P12-Unterstützung muss `openssl` im `PATH` vorhanden sein. Alle anderen Funktionen benötigen keine externen Laufzeitbibliotheken.