homelab-showcase/03-ct101-nas.md

5.9 KiB

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

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=<LAN_IP_NAS>/24,gw=<LAN_IP_ROUTER> \
  --features nesting=1 \
  --timezone Europe/Berlin \
  --onboot 1 \
  --nameserver <LAN_IP_ADGUARD>

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

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):

pct exec 101 -- systemctl disable --now winbind
pct exec 101 -- systemctl mask samba-ad-dc

/etc/samba/smb.conf ergänzen:

[freigabe]
   path = /srv/freigabe
   browseable = yes
   read only = no
   guest ok = no
   valid users = <PRIMARY_USER>
   create mask = 0664
   directory mask = 0775

Workgroup und Mindest-Protokoll im [global]-Block:

   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:

pct exec 101 -- useradd -M -s /bin/bash -d /srv/freigabe <PRIMARY_USER>
pct exec 101 -- smbpasswd -a <PRIMARY_USER>
pct exec 101 -- smbpasswd -e <PRIMARY_USER>
pct exec 101 -- chpasswd   # gleiches Passwort auch als Unix-Login setzen (für SSH/SFTP)
pct exec 101 -- chown -R <PRIMARY_USER>:<PRIMARY_USER> /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:

pct set 101 -mp1 /nas/backups,mp=/srv/backups,backup=0

/etc/samba/smb.conf ergänzen:

[backups]
   path = /srv/backups
   browseable = yes
   read only = yes
   guest ok = no
   valid users = <PRIMARY_USER>

Kein separater Nutzer nötig, <PRIMARY_USER> deckt beide Shares ab. Erreichbar unter \\nas.pve\backups.

4. Filebrowser (grafische Web-Oberfläche)

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:

pct exec 101 -- mkdir -p /var/lib/filebrowser
pct exec 101 -- chown <PRIMARY_USER>:<PRIMARY_USER> /var/lib/filebrowser
pct exec 101 -- su -s /bin/bash <PRIMARY_USER> -c '/usr/local/bin/filebrowser config init -d /var/lib/filebrowser/filebrowser.db'
pct exec 101 -- su -s /bin/bash <PRIMARY_USER> -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 <PRIMARY_USER> -c "/usr/local/bin/filebrowser users add <PRIMARY_USER> '<PASSWORT>' --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=<PRIMARY_USER>
Group=<PRIMARY_USER>
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

smbclient -L //<LAN_IP_NAS> -U <PRIMARY_USER>%'<PASSWORT>'
sftp <PRIMARY_USER>@<LAN_IP_NAS>
curl -s -o /dev/null -w "%{http_code}\n" http://<LAN_IP_NAS>:8080/