Die folgenden Lösungen verwenden Namespaces über den unshare
Befehl. Prozesse in anderen Namespaces können den Mount nicht sehen.
Wir können es nicht verwenden, unshare -r
weil es mit nogroups
Gruppenrechten läuft, die encfs / fuse nicht mögen.
Lösung 1 (fragt bei jedem Start nach Stammrechten)
Wir sudo unshare
erstellen das Bind-Mount und kennzeichnen es als privat. Sobald dies erledigt ist, ändern wir den Benutzer in sudo caller ( sudo -u "#$SUDO_UID" -g "#$SUDO_GID"
) und explizit entfernen root root ( sudo -K
). An diesem Punkt können wir anrufen encfs
und mit Sachen anfangen your_program_here
. Wenn der private Bind-Mount beendet wird, wird er vom übergeordneten Root-Bash gelöscht (ohne erneut nach dem Benutzer-Root-Passwort zu fragen), sodass er nicht mehr von Root durch sichtbar ist mount -l
.
enc_dir="/path/to/enc_dir" mount_point="/path/to/plain_dir" RUN_CMD="mount --bind \"$mount_point\" \"$mount_point\"; \ mount --make-private \"$mount_point\"; \ sudo -u \"#\$SUDO_UID\" -g \"#\$SUDO_GID\" \ bash -c \"sudo -K; \ encfs \\\"$enc_dir\\\" \\\"$mount_point\\\"; \ your_program_here \\\"\\\$@\\\"; \ fusermount -u -z \\\"$mount_point\\\" \ \" - \"\$@\"; \ umount \"$mount_point\"" sudo unshare -m bash -c "$RUN_CMD" - "optional" "arguments"
your_program_here
kann beliebig sein, zB bash
für eine Eingabeaufforderung. Sie können diesem Programm Argumente ($ 1 = "optional" $ 2 = "Argumente") ordnungsgemäß übergeben.
Quelle: Einen sudoed-Befehl nach Beendigung des Skripts starten? Antwort von Celada + siehe Quellenlösung 2.
Lösung 2 (hat eine kritische Sicherheitsanfälligkeit, wenn Sie nicht teilen> = v2.27.1 verwenden)
Um unshare
nicht als root ausgeführt zu werden, müssen wir das setuid-Bit verwenden.
sudo groupadd unshare sudo adduser $USER unshare sudo chmod u+s /usr/bin/unshare sudo chown root:unshare /usr/bin/unshare
Warnung : Dies führt zu einer Sicherheitsanfälligkeit in den letzten nicht gemeinsam genutzten Versionen (seit Version 2.27.1 ) und darf nicht verwendet werden, da bei der Ausführung des Befehls die Freigabe der Root-Rechte nicht mehr nachlässt, sodass jeder über Root-Zugriff verfügen kann. Eine Problemumgehung existiert und wird hier beschrieben .
Dann (möglicherweise ist ein neues Terminal erforderlich):
unshare -m
Wir sollten jetzt eine Shell mit $
Benutzerzeichen haben, nicht #
Root-Zeichen. Jetzt müssen wir explizit private
oder rprivate
in den Mount-Optionen angeben (Erklärung in den folgenden Quellen) und anschließend encfs starten.
enc_dir="/path/to/enc_dir" mount_point="/path/to/plain_dir" sudo mount --bind "$mount_point" "$mount_point" sudo mount --make-private "$mount_point" encfs "$enc_dir" "$mount_point"
Prozesse, die von dieser Shell aus gestartet werden, können den Einhängepunkt anzeigen. Andere Prozesse werden nicht.
Quelle: Einen verschlüsselten Ordner in einem gemeinsam genutzten System ohne Root-Zugriff (unshare -m) verbergen, kommentiert von Philipp Wendler & Cant 'Get Per Process Mount-Namespaces, um zu funktionieren, Antwort von ub1quit33
Lösung 3? (Bester der Rasse)
Weitere Möglichkeiten, die noch weiter erforscht werden sollten: Es ist wahrscheinlich etwas zu tun, indem Sie das Skript für die Lösung 1 in eine .sh
Datei setuid
einfügen und bit + chown wie in Lösung 2 festlegen. #$SUDO_*ID
Variablen müssen möglicherweise durch etwas anderes ersetzt werden, und die sudo -K
Wirksamkeit muss getestet werden.
Die Variablen enc_dir und mount_point sollten nicht parametrierbar sein, da sie nicht sicher verwendet werden. Andernfalls sollten sie mit Escapezeichen versehen werden, oder besser, sie sollten als erste Parameter für das Nicht-Teilen übergeben werden (daher sollte $ @ durch den Bereich der Positionsparameter $ {@: 2} ersetzt werden).
Oder füllen Sie eine Funktionsanforderung für die Unterstützung von encfs / fuse aus unshare -r
, um Entwickler freizugeben ...