145 lines
5.9 KiB
Markdown
145 lines
5.9 KiB
Markdown
|
|
# 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=<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
|
||
|
|
|
||
|
|
```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 = <PRIMARY_USER>
|
||
|
|
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 <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:
|
||
|
|
|
||
|
|
```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 = <PRIMARY_USER>
|
||
|
|
```
|
||
|
|
|
||
|
|
Kein separater Nutzer nötig, `<PRIMARY_USER>` 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 <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
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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/
|
||
|
|
```
|