So erlauben Sie Benutzern, Dateien unter Linux an andere Benutzer zu übertragen

10

Wir haben eine Umgebung von einigen tausend Benutzern, die Anwendungen auf ungefähr 40 Clustern ausführen, deren Größe von 20 Rechenknoten bis 98.000 Rechenknoten reicht. Benutzer auf diesen Systemen generieren massive Dateien (manchmal> 1PB), die von herkömmlichen Unix-Berechtigungen gesteuert werden (ACLs sind aufgrund der speziellen Natur des Dateisystems normalerweise nicht verfügbar oder praktisch).

Wir haben derzeit ein Programm namens "give", ein Suid-Root-Programm, mit dem ein Benutzer eine Datei einem anderen Benutzer "geben" kann, wenn die Gruppenberechtigungen nicht ausreichen. Ein Benutzer würde also Folgendes eingeben, um einem anderen Benutzer eine Datei zu geben:

> give username-to-give-to filename-to-give ...

Der empfangende Benutzer kann dann einen Befehl namens "take" (Teil des give-Programms) verwenden, um die Datei zu empfangen:

> take filename-to-receive

Die Berechtigungen der Datei werden dann effektiv an den empfangenden Benutzer übertragen.

Dieses Programm gibt es schon seit Jahren und wir möchten die Dinge unter Sicherheits- und Funktionsgesichtspunkten erneut betrachten.

Unser aktueller Aktionsplan besteht darin, die Bitfäule in unserer aktuellen Implementierung von "give" zu entfernen und als Open Source-App zu verpacken, bevor wir sie erneut in der Produktion bereitstellen.

Hat jemand eine andere Methode, um extrem große Dateien zwischen Benutzern zu übertragen, wenn nur herkömmliche Unix-Berechtigungen verfügbar sind?

Jon Bringhurst
quelle
1
Gibt es einen Grund, warum Sie nicht einfach ein freigegebenes Verzeichnis erstellen können, auf das alle Benutzer Zugriff haben?
Zoredache
1
Wenn es ein Verzeichnis mit freigegebenem Zugriff gibt, haben Benutzer ohne Berechtigung Zugriff auf Dateien, während sie freigegeben werden. In dieser Umgebung sind manchmal auch Dateinamen vertraulich. Ein freigegebenes Verzeichnis ist also leider keine Option. Bei einem freigegebenen Verzeichnis besteht auch die Möglichkeit, dass ein dritter Benutzer die Datei manipuliert.
Jon Bringhurst
Wäre es nicht ausreichend, wenn ein Cron-Job Dateien selbst kopieren würde? Beispiel: Benutzer foo möchte dem Benutzerwelpen eine Dateileiste geben. Deshalb erstellt er ein spezielles Verzeichnis, das von einem Cron-Job mit einer Steuerdatei gescannt wird, die den empfangenden Benutzernamen enthält. Die Cron-Jobs würden diese 'Steuer'-Datei lesen. Wenn der Benutzer in Ordnung ist, das Zielverzeichnis über Speicherplatz verfügt, ist die Kopie in Ordnung. Sie können weiterhin einen Wrapper für 'give' erstellen, um nur eine 'Control'-Datei zu erstellen, die historische Kompatibilität aufweist. Suid-root ist nicht erforderlich. Sie können diese Datei unter einem Benutzer ohne Rootberechtigung kopieren und dann sudo verwenden, um den Eigentümer zu ändern.
Jirib
Wenn Sie nur die Berechtigungen ändern möchten, chownsollten Sie dies tun. Es scheint, dass Sie die Datei auch kopieren möchten, sobald beide beteiligten Parteien zugestimmt haben.
Zebediah49
@JiriXichtkniha Ich mag die Idee einer Steuerdatei und eines Cron-Jobs. Die Dateien sind jedoch zu groß, um kopiert zu werden.
Jon Bringhurst

Antworten:

1

Wenn der Emitter wirklich bereit ist, die Datei weiterzugeben, können Sie eine SUID-Binärdatei verwenden, die die Datei in ein Verzeichnis verschiebt, das von allen geschrieben werden kann und das Sticky-Bit (wie /tmp) enthält, und dann den Eigentümer in den neuen Eigentümer ändert. chown(3)kümmert sich bereits darum, die set-user-IDund set-group-IDBits für Sie zu entfernen . Auf diese Weise kann der neue Eigentümer mit der Datei tun, was er will, einschließlich des Verschiebens.

Dieses von allen beschreibbare Verzeichnis kann zum Home-Verzeichnis des Benutzers gehören, falls Sie mehrere Dateisysteme für Home-Verzeichnisse verwenden und sicherstellen möchten, dass Sie keine Dateisystemgrenzen überschreiten, da die Leistung sofort schrecklich wäre. In diesem Fall möchten Sie wahrscheinlich sicherstellen, dass der Empfänger weiß, wann eine neue Datei angeboten wird.

E-Mails würden den Trick machen. Eine Unixy-Lösung wäre eine /etc/profile, die Ihre neu gelieferten Dateien auflistet. Zusätzlicher Bonus, wenn Sie diese Funktion mit anbieten pam_echo( z. B. mit file=/tmp/deliveries/%u, siehe pam_echo(8)). Wie bei allem, was mit PAM zu tun hat, sollten Sie zuerst überprüfen, ob alle Ihre Implementierungen ein solches Modul bieten.

Pierre Carrier
quelle
0

Sie können ein System mit einem gemeinsam genutzten Verzeichnis verwenden (möglicherweise ohne Ausführungsberechtigung), in dem Dinge für einen bestimmten Benutzer mit einer bestimmten Dateinamenstruktur archiviert werden ( to-$username_from-$username.tarz. B.). Give macht die Datei und chownssie an den Zielbenutzer; take extrahiert die Datei und entfernt sie.

Wenn Sie es tatsächlich verschieben möchten (IE, Dateispeicherort und Berechtigungen ändern; kein Kopieren aufgrund der riesigen Dateigröße), können Sie möglicherweise mit dem Verschieben in ein freigegebenes Verzeichnis mit -x-Perms davonkommen (das kann also niemand Dateien dort auflisten) und die gleiche chownMethode. mv, chown/ mv.

zebediah49
quelle
0

Wie xryl669 sagt, können Sie ein Verzeichnis verwenden, um die Dateien tatsächlich freizugeben. Es sollte so aussehen:

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

Der Befehl give wird

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

Der Befehl take sieht ungefähr so ​​aus:

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~
miniBill
quelle
0

Ich würde vorschlagen, die App neu zu schreiben, um tatsächlich ein "Geben" und "Nehmen" nachzuahmen, sondern sie aus einem geschützten Verzeichnis zu "drücken" und "zu ziehen". Auf Ihr Verzeichnis kann nur für die Push / Pull-App zugegriffen werden, die die Dateiverschiebungen verarbeitet. Alternativ kann Ihre App / Ihr Skript ein zufälliges, temporäres Verzeichnis erstellen, wobei die Berechtigungen nur für den Absender und den Empfänger festgelegt werden.

Möchten Sie mehr Sicherheit haben? Sie können die Datei mit PGP verschlüsseln / signieren (mit dem öffentlichen Schlüssel des Empfängers).

In Bezug auf das Wiederherstellen unter "Sicherheits- und Funktionsgesichtspunkten" würde ich dringend empfehlen, keine SUID-Programme zu erstellen. Wenn Sie Berechtigungen nicht ordnungsgemäß löschen, können Sie virtuell auf jede Datei im System zugreifen. Wenn Ihr Programm fehlerhaft ist (Pufferüberlauf usw.), können Sie dies ausnutzen, um Root-Zugriff auf Ihr System zu erhalten.

ndrix
quelle
0

Dies nützt Ihnen wahrscheinlich nichts, aber als Referenz erstellt cp --reflink source target dünne Kopien von Dateien mithilfe von Copy-on-Write.

Dies bedeutet, dass Sie die Datei direkt kopieren können und nur geänderte Blöcke tatsächlich kopiert werden. Im Gegensatz zu einem festen Link verfügt die neue Datei über einen eigenen Inode und eigene Metadaten. Dies bedeutet, dass Sie dem neuen Benutzer die Kopie der Datei mit Standard-Chown-Inhalten zur Verfügung stellen können.

Soweit mir bekannt ist, ist dies eine Funktion, die derzeit nur für OCFS2 und btrfs verfügbar ist. Ich denke, das löst Ihr Problem, aber da die Verfügbarkeit nicht weit verbreitet ist, wird es wahrscheinlich nicht nützlich sein.

Matthew Ife
quelle