Gibt es ein Linux-VFS-Tool, mit dem ein Verzeichnis an einem anderen Speicherort (wie mount --bind) im Benutzerbereich gebunden werden kann?

7

Für einen Benutzerprozess möchte ich ein Verzeichnis an einem anderen Speicherort, jedoch im Benutzerbereich ohne Root-Berechtigungen, bereitstellen. So etwas wie mount --bind / origin / dest, aber mit einem vfs-Wrapper. Wie eine fein abgestimmte Chroot im Usermode.

Das Programm würde die Systemaufrufe in Dateien verpacken, um die benötigten Pfade zu "ersetzen". Es könnte mit einer Kommandozeile aufgerufen werden wie:

bindvfs / fake-home: / home ls / home

Ich bin sicher, dass es diese bereits gibt! :) :)

Keymon
quelle

Antworten:

2

Sie können PRoot fast genauso verwenden wie in Ihrem Beispiel:

proot -b /fake-home:/home ls /home

Im Gegensatz zu BindFS / FUSE kann PRoot Dateien und Verzeichnisse binden, die Sie nicht besitzen.

Cedric
quelle
Perfekt, genau daran habe ich gedacht
Keymon
Einige andere ptrace-basierte Ansätze - unix.stackexchange.com/a/72697/4319 .
imz - Ivan Zakharyaschev
2

Das Papageienprogramm kann das tun, wonach Sie fragen: Systemaufrufe abfangen und bestimmte Pfade umleiten (z. B. werden alle Pfade, die mit beginnen, neu /anonftpzugeordnet, um transparent über FTP auf entfernte Dateien zuzugreifen). Es läuft auch vollständig im Userspace.

Trotz einer beeindruckenden Anzahl gängiger und ungewöhnlicher Netzwerkprotokolle parrotgibt es kein Modul zum einfachen Umschreiben von Dateisystemen> Dateisystemen, wie Sie es wünschen. Das sollte ganz einfach hinzuzufügen sein, wenn Sie sich mit C-Programmierung auskennen.

Alternativ funktioniert bindfs (das über FUSE ausgeführt wird ) wie ein mount --bindIn-Userspace. (Dies geht jedoch in umgekehrter Richtung in Bezug auf die Umleitung /home, /fake-homewie Sie in Ihrer Frage erwähnt haben.)

Riccardo Murri
quelle
Ich habe dieses Programm nicht gekannt, Papagei. Ich werde sie mailen.
Keymon
1

VFS ermöglicht bereits das Nicht-Root-Mounten von Dateisystemen. Sie können dem fstab-Eintrag die Option useroder hinzufügen usersund sicherstellen, dass sie aktiviert vfs.usermount=1ist /etc/sysctl.

Nichts davon gibt Ihnen jedoch chroot-ähnliche Steuerelemente. Die bindOption ändert weder die Berechtigungen noch ermöglicht sie einen alternativen Zugriff. Dies ist ein zweiter mtab-Eintrag für genau dasselbe Dateisystem und denselben Inhalt. Änderungen an der Bindehalterung wirken sich auf das Original aus.

Ich würde sicherstellen, dass Sie Ihr Endziel klarstellen, bevor Sie fortfahren.

nzwulfin
quelle
Stellen Sie sich diese Situation gut vor: Ich habe ein vorkompiliertes Programm, das ich nicht neu kompilieren kann. Dieses Programm greift auf einen festen Pfad zu, wie '~ / .program-data', und ich muss mehrere Instanzen des Programms als Benutzer starten, ohne chroot zu machen. Natürlich könnte ich eine Chroot-Umgebung erstellen und Fakechroot verwenden, aber es ist zu komplex.
Keymon
1
In diesem Fall versuchen Sie also, /var/program-dataBenutzern einen freigegebenen Speicherort (wie ) für alle Zugriffe bereitzustellen, wie ~/.program-databeim Ausführen des Programms? Oder versuchen Sie, für ~/.program-datajede Instanz eines Programms, das von demselben Benutzer ausgeführt wird , separate Kopien bereitzustellen ?
Nzwulfin
Beide Situationen sind in Ordnung. Wenn kann durch Prozessinstanz sein, besser.
Keymon
0

Mit mount_namespaces können Sie mount --bindvon anderen Prozessen nicht gesehen werden. Normalerweise mount --bindist dies jedoch nur dem Root-Benutzer vorbehalten (aus Sicherheitsgründen). Damit mount_namespaces für einen Nicht-Root-Benutzer von Nutzen ist, sollten Sie user_namespaces zuerst verwenden , um ein "lokaler Root" in einem neuen Namespace zu werden, in dem dieser Vorgang dann zulässig wäre.

Sie können damit in Ihrer Shell so spielen - dieses Beispiel zeigt speziell die Verwendung von Benutzer- und Mount-Leerzeichen bei der Vorbereitung eines Chroot-Verzeichnisses (und der chrootVorgang ist normalerweise auch privilegiert):

unshare --user --map-root-user --mount-proc --pid --fork
mkdir -p newroot/dev
mount --rbind /dev newroot/dev
....other chroot preparation....
chroot newroot
su - user1

Beachten Sie, dass ich mount --rbind(anstelle von mount --bind) verwende, da nur dies im neuen Benutzer- und Mount-Namespace funktioniert, wenn das Verzeichnis andere Mount-Punkte enthält (und /dev/in meinem Fall auch).

Vielleicht ist die Erklärung dafür, dass der Benutzer keine Möglichkeit bekommen sollte, etwas zu sehen, was normalerweise ein nicht privilegierter Benutzer nicht sehen würde, dh die von den "Submounts" ausgeblendeten Unterverzeichnisse. Es ist nur --rbinderlaubt , die Submounts nicht zu entfernen .

imz - Ivan Zakharyaschev
quelle