Privates encfs-mount (eingeschränkter Zugriff pro Prozess)

458
KrisWebDev

Wie beschränke ich den Zugriff auf ein encfs-Mount auf (einen) bestimmten Prozess (e)?

Standardmäßig ist encfs nur für den aktuellen Benutzer sichtbar (außer bei Verwendung der --publicOption).

Das Ausführen von encfs als anderer Benutzer hat den Nachteil, dass er für Berechtigungsprobleme anfällig ist, da die Dateien dem anderen Benutzer gehören, möglicherweise mit einschränkenden Berechtigungen. Ich möchte mich nicht mit Erlaubnisfragen beschäftigen.

Ich möchte also encfs von demselben Benutzer ausführen und die Zugriffsbeschränkungen pro Prozess behandeln, z. B. von Kontrollgruppen (cgroups) oder Namespaces.

2
Möchten Sie Ihre Dateien wirklich vor sich selbst verbergen? Sie vertrauen nicht einmal Ihren eigenen Programmen? Möglicherweise benötigt Ihr Sicherheitsmodell ein sichereres Setup (Computer, Betriebssystem usw.). Xen2050 vor 8 Jahren 0

1 Antwort auf die Frage

2
KrisWebDev

Die folgenden Lösungen verwenden Namespaces über den unshareBefehl. Prozesse in anderen Namespaces können den Mount nicht sehen.

Wir können es nicht verwenden, unshare -rweil es mit nogroupsGruppenrechten läuft, die encfs / fuse nicht mögen.

Lösung 1 (fragt bei jedem Start nach Stammrechten)

Wir sudo unshareerstellen 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 encfsund 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_herekann beliebig sein, zB bashfü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 unsharenicht 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 privateoder rprivatein 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 .shDatei setuideinfügen und bit + chown wie in Lösung 2 festlegen. #$SUDO_*IDVariablen müssen möglicherweise durch etwas anderes ersetzt werden, und die sudo -KWirksamkeit 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 ...

Danke für diesen Beitrag! Wird die Unhare-Lücke bald behoben? Wird dies bereits als Fehler gemeldet? Was ich an dieser Lösung nicht mag, ist, dass ich, um den Mountpunkt privat zu machen, root-Berechtigungen verwenden muss. Ich habe bisher keine andere Lösung gefunden, aber: Warum ist das so? Haben sie eine Idee? olenz vor 8 Jahren 0
@ olenz: Ich habe einige Ideen in Lösung 3 gesetzt, wenn Root-Rechte nicht bei jedem Start für Sie eine Option sind. `unshare`-Schwachstelle" ist kein Fehler, es ist eine Funktion ", da die` setuid'-Technik durch `unshare -r` ersetzt wurde. Encfs / fuse kann jedoch nicht in `unshare -r 'ausgeführt werden. KrisWebDev vor 8 Jahren 0