neunzehn83.de

Ein Mann, ein Blog, kein Plan.

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".

Geschrieben am Mittwoch, 08. Juli 2020 und abgelegt unter Linux.