Files
Homelab--Bratonein-Kontroll…/Kapitel 6/Tutorial.md

367 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

📝 Kapitel 6 Vaultwarden (ohne Docker, systemd)
> **BlogStil, laienfreundlich, SchrittfürSchritt nachvollziehbar.**
> Du führst die Befehle aus und ersetzt die Platzhalter. Nach jedem Block steht kurz: **was**, **warum**, **Erfolgskontrolle**. Wenn relevant, nennen wir Alternativen.
---
## 🎯 Was wir bauen (in Klartext)
Wir richten **Vaultwarden** als PasswortTresor ein. Das ist die kompatible ServerVariante zu Bitwarden. Du bekommst:
* eine **WebOberfläche** zum Verwalten deiner Passwörter und TOTPCodes,
* **sichere Anmeldung** (AdminToken, Registrierungen aus),
* **HTTPS** über den Nginx Proxy Manager (NPM) und
* **LiveSync** dank WebSockets.
Wir betreiben Vaultwarden **ohne Docker** (direkt als Programm), damit es **möglichst wenig RAM** verbraucht.
---
## ✅ Voraussetzungen (kurz & klar)
* LXCContainer: **Debian 12 (Bookworm)**, du bist als **root** angemeldet.
* NPM läuft (eigenes Kapitel), Domain existiert (z.B. `pass.DEINE-DOMAIN.tld`).
* Die **IP** deines VaultwardenLXC (Beispiel: `10.0.0.16`).
**Platzhalter, die du gleich ersetzt:**
* `<VW_IP>` → IP deines VaultwardenLXC, z.B. `10.0.0.16`
* `DEINE-DOMAIN.tld` → deine echte Domain
---
## 🧱 LXCEigenschaften (Proxmox) — empfohlene Einstellungen
> **Empfehlung (GUI).** So erstellst du den Container für dieses Kapitel; Details kannst du später anpassen.
**Proxmox GUI → Create CT**
1. **General**
* **Hostname:** `vaultwarden`
* **Unprivileged container:** **✔️ aktivieren** (besserer Schutz)
* **RootPasswort:** setzen
* Optional **SSH Public Key** einfügen (falls vorhanden)
2. **Template**
* **OS:** `Debian 12 (Bookworm) standard`
3. **Disks**
* **Storage:** `local-lvm` (oder dein StandardStorage)
* **Disk size:** **4GB** (reicht, Daten liegen separat; später erweiterbar)
4. **CPU**
* **Cores:** **1**
5. **Memory**
* **RAM:** **256MB**
* **Swap:** **256MB**
6. **Network**
* **Bridge:** `vmbr0`
* **IPv4:** **Static** → z.B. `<VW_IP>/24` (Beispiel `10.0.0.16/24`)
* **Gateway (IPv4):** z.B. `10.0.0.1`
* **IPv6:** `SLAAC (Auto)` **oder** `None` (wenn dein Netz kein IPv6 nutzt)
7. **DNS**
* **DNS server:** IP deines DNS (z.B. Pihole) **oder** `1.1.1.1`
* **Search domain:** leer lassen (optional dein LANSuffix)
8. **Confirm**
* **Start at boot (Onboot):** **✔️ aktivieren**
* **Finish**
**Nach der Erstellung (Optionen anpassen):**
* **Options → Features:** `keyctl=on`, `nesting=off`, `fuse=off`
* **Start** den CT und öffne **Console** → einloggen als `root` (Passwort aus Schritt 1)
> Warum diese Werte?
>
> * **Unprivileged** reduziert Angriffsfläche.
> * **1 vCPU / 256MB RAM**: reicht für Vaultwarden nativ (sparsam).
> * **4GB Disk**: System + Logs; TresorDaten liegen unter `/var/lib/vaultwarden`.
> * **SLAAC** nur, wenn du IPv6 nutzt; sonst `None`.
---
## 1) System vorbereiten
Wir aktualisieren das System, installieren Werkzeuge und richten einen **eigenen DienstBenutzer** ein.
> **Warum ein eigener DienstBenutzer?**
> Dieser Benutzer ist **nur** für den VaultwardenDienst da (kein normales Login). Dadurch sind die TresorDateien vor anderen Diensten geschützt. In früheren DockerKapiteln war diese Trennung im Container bereits vorhanden **jetzt** übernehmen wir sie auf Systemebene.
```bash
apt update && apt upgrade -y
apt install -y ca-certificates curl unzip openssl nano
# Dienstnutzer ohne Login anlegen (nur für den Dienst, zur Absicherung)
useradd --system --home /var/lib/vaultwarden --shell /usr/sbin/nologin vaultwarden || true
# Arbeits- und Datenordner anlegen
mkdir -p /opt/vaultwarden
mkdir -p /var/lib/vaultwarden/data
# Eigentum der Daten an den Dienstbenutzer übergeben (Schutz der Tresor-Daten)
chown -R vaultwarden:vaultwarden /var/lib/vaultwarden
```
**So prüfst du das Ergebnis:**
```bash
id vaultwarden
ls -ld /opt/vaultwarden /var/lib/vaultwarden /var/lib/vaultwarden/data
```
Du siehst den Benutzer `vaultwarden` und die Ordner existieren.
---
## 2) Vaultwarden herunterladen (immer aktuelle stabile Version)
Wir installieren **immer die neuste stabile Release** direkt von der offiziellen Quelle. So sind **Sicherheitsfixes** sofort enthalten.
```bash
# 1) Download-URL der neuesten stabilen Release automatisch ermitteln
VW_URL=$(curl -s https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest \
| grep browser_download_url \
| grep x86_64-unknown-linux-gnu.tar.gz \
| cut -d '"' -f 4)
# 2) Archiv herunterladen und entpacken
curl -L "$VW_URL" -o /tmp/vaultwarden.tar.gz
mkdir -p /tmp/vw && tar -xzf /tmp/vaultwarden.tar.gz -C /tmp/vw
# 3) Programmdatei nach /opt verschieben (wird unser fester Pfad)
install -m 0755 /tmp/vw/vaultwarden /opt/vaultwarden/vaultwarden
```
**Woran erkenne ich Erfolg?**
```bash
/opt/vaultwarden/vaultwarden --version || true
```
Du siehst die **Version** der frisch installierten Release.
**Warum so? (Laienfreundlich)**
* „Neuste stabile Release“ = **aktuelle Sicherheitsfixes** ohne Wartezeit.
* Wir holen die Datei **direkt** von der offiziellen Projektseite.
* Der Pfad `/opt/vaultwarden/` bleibt gleich **Updates** sind später nur „Datei tauschen + Dienst neu starten“.
> 🔐 **SicherheitsHinweis:** Wenn die ReleaseSeite einen **SHA256Wert** angibt, kannst du ihn optional prüfen: `sha256sum /tmp/vaultwarden.tar.gz` ausführen und den Wert mit dem auf der ReleaseSeite **visuell vergleichen**.
> 🆙 **Aktualisieren später:** Wiederhole **genau diesen Schritt** (die drei Befehle oben) und starte den Dienst neu: `systemctl restart vaultwarden`. Wenn sich seitdem Oberflächen/Optionen geändert haben, ergänzen wir im Video einen Hinweis und **aktualisieren diesen BlogPost**.
---
## 3) Konfigurationsdatei mit **Nano** erstellen
Wir hinterlegen **Domain**, **AdminToken**, **Ports** und **WebSockets** in einer `.env`Datei. Diese Datei liest der Dienst später automatisch ein.
1. **Sicheres AdminToken erzeugen** (kopieren, wir fügen es gleich ein):
```bash
openssl rand -base64 48
```
2. **Datei mit Nano öffnen:**
```bash
nano /etc/vaultwarden.env
```
3. **Folgenden Inhalt einfügen** und **Platzhalter ersetzen**:
```
DOMAIN=https://pass.DEINE-DOMAIN.tld
ADMIN_TOKEN=HIER_DEIN_ERZEUGTES_TOKEN_EINFÜGEN
SIGNUPS_ALLOWED=false
WEBSOCKET_ENABLED=true
# Der Dienst lauscht auf der IP deines LXC (so erreicht NPM ihn)
ROCKET_ADDRESS=<VW_IP>
ROCKET_PORT=8000
# WebSocket-Endpunkt für Live-Sync
WEBSOCKET_ADDRESS=<VW_IP>
WEBSOCKET_PORT=3012
# Optional: nur wenn du E-Mails (z. B. Verifizierung/Reset) willst
# SMTP_HOST=smtp.example.com
# SMTP_FROM=pass@example.com
# SMTP_PORT=587
# SMTP_SECURITY=starttls
# SMTP_USERNAME=user
# SMTP_PASSWORD=deinPasswort
```
4. **Speichern in Nano:** `Strg+O``Enter`**Beenden:** `Strg+X`.
5. **Datei schützen** (damit nur root und der Dienst lesen dürfen):
```bash
chown root:vaultwarden /etc/vaultwarden.env
chmod 0640 /etc/vaultwarden.env
```
**Kurz erklärt:**
* `DOMAIN` braucht **https**, damit Links/Icons korrekt sind.
* `ADMIN_TOKEN` schützt das **AdminBackend** (ohne Token kommt man nicht rein).
* `SIGNUPS_ALLOWED=false` verhindert **offene Registrierungen**.
* `ROCKET_*` und `WEBSOCKET_*` sorgen dafür, dass der Dienst auf deiner **LXCIP** erreichbar ist und LiveSync funktioniert.
---
## 4) Dienstdatei (systemd) anlegen
Die Dienstdatei sagt Linux: *„So startest du Vaultwarden und bitte automatisch beim Booten.“*
1. **Datei öffnen:**
```bash
nano /etc/systemd/system/vaultwarden.service
```
2. **Inhalt einfügen:**
```
[Unit]
Description=Vaultwarden (Bitwarden-compatible) native
After=network.target
[Service]
User=vaultwarden
Group=vaultwarden
EnvironmentFile=/etc/vaultwarden.env
ExecStart=/opt/vaultwarden/vaultwarden
WorkingDirectory=/var/lib/vaultwarden
# Sicherheit (Dienst hat nur, was er braucht)
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
```
3. **Speichern & schließen:** `Strg+O``Enter``Strg+X`.
4. **Dienst laden, aktivieren und starten:**
```bash
systemctl daemon-reload
systemctl enable --now vaultwarden
systemctl status vaultwarden --no-pager
```
**Woran erkenne ich Erfolg?**
* Status zeigt **active (running)**.
* Optional: Ports prüfen
```bash
ss -tulpn | grep -E ':8000|:3012'
```
**Was haben wir gerade gemacht?**
* Den Dienst **systemweit registriert** und **dauerhaft** aktiviert.
* Vaultwarden läuft jetzt im Hintergrund automatisch auch nach Neustarts.
---
## 5) NPM einrichten (Proxy, WebSockets, Zertifikat)
So wird deine Instanz über **HTTPS** erreichbar und **LiveSync** funktioniert.
1. **Proxy Host anlegen**
* **Domain Names:** `pass.DEINE-DOMAIN.tld`
* **Scheme:** `http`
* **Forward Hostname / IP:** `<VW_IP>`
* **Forward Port:** `8000`
* **Block Common Exploits:** ✔️
* **Websockets Support:** ✔️
2. **Custom Location hinzufügen**
* **Location:** `/notifications/hub`
* **Forward Hostname / IP:** `<VW_IP>`
* **Forward Port:** `3012`
* **Websockets Support:** ✔️
3. **SSL aktivieren (Lets Encrypt)**
* **Request a new SSL Certificate**
* **Force SSL**, **HTTP/2**, **HSTS**: ✔️
**Test:** Rufe `https://pass.DEINE-DOMAIN.tld` im Browser auf → Loginseite sichtbar.
**Was passiert hier?**
* NPM nimmt Anfragen aus dem Internet an (443) und leitet sie an deinen Dienst weiter.
* Die **Custom Location** sorgt dafür, dass der **WebSocketKanal** (LiveSync) funktioniert.
---
## 6) Erstkonfiguration im Browser
1. **AdminBackend öffnen**: `https://pass.DEINE-DOMAIN.tld/admin`**AdminToken** eingeben.
2. **Registrierung prüfen**: „Signups allowed“ ist **aus** (kommt aus deiner `.env`).
3. **Optional SMTP** eintragen und **Testmail** senden.
4. **Erstes Benutzerkonto** anlegen und **2FA (TOTP oder FIDO2)** aktivieren.
**Warum?**
* So bleibt der Server **privat** (nur du legst Accounts an).
* 2FA schützt deinen Tresor zusätzlich.
---
## 7) Backup (Basis, schnell & sicher)
Wir sichern den **Datenordner**. Damit kannst du den Tresor später wiederherstellen.
```bash
# Für maximale Konsistenz könntest du kurz stoppen (optional)
# systemctl stop vaultwarden
tar -czf /root/vaultwarden-backup-$(date +%F).tar.gz -C /var/lib vaultwarden
# systemctl start vaultwarden
ls -lh /root/vaultwarden-backup-*.tar.gz
```
**Wichtig:** Plane das als **CronJob** ein und teste gelegentlich das **Restore** auf einer TestVM.
---
## 🛠️ Wenn etwas nicht klappt
* **Seite lädt, aber kein LiveSync:** In NPM die **Custom Location** `/notifications/hub` prüfen (Port **3012**, WebSockets ✔️).
* **Icons/Links seltsam:** In `/etc/vaultwarden.env` muss `DOMAIN` mit **https** beginnen.
* **Ich komme nicht ins AdminBackend:** Stimmt das **ADMIN\_TOKEN** noch? (Zur Not neues Token in der `.env` setzen und `systemctl restart vaultwarden`.)
* **Dienst startet nicht:**
```bash
journalctl -u vaultwarden -b --no-pager | tail -n 50
```
Die letzten Zeilen zeigen meistens den Fehler (z.B. Tippfehler in der `.env`).
---
## ✅ Ergebnis
* Deine Instanz ist über `https://pass.DEINE-DOMAIN.tld` erreichbar.
* **Registrierungen sind aus**, AdminBackend ist durch **Token** geschützt.
* **WebSockets** funktionieren (LiveSync zwischen Geräten).
* **Backups** sind eingerichtet.
> **Du hast jetzt einen schlanken, eigenen PasswortServer ohne DockerOverhead, mit klaren Sicherungen und Updates.**