From f0efe8351f5b53bb837fcc2af2c7bf567a7d2eba Mon Sep 17 00:00:00 2001 From: arnol Date: Wed, 22 Jul 2026 21:18:41 +0200 Subject: [PATCH] Move 03-ct101-nas.md to wiki --- 03-ct101-nas.md | 145 ------------------------------------------------ 1 file changed, 145 deletions(-) delete mode 100644 03-ct101-nas.md diff --git a/03-ct101-nas.md b/03-ct101-nas.md deleted file mode 100644 index 0d34f4f..0000000 --- a/03-ct101-nas.md +++ /dev/null @@ -1,145 +0,0 @@ -# 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/ -```