Alle Dateien in einem Verzeichnis schreibgeschützt machen, ohne die Berechtigungen zu ändern?

7

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 --bindOption 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?

Kromey
quelle
Könnte man das vielleicht mit acl machen? Auf den ersten Blick scheint dies ein natürlicher Weg zu sein, da acl eine Erweiterung der Unix-Dateiberechtigungen ist. Neben den Standard-Unix-Berechtigungen gibt es auch acl.
Faheem Mitha
@Faheem Zugegeben, ich weiß nicht, ob dies mit acl möglich ist oder nicht, aber ich vermute nicht, da eine meiner Anforderungen hier darin besteht, vorhandene Berechtigungen beizubehalten (um es Benutzern zu erleichtern, Dateien aus dem Backup selbst wiederherzustellen, ohne dies zu tun) Berechtigungen erneut ändern, wenn sie dies tun) und gleichzeitig das Ganze schreibgeschützt machen. Ich weiß, das klingt widersprüchlich, aber dank Gilles 'Hilfe unten habe ich eine Antwort darauf.
Kromey
acl kann Unix-Berechtigungen überschreiben, ohne sie zu ändern. Die Idee ist, dass Benutzer beim Zurückkopieren dieselben Berechtigungsflags wie ihre ursprüngliche Sicherung haben, oder? So können Sie acl auf die gewünschten Berechtigungen für jeden Benutzer einstellen. Wenn ein ACL-Eintrag festgelegt ist, ignoriert er die entsprechende Unix-Berechtigung, ohne sie zu ändern. Siehe man aclfür Details.
Faheem Mitha
@Faheem Werden die zusätzlichen ACL-Berechtigungen effektiv "verschwinden", wenn die Datei aus dem Backup kopiert wird? Wenn die acl-Berechtigungen beim Verschieben an der Datei "haften", spielt es keine Rolle, dass die (ignorierten) zugrunde liegenden Unix-Berechtigungsbits unverändert bleiben. Ich werde es jedoch als eine mögliche einfachere Lösung betrachten ...
Kromey
Die ACL-Berechtigungen werden für den Verzeichnispfad festgelegt. Ja, sie "verschwinden", wenn die Datei verschoben wird. :-) Und ich glaube nicht, dass Standard-Unix-Tools versuchen, sie cp -abeizubehalten, im Gegensatz zum Beispiel, wenn Unix-Berechtigungen beibehalten werden , da dies im Allgemeinen keinen Sinn ergibt. aclwird 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.
Faheem Mitha

Antworten:

6

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.

mkdir /media/hidden /media/hidden/sdz99
chmod 700 /media/hidden
mount /dev/sdz99 /media/hidden/sdz99
mount -o bind,ro /media/hidden/sdz99/world-readable /media/world-readable
mount -o bind /media/hidden/sdz99/world-writable /media/world-writable

In Ihrem Anwendungsfall können Sie Folgendes tun:

mkdir /var/smb/hidden
mv /var/smb/snapshot /var/smb/hidden
mkdir /var/smb/snapshot
chmod 700 /var/smb/hidden
chmod 755 /var/smb/hidden/snapshot
mount -o bind,ro /var/smb/hidden/snapshot /var/smb/hidden/snapshot

Dh das echte snapshotVerzeichnis unter ein eingeschränktes Verzeichnis stellen, aber snapshotLeseberechtigungen 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).)

Gilles 'SO - hör auf böse zu sein'
quelle
Vielleicht packt Ubuntu ein sehr veraltetes Mount (2.17.2 gemäß 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/testgefolgt von mount -o remount,ro /var/smb/test. (Offensichtlich war dies ein Test, wenn Sie nicht an meinen schönen Verzeichnisnamen erkennen konnten!)
Kromey
Das ist seltsam: Mount 2.13.1 erstellt gerne einen schreibgeschützten Bind-Mount auf einem 2.6.32-Kernel (Debian Squeeze), und ich erinnere mich, dass dies auch auf 2.6.26 (Lenny) möglich ist. Die Manpage war einmal korrekt, muss aber aktualisiert werden.
Gilles 'SO - hör auf böse zu sein'
Ich habe jede erdenkliche Permutation der bind- und ro-Optionen ausprobiert ("bind" ist übrigens keine gültige Option für -o, aber ein gültiger Schalter als --bind oder -B), bin aber damit nicht weitergekommen . Kernel 2.6.35 (Ubuntu Maverick Meercat). Vielleicht hat Debian einen ganz anderen Mount-Befehl? Aber Ubuntu basiert auf Debian, so dass das nicht wahrscheinlich erscheint. Das ist ein wirklich seltsamer Ort, um einen Unterschied in diesen beiden Distributionen zu finden ...
Kromey
@Kromey: Ich habe gerade auf Ubuntu 10.04 getestet und mount -o bind,rofunktioniert dort auch nicht. Ich denke, das ist doch ein Debian-Patch!
Gilles 'SO - hör auf böse zu sein'
1
Ich akzeptiere Ihre Antwort auf diese Frage, da a) sie (anscheinend kann ich sie selbst nicht überprüfen) für Debian (und wahrscheinlich auch für andere) gültig ist und b) sie mich direkt dazu veranlasst, die Lösung unter Ubuntu zu finden. Für zukünftige Leute, die diesen Artikel lesen, funktioniert Gilles 'Antwort unter Ubuntu jedoch nicht , und Sie benötigen stattdessen meine Antwort.
Kromey
7

@ 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 --bindgefolgt von verwenden mount -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:

mkdir /var/smb/hidden
chown root:root /var/smb/hidden
chmod 770 /var/smb/hidden
mkdir /var/smb/hidden/snapshots
mksdir /var/smb/snapshots
mount /dev/md2 /var/smb/hidden/snapshots
mount --bind /var/smb/hidden/snapshots /var/smb/snapshots
mount -o remount,ro /var/smb/snapshots

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,rovon 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.

Kromey
quelle
2
Ich beobachte das gleiche (ziemlich verwirrende!) Verhalten wie Sie unter Ubuntu 10.04.
Gilles 'SO - hör auf böse zu sein'
Mann, +1! Dies hat mir geholfen, eine Busybox mount wie vorgesehen zum Laufen zu bringen . Aber ich bin immer noch verwirrt.
Camilo Martin