# 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/ ```