Debian Linux Fileserver für Windows und Mac Clients
Ich mag keine NAS-Boxen. Zu eingeschränkt, zu langsam, zu unflexibel. Natürlich besteht für mich der perfekte Fileserver aus einem Debian-System mit ein paar wenigen Standardpaketen. In diesem Fall Debian 10 Buster.
Idee: Für den Zugriff von Windows benötigen wir Samba, für Linux und Mac Clients genügt ein entsprechender SSH-Zugang für SSHFS.
Doch beim Zugriff mit SSHFS ergibt sich ein Problem..
Die Rechtesituation
Eigentlich einfach. Wir möchten verschiedene Linux-Systembenutzer. Gleichzeitig sind dies Samba-Nutzer. Über die Gruppenzugehörigkeit können Zugriffsrechte auf Verzeichnisebene für SSH vergeben werden.
Damit neu erzeugte Dateien der Gruppe gehören und nicht dem User selbst, müssen wir das SETGID Bit beim Hauptverzeichnis setzen.
chmod g+s /storage
Problem: neue Dateien haben je nach Umask des Clients(!) nur Leserechte für die Gruppe. Noch schlimmer: wird eine Datei kopiert, die auf dem Client nur Schreib-/Leserechte für den User und keine Rechte für die Gruppe hat, wird diese so auf den Fileserver kopiert - ganz egal welche Umask gilt. Das ist ein Problem, da andere User diese Datei dann nicht bearbeiten oder vielleicht sogar nicht einmal lesen können.
SSHFS ist auf Serverseite ein SFTP-Server. Genauer gesagt der sftp-server von OpenSSH. Dieser hat leider keine Möglichkeit wie bspw. bei Samba mit inherit permissions
die Dateirechte beim Schreiben explizit zu setzen.
OpenSSH sftp-server patchen
Ich habe lange hierzu eine Lösung gesucht - mir erschien der Use-Case eigentlich straight-forward - scheinbar gibt es aber keine einfache Lösung. Auf folgenden Patch für den sftp-server von OpenSSH bin ich gestoßen:
https://bugzilla.mindrot.org/show_bug.cgi?id=1844
Dieser ermöglicht mit dem dann zur Verfügung stehenden "-m" Parameter eine Umask zu forcen. Leider hat es dieser Patch auch nach 10 Jahren noch nicht ins offizielle sftp-server-Paket von Debian geschafft. Außerdem genügt das forcen einer Umask nicht, wenn die Datei auf dem Client grundsätzlich zu wenig Rechte hat. Denn eine Umask erhöht niemals die Rechte.
Ade Standardpakete, selbst ist der Mann - wir erweitern den Patch um das wirkliche Forcieren von Permissions bei allen Schreibvorgängen.
Wir benötigen zunächst grundsätzliche Zugriff auf die Sourcen von Debian-Paketen:
vi /etc/apt/sources.list
deb-src http://ftp.debian.org/debian buster main contrib
apt update
Source holen
apt source openssh-sftp-server
cd openssh-7.9p1/
Patch anwenden
Ich habe den originalen Patch erweitert, so dass Permissions von Dateien nicht übernommen sondern immer die Permissions wie im "-m" Parameter angegeben gesetzt werden.
Der Unterschied zum Originalpatch:
--- sftp-server.c.2 2020-07-13 17:17:58.152172604 +0000
+++ sftp-server.c 2020-07-13 17:18:39.136288633 +0000
@@ -919,7 +919,7 @@
if (r == -1)
status = errno_to_portable(errno);
}
- if (a.flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
+ if (permforce == 0 && a.flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
logit("set \"%s\" mode %04o", name, a.perm);
r = chmod(name, a.perm & 07777);
if (r == -1)
@@ -972,7 +972,7 @@
if (r == -1)
status = errno_to_portable(errno);
}
- if (a.flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
+ if (permforce == 0 && a.flags & SSH2_FILEXFER_ATTR_PERMISSIONS) {
logit("set \"%s\" mode %04o", name, a.perm);
#ifdef HAVE_FCHMOD
r = fchmod(fd, a.perm & 07777);
Entweder der Reihe nach den Originalpatch anwenden, dann die zwei Änderungen oben oder hier auch als Komplett-Patch herunterladen.
wget https://neunzehn83.de/blog/files/2020/openssh-sftp-server-patch.diff
patch sftp-server.c openssh-sftp-server-patch.diff
Bauen & installieren
apt build-dep devscripts openssh-sftp-server
cd debian
debuild -b -uc -us
cd ../../
dpkg -i openssh-sftp-server_7.9p1-10+deb10u2_amd64.deb
Damit haben wir den openssh-ftp-server mit "-m" Parameter gebaut!
Konfiguration
Damit bei SSHFS-Verbindungen der neue Parameter auch genutzt wird, muss die openssh-Konfiguration entsprechend angepasst werden:
vi /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server -m 770
/etc/init.d/sshd restart
Testen
Wir kopieren eine Datei mit den lokalen Rechten "700" auf ein SSHFS-Mount (hier: /mnt/files/test). Nach dem Kopieren hat die Datei die Rechte "770".