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.
- Lokale User sollten über SAMBA Shares lesend und schreibend auf die Files zugreifen können.
- Ein lokal installierter Webserver soll nur lesend auf die Dateien zugreifen können
- Ein externer Server soll über einen SSH Zugang lesen und schreiben können.
im zweiten Fall sollte
- ein Webserver lesend und schreibend auf ein Verzeichnis und Dateien zugreifen können
- 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.:
- 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
- In Wirklichkeit werden die Dateien aber mit den Rechten eines anderen Benutzers ins Dateisystem geschrieben. z.B. www-data:www-data
- 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/
1 Comment
Man kann auch ACLs nutzen. Dann kann man bei Dateien für jeden Benutzer einzeln die Rechte setzen.