From b7425449b5e7539441034f9e9f088ecd9cd813b2 Mon Sep 17 00:00:00 2001 From: arnol Date: Wed, 22 Jul 2026 21:14:29 +0200 Subject: [PATCH] Re-add 03 NAS CT101 --- 03-NAS-CT101.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 03-NAS-CT101.md diff --git a/03-NAS-CT101.md b/03-NAS-CT101.md new file mode 100644 index 0000000..0d34f4f --- /dev/null +++ b/03-NAS-CT101.md @@ -0,0 +1,145 @@ +# CT 101 — NAS (Samba/SFTP/Filebrowser) — Rebuild-Runbook + +Voraussetzung: ZFS-Pool `nas` mit Dataset `nas/freigabe` existiert auf dem PVE-Host (siehe `01-pve-host.md`). + +## 1. Container erstellen + +```bash +pct create 101 local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst \ + --hostname nas \ + --unprivileged 1 \ + --cores 1 \ + --memory 512 \ + --swap 512 \ + --rootfs local-lvm:4 \ + --net0 name=eth0,bridge=vmbr0,ip=/24,gw= \ + --features nesting=1 \ + --timezone Europe/Berlin \ + --onboot 1 \ + --nameserver + +pct set 101 -mp0 /nas/freigabe,mp=/srv/freigabe +chown -R 100000:100000 /nas/freigabe +pct start 101 +``` + +Ownership `100000:100000` = Standard-UID-Offset für unprivileged Container (Container-UID 0 = Host-UID 100000). + +## 2. Samba + +```bash +pct exec 101 -- apt-get update +pct exec 101 -- apt-get install -y samba openssh-server +``` + +Debians `samba`-Metapaket zieht standardmäßig `samba-ad-dc` + `winbind` mit (nicht gebraucht, kein AD-DC-Zweck): +```bash +pct exec 101 -- systemctl disable --now winbind +pct exec 101 -- systemctl mask samba-ad-dc +``` + +`/etc/samba/smb.conf` ergänzen: +```ini +[freigabe] + path = /srv/freigabe + browseable = yes + read only = no + guest ok = no + valid users = + create mask = 0664 + directory mask = 0775 +``` + +Workgroup und Mindest-Protokoll im `[global]`-Block: +```ini + workgroup = WORKGROUP + server min protocol = SMB2 +``` + +⚠️ **NICHT TUN:** das Standard-`[homes]`-Share per `sed` nur an der Kopfzeile auskommentieren. Der Block hat mehrere Folgezeilen (`browseable`, `create mask`, `valid users = %S` etc.) — werden die nicht mit auskommentiert, hängen sie als „verwaiste" Zeilen im vorherigen Abschnitt (`[global]`) und überschreiben dort Werte, u.a. `valid users = %S`. Folge: IPC$-Zugriff für **alle** Nutzer blockiert (`NT_STATUS_ACCESS_DENIED`), auch für die eigentlich erlaubte Freigabe. Immer den **kompletten** `[homes]`-Block (Kopfzeile + alle Optionszeilen bis zur nächsten Sektion) auskommentieren. Mit `testparm -s` nach jeder Änderung prüfen, dass `[global]` sauber bleibt. + +Benutzer anlegen: +```bash +pct exec 101 -- useradd -M -s /bin/bash -d /srv/freigabe +pct exec 101 -- smbpasswd -a +pct exec 101 -- smbpasswd -e +pct exec 101 -- chpasswd # gleiches Passwort auch als Unix-Login setzen (für SSH/SFTP) +pct exec 101 -- chown -R : /srv/freigabe +pct exec 101 -- systemctl restart smbd nmbd +``` + +Unix- und Samba-Passwort bewusst identisch gehalten — ein Passwort für SMB, SFTP und Filebrowser. + +## 3. SSH/SFTP-Zugriff + +Mit obigem `useradd -s /bin/bash` ist SSH bereits nutzbar (Shell + Home = `/srv/freigabe`, Passwort per `chpasswd` gesetzt). Kein separater Schritt nötig, wenn Schritt 2 komplett ausgeführt wurde. + +⚠️ **NICHT TUN:** einen passwortlosen SSH-Key für Fernzugriff (z.B. aus Guacamole) auf dieses Share hinterlegen. Zugriff auf sensible Daten (Dokumente, Fotos) sollte immer noch ein Passwort verlangen — bei Kompromittierung der aufrufenden Instanz (z.B. Guacamole/VPS) sonst direkter, ungeschützter Zugriff. Auch verschlüsselte Keys mit Passphrase lösen kein echtes UX-Problem (siehe `06-vps-strato.md`, Abschnitt Guacamole-Verbindungen) — einfach normales Passwort verwenden. + +## 3b. Zweite Freigabe: Backups (read-only) + +Bind-Mount und Samba-Share für `/nas/backups` (siehe `07-backup-restore.md`) — bewusst **read-only**, da die Backups volle Container-Images inkl. aller Secrets enthalten: + +```bash +pct set 101 -mp1 /nas/backups,mp=/srv/backups,backup=0 +``` + +`/etc/samba/smb.conf` ergänzen: +```ini +[backups] + path = /srv/backups + browseable = yes + read only = yes + guest ok = no + valid users = +``` + +Kein separater Nutzer nötig, `` deckt beide Shares ab. Erreichbar unter `\\nas.pve\backups`. + +## 4. Filebrowser (grafische Web-Oberfläche) + +```bash +VER=$(curl -s https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": "[^"]*"' | cut -d'"' -f4) +curl -fsSL -o /tmp/filebrowser.tar.gz "https://github.com/filebrowser/filebrowser/releases/download/$VER/linux-amd64-filebrowser.tar.gz" +tar xzf /tmp/filebrowser.tar.gz -C /tmp filebrowser +pct push 101 /tmp/filebrowser /usr/local/bin/filebrowser +pct exec 101 -- chmod +x /usr/local/bin/filebrowser +``` + +⚠️ **NICHT TUN:** das offizielle `curl | bash`-Installskript von Filebrowser verwenden — stattdessen Release-Binary direkt von GitHub laden (transparenter, keine Shell-Pipe von einem Skript, das man vorher nicht liest). + +Config + Service: +```bash +pct exec 101 -- mkdir -p /var/lib/filebrowser +pct exec 101 -- chown : /var/lib/filebrowser +pct exec 101 -- su -s /bin/bash -c '/usr/local/bin/filebrowser config init -d /var/lib/filebrowser/filebrowser.db' +pct exec 101 -- su -s /bin/bash -c '/usr/local/bin/filebrowser config set -a 0.0.0.0 -p 8080 -r /srv/freigabe -d /var/lib/filebrowser/filebrowser.db' +pct exec 101 -- su -s /bin/bash -c "/usr/local/bin/filebrowser users add '' --perm.admin -d /var/lib/filebrowser/filebrowser.db" + +cat > /etc/systemd/system/filebrowser.service <<'EOF' +[Unit] +Description=Filebrowser Web UI +After=network.target srv-freigabe.mount + +[Service] +User= +Group= +ExecStart=/usr/local/bin/filebrowser -d /var/lib/filebrowser/filebrowser.db +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl daemon-reload +systemctl enable --now filebrowser +``` + +Erreichbar unter `http://nas.pve:8080` (LAN + Tailnet). **Bewusst nicht öffentlich exponiert** — für den Internetcafé-Fall gibt's den SFTP-Dateibrowser innerhalb der TOTP-gesicherten Guacamole-Verbindung (siehe `06-vps-strato.md`). + +## Verifikation + +```bash +smbclient -L // -U %'' +sftp @ +curl -s -o /dev/null -w "%{http_code}\n" http://:8080/ +```