Zunächst einige Hintergrundinformationen:
- / dev / md1 ist ein RAID-0-Array, das als primärer Dateispeicher dient. Es ist an / var / smb gemountet.
- / dev / md2 ist ein weiteres RAID-0-Array, in dem Backup-Snapshots aus / dev / md1 gespeichert sind. Es wird an / var / smb / snapshots gemountet.
- Über Samba werden drei Verzeichnisse zur Verfügung gestellt: / var / smb / files (öffentlich freigegebene Dateien), / var / smb / private (private Dateien) und / var / smb / snapshots (schreibgeschützter Zugriff auf Backup-Snapshots).
Nur Benutzer in der smbusers-Gruppe dürfen auf die Freigaben für Dateien und Snapshots zugreifen. Ebenso dürfen nur Benutzer in der Gruppe smbprivate privat auf die Dateien zugreifen. Darüber hinaus verbieten Linux-Berechtigungen Benutzern, die nicht zu den jeweiligen Gruppen gehören, den Zugriff auf die Dateien und privaten Verzeichnisse sowohl auf dem lokalen System als auch innerhalb der Snapshots-Samba-Freigabe.
Dies ist großartig, da dies bedeutet, dass wir einen voll funktionsfähigen Dateiserver mit der Selbsthilfeoption "Aus Sicherung wiederherstellen" haben (Benutzer können einfach auf die Snapshots-Freigabe zugreifen und die Datei (en) abrufen, die sie selbst wiederherstellen möchten) Bisher fehlt mir eine wichtige Zutat: Nicht-Root-Zugriff auf das lokale System auf das Verzeichnis / var / smb / snapshots.
Die Snapshots müssen für alle regulären Benutzer streng schreibgeschützt sein. Natürlich muss das Dateisystem schreibgeschützt gemountet sein, damit der Sicherungsvorgang stattfinden kann. Die Berechtigungen für diese Verzeichnisse lauten derzeit:
root@odin:/var/smb# ll
total 40
drwxrwxr-x 7 root root 4096 2011-04-11 15:18 ./
drwxr-xr-x 14 root root 4096 2011-04-10 19:07 ../
drwxrwx--- 15 kromey smbusers 4096 2010-12-07 13:09 files/
drwxrwx--- 7 kromey smbprivate 4096 2010-04-07 07:08 private/
drwxrwx--- 3 root root 4096 2011-04-11 15:16 snapshots/
Jetzt möchte ich Nicht-Root-Benutzern Zugriff auf das Snapshots-Verzeichnis gewähren, jedoch ausschließlich schreibgeschützt. Ich kann / dev / md2 jedoch nicht schreibgeschützt bereitstellen, da ich es schreibgeschützt haben muss, um Sicherungen auszuführen. Ich kann es nicht einfach schreibgeschützt für eine Sicherung erneut bereitstellen und dann wieder schreibgeschützt bereitstellen, da dies ein Zeitfenster bietet, in das die Sicherungen von einem anderen Benutzer geschrieben werden könnten.
Früher habe ich dies getan, indem ich mein Snapshots-Verzeichnis zu einem schreibgeschützten NFS-Export gemacht habe (nur zu localhost) und diesen lokal gemountet habe (das Original wurde in einem Verzeichnis gesichert, in dem es keine Durchquerungsrechte für Nicht-Root-Benutzer gibt), aber das fühlt sich wie ein Hack an und es scheint als ob es einen besseren Weg geben sollte, dies zu erreichen. Ich habe die mount --bind
Option ausprobiert , aber es scheint nicht möglich zu sein, unterschiedliche Zugriffsebenen (dh schreibgeschützt oder schreibgeschützt) für die beiden Verzeichnisse zu haben (es sei denn, mir fehlt etwas :) mount -r --bind dir1 dir2
.
Irgendwelche Ideen, wie ich dies ohne NFS erreichen kann, oder ist das meine beste Option?
TL; DR: Wie kann ich den Inhalt eines Dateisystems einem ausgewählten Benutzer schreibgeschützt, aber allen anderen schreibgeschützt zur Verfügung stellen, während die ursprünglichen Berechtigungen und Eigentumsrechte für die in diesem Dateisystem gesicherten Dateien erhalten bleiben?
quelle
man acl
für Details.cp -a
beizubehalten, im Gegensatz zum Beispiel, wenn Unix-Berechtigungen beibehalten werden , da dies im Allgemeinen keinen Sinn ergibt.acl
wird im Allgemeinen nicht unterstützt. Der Kernel muss es unterstützen und Sie müssen es auf dem Dateisystem aktivieren, wenn Sie es als Mount-Option bereitstellen.Antworten:
Diese Antwort funktioniert auf Debian (getestet auf Lenny und Squeeze). Nach der Untersuchung scheint es nur dank eines Debian-Patches zu funktionieren. Benutzer anderer Distributionen wie Ubuntu haben möglicherweise kein Glück.
Sie können verwenden
mount --bind
. Hängen Sie das "echte" Dateisystem in ein Verzeichnis ein, auf das nicht öffentlich zugegriffen werden kann. Erstellen Sie einen schreibgeschützten Bind-Mount, auf den Sie besser zugreifen können. Erstellen Sie eine Lese- / Schreibbindung für das Teil, das Sie mit Lese- / Schreibzugriff verfügbar machen möchten.In Ihrem Anwendungsfall können Sie Folgendes tun:
Dh das echte
snapshot
Verzeichnis unter ein eingeschränktes Verzeichnis stellen, abersnapshot
Leseberechtigungen für alle geben. Es ist nicht direkt zugänglich, da das übergeordnete Element nur eingeschränkten Zugriff hat. Binden Sie es schreibgeschützt an einen zugänglichen Ort, damit jeder es über diesen Pfad lesen kann.(Nur-Lese-Bind-Mounts wurden erst einige Jahre nach Einführung der Bind-Mounts möglich, sodass Sie sich vielleicht an eine Zeit erinnern, als sie nicht funktionierten. Ich weiß es nicht ohne weiteres, seit sie funktionieren, aber sie arbeiteten bereits in Debian Lenny (dh jetzt oldstable).)
quelle
mount -V
), aber dieser Befehl hat nicht funktioniert (und laut Manpage können Sie die Mount-Optionen nicht als Teil des Bind-Befehls ändern). Ich hatte jedoch Erfolg (nachdem ich zum fünfzigsten Mal die Manpage durchgesehen hatte),mount --bind /var/smb/snapshots /var/smb/test
gefolgt vonmount -o remount,ro /var/smb/test
. (Offensichtlich war dies ein Test, wenn Sie nicht an meinen schönen Verzeichnisnamen erkennen konnten!)mount -o bind,ro
funktioniert dort auch nicht. Ich denke, das ist doch ein Debian-Patch!@ Gilles war wirklich nah dran, für Ubuntu 10.10 nur ein bisschen daneben (ich habe keinen Grund zu bezweifeln, dass er für Debian Squeeze und möglicherweise für andere Recht hat). Durch das Mounten meines Lese- / Schreib-Snapshots-Verzeichnisses unter einem Ordner, auf den andere Benutzer nicht zugreifen können (z. B. / var / smb / hidden / snapshots, wobei / var / smb / hidden über Berechtigungen 770 verfügt und root: root gehört), kann ich das Verzeichnis schützen Lese- / Schreib-Mount von anderen Benutzern. Ich kann dann
mount --bind
gefolgt von verwendenmount -o remount,ro
, um das Mount an einen zugänglichen Ort zu binden und es dann schreibgeschützt zu machen.(Die Umkehrung (das ursprüngliche Dateisystem schreibgeschützt bereitstellen, dann schreibgeschützt binden) funktioniert nicht. In ähnlicher Weise wird das ursprüngliche schreibgeschützte Dateimaterial gemountet, dann schreibgeschützt gebunden und anschließend das ursprüngliche Lese- / Schreibprogramm erneut bereitgestellt das gebundene Verzeichnis auch Lese- / Schreibzugriff.)
Um es noch einmal zusammenzufassen, hier ist die Lösung:
Es gibt also ein kurzes Zeitfenster, in dem die Backups schreibgeschützt und allgemein zugänglich sind, aber es ist klein genug, um für meine Anforderungen verwendet werden zu können. Einige Tricks mit den Berechtigungen für / var / smb könnten es während dieses kurzen Fensters schützen (dh es nicht durchlaufbar machen, dann die Halterung binden, dann wieder durchlaufbar machen), wenn diese kurzen Millisekunden ein zu großes Fenster sind.
Jetzt muss ich das alles nur noch in einem Skript zusammenfassen. Schieben Sie es direkt nach dem Mounten in den Startvorgang, um Konflikte zu vermeiden, die durch Samba verursacht werden könnten, der versucht, das Verzeichnis freizugeben, an das ich binde.
Hinweis: Wenn Ihre Distribution die
mount -o bind,ro
von Gilles veröffentlichte Version unterstützt , empfehle ich diese Lösung für Sie. Meine Lösung ist hier, sollte nur von Leuten unter Ubuntu oder anderen Distributionen verwendet werden, die es Ihnen nicht erlauben, die Mount-Optionen zu ändern, wenn Sie an ein anderes Verzeichnis binden.quelle
mount
wie vorgesehen zum Laufen zu bringen . Aber ich bin immer noch verwirrt.