Ich stand an mehreren Stellen vor dem Problem, auf einen gemeinsamen Ordner und Dateien mit verschiedenen Benutzern zugreifen zu wollen. Aus Sicherheitsgründen sollten allerdings nicht alle Benutzer Lese- und Schreibrechte haben, sondern ich wollte die Rechte gerne feiner festlegen.

Das Problem

Konkret hatte ich zwei Fälle.

  1. Lokale User sollten über SAMBA Shares lesend und schreibend auf die Files zugreifen können.
  2. Ein lokal installierter Webserver soll nur lesend auf die Dateien zugreifen können
  3. Ein externer Server soll über einen SSH Zugang lesen und schreiben können.

im zweiten Fall sollte

  1. ein Webserver lesend und schreibend auf ein Verzeichnis und Dateien zugreifen können
  2. ein weiterer Benutzer lesend und schreibend auf das selbe Verzeichnis und Dateien zugreifen.

Grundsätzlich lassen sich beide Fälle lösen, indem alle Benutzer die auf das Verzeichnis lesend und schreibend zugreifen können sollen in eine Benutzergruppe gepackt werden und diese als primäre Gruppe festgelegt wird. Dies war auch meine ursprüngliche Lösung.

Durch setzen der entsprechenden umask werden alle Dateien und Verzeichnisse beim Erstellen mit Lese- und Schreibrechten für die betroffenen Benutzer ausgestattet. Das Setzen des Lesezugriffs für alle Benutzer erlaubt es weiteren Benutzern auf die Dateien zugreifen zu können, ohne Schreibzugriff zu erhalten.

Leider habe ich die Lösung als unbefriedigend empfunden. Standardmäßig habe ich eine umask von 027 gesetzt, wobei sonstige Benutzer grundsätzlich weder Lese- noch Schreibrechte erhalten. Dies musste ich wieder aufweichen.
Außerdem herrscht im gemeinsamen Verzeichnis ein Wildwuchs an Dateien von verschiedenen Benutzern.
Durch das setzen einer gemeinsamen Standardgruppe, werden alle von den betroffenen Benutzern erstellte Dateien überall mit der gemeinsamen Gruppe erstellt und können dadurch auch überall von den betroffenen Usern gelesen bzw. geschrieben werden. Ich hätte das Recht allerdings gerne auf das eine, gemeinsame Verzeichnis beschränkt.

Generell habe ich das hantieren mit verschiedenen Dateirechten, Gruppen, umask usw. als unübersichtlich und chaotisch empfunden und habe mich mit der Lösung schlichtweg nicht wohlgefühlt.

Die Lösung

Durch Zufall bin ich auf eine Lösung gestoßen, welche mir sehr viel besser gefällt: bindfs

Mit bindfs lässt sich ein Verzeichnis an verschiedenen Stellen mit verschiedenen Berechtigungen mounten. Auf Wunsch werden alle in das Verzeichnis geschriebenen Dateien mit einem bestimmten User und bestimmten Rechten erstellt.

D.h.:

  1. Jeder Benutzer sieht das Verzeichnis so als wäre es sein eigenes und mit den Rechten die dieser Benutzer benötigt. z.B. Eigentümer sftp:sftp
  2. In Wirklichkeit werden die Dateien aber mit den Rechten eines anderen Benutzers ins Dateisystem geschrieben. z.B. www-data:www-data
  3. Alle Dateien die außerhalb des gemeinsamen Verzeichnisses geschrieben werden, werden mit den normalen Rechten des Users geschrieben (z.B. im Homeverzeichnis).

Bindfs ist somit sehr flexibel, was das einstellen von Berechtigungen für einen gemeinsamen Mountpoint angeht. Realisiert wird dies durch die Benutzung von FUSE, was zwar sehr flexibel und bei mir bisher auch sehr zuverlässig ist, allerdings sehr viel weniger performat und mehr Last auf der CPU erzeugt als das direkte Schreiben ins Dateisystem.

Es macht also Sinn, dass der Benutzer der die Dateien ständig benutzt (z.B. der Webserver oder Samba) auch der tatsächliche Eigentümer der Files ist und auch direkt in das gemeinsame Verzeichnis schreibt.

Benutzer welche das Verzeichnis nicht ständig benutzen mounten das gemeinsame Verzeichnis über bindfs.

ein Beispiel

In diesem Beispiel wird ein gemeinsames Verzeichnis für die Benutzer samba und sftp erstellt, in welches beide Benutzer schreiben dürfen. Tatsächlich werden alle Dateien aber mit dem Benutzer samba ins Dateisystem geschrieben.

Installieren lässt sich bindfs unter Ubuntu / Debian aus den Paketquellen

sudo apt install bindfs

Dann kann der gemeinsame Ordner erstellt und die gewünschten tatsächlichen Rechte vergeben werden

sudo mkdir -p /mnt/samba/shares
sudo chown -R samba: /mnt/samba/shares

Als nächstes wird der Mountpoint für den zusätzlichen User erstellt.

sudo mkdir -p /mnt/sftp/samba
sudo chown -R sftp: /mnt/sftp/samba

Damit /mnt/samba/shares auch unter /mnt/sftp/samba mit den entsprechenden Rechten gemounted wird muss folgender Eintrag in die /etc/fstab hinzugefügt werden:

bindfs#/mnt/samba/shares /mnt/sftp/samba fuse force-user=sftp,force-group=sftp,create-for-user=samba,create-for-group=samba,chgrp-ignore,chown-ignore,chmod-ignore 0 0

Dadurch werden alle durch den Benutzer sftp erstellten Dateien tatsächlich mit dem Benutzer samba erstellt.

Test

zum testen erstellen wir mit jedem Benutzer eine Datei, jeweils im Verzeichnis welches diesem User gehört.
zuerst als User samba

su samba
cd /mnt/samba/shares
touch testfile-samba.txt

dann als User sftp

su sftp
cd /mnst/sftp/samba
touch testfile-sftp.txt

und siehe da: In beiden Verzeichnissen erscheinen nun beide Dateien. Im Verzeichnis des Users samba mit diesem als Eigentümer und im Verzeichnis des Users sftp mit diesem als Eigentümer.

weitere Beispiele und die Dokumentation ist auf der Homepage des Projekts zu finden: http://bindfs.org/


Dieser Text ist lizensiert unter einer Creative Commons Namensnennung 4.0 International Lizenz

1 Comment

  1. Man kann auch ACLs nutzen. Dann kann man bei Dateien für jeden Benutzer einzeln die Rechte setzen.