233 lines
12 KiB
Markdown
233 lines
12 KiB
Markdown
# 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.
|