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?
quelle
chown
sollten Sie dies tun. Es scheint, dass Sie die Datei auch kopieren möchten, sobald beide beteiligten Parteien zugestimmt haben.Antworten:
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, dieset-user-ID
undset-group-ID
Bits 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 anbietenpam_echo
( z. B. mitfile=/tmp/deliveries/%u
, siehepam_echo(8)
). Wie bei allem, was mit PAM zu tun hat, sollten Sie zuerst überprüfen, ob alle Ihre Implementierungen ein solches Modul bieten.quelle
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.tar
z. B.). Give macht die Datei undchowns
sie 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
chown
Methode.mv
,chown
/mv
.quelle
Wie xryl669 sagt, können Sie ein Verzeichnis verwenden, um die Dateien tatsächlich freizugeben. Es sollte so aussehen:
Der Befehl give wird
Der Befehl take sieht ungefähr so aus:
quelle
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.
quelle
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.
quelle