Ich möchte einen Befehl unter Linux so ausführen, dass keine zu schreibenden Dateien erstellt oder geöffnet werden können. Es sollte weiterhin in der Lage sein, Dateien wie gewohnt zu lesen (eine leere Chroot ist also keine Option) und weiterhin in bereits geöffnete Dateien schreiben zu können (insbesondere in stdout).
Bonuspunkte, wenn das Schreiben von Dateien in bestimmte Verzeichnisse (dh das aktuelle Verzeichnis) weiterhin möglich ist.
Ich suche nach einer Lösung, die prozesslokal ist, dh weder Dinge wie AppArmor oder SELinux für das gesamte System konfiguriert noch Root-Rechte. Möglicherweise müssen jedoch die Kernelmodule installiert werden.
Ich habe mir Funktionen angesehen, und diese wären nett und einfach gewesen, wenn es eine Funktion zum Erstellen von Dateien gegeben hätte. ulimit ist ein weiterer Ansatz, der praktisch wäre, wenn er diesen Anwendungsfall abdecken würde.
strace
Hier erfahren Sie, welche Dateien das Programm öffnet. Warum willst du das tun? Ist es ein bestimmtes Programm oder möchten Sie dies zum Testen oder etwas anderes? Können Sie das Programm als Benutzer / Gruppe ausführen, die fast überall nur im aktuellen Verzeichnis schreiben darf? Moderne Linux-Distributionen verwenden die Idee einer Gruppe für jeden Benutzer, daher sollte dies relativ einfach einzurichten sein.Antworten:
Wie wäre es, wenn Sie eine leere Chroot erstellen und dann das Hauptdateisystem als schreibgeschützt in die Chroot einbinden?
Sollte wahrscheinlich so etwas sein, um ein schreibgeschütztes Bind-Mount zu erstellen:
Sie können andere Verzeichnisse binden, auf die das Gefängnis auch Schreibzugriff haben soll. Seien Sie vorsichtig, wenn Sie spezielle Verzeichnisse (/ dev /, / proc /, / sys /) binden müssen. Das Mounten kann unverändert sein.
quelle
/foo/
der Pfad zum Hauptdateisystem?Es scheint, dass das richtige Werkzeug für diesen Job
fseccomp
aufsync-ignoring
f-Code von Bastian Blank basiert. Ich habe diese relativ kleine Datei entwickelt, die dazu führt, dass alle untergeordneten Dateien keine Datei zum Schreiben öffnen können:Hier sehen Sie, dass es immer noch möglich ist, Dateien zu lesen:
Es verhindert nicht das Löschen oder Verschieben von Dateien oder andere Dateivorgänge neben dem Öffnen, aber das könnte hinzugefügt werden.
Ein Tool, das dies ermöglicht, ohne C-Code schreiben zu müssen, ist syscall_limiter .
quelle
Würden Sie in Betracht ziehen, einen Ersatz für die
open(…)
Funktion zu schreiben und ihn mit LD_PRELOAD zu laden?quelle
open
... Nun, ich würde in Betracht ziehen, eine vorhandene Lösung zu verwenden, die diesen Ansatz verwendet, ja.write(…)
.Die einfachste Lösung ist wahrscheinlich ein Wrapper-Programm, das einen neuen Dateisystem-Namespace mit den entsprechenden Dateisystemen erstellt, die schreibgeschützt bereitgestellt sind, und dann das Programm ausführt, das Sie einschränken möchten.
Dies ist der
systemd
Fall, wenn SieReadOnlyDirectories=
bestimmte Verzeichnisse als schreibgeschützt für einen Dienst markieren. Es gibt auch einenunshare
Befehlutil-linux
, mit dem Sie einen neuen Namespace erstellen können. Sie können also Folgendes tun:Wo
wrapper
müsste dann nur Dateisysteme nach Bedarf neu gemountet werden, bevor das eigentliche Zielprogramm gestartet wird.Das einzige Problem ist, dass Sie sein müssen
root
, um den neuen Namespace zu erstellen ...quelle
Sie könnten es in einer Chroot laufen lassen
/tmp
und spezielle Versionen von und dergleichen darin montieren. Vielleicht hilft systemd , insbesondere systemd-nspawn (1) , das genau so aussieht, wie Sie es möchten.quelle
Eine virtuelle Maschine würde es dem Skript ermöglichen, überall zu schreiben, ohne das Hostsystem zu beeinträchtigen, und zu überprüfen, wohin es tatsächlich zu schreiben versucht, was die Ziele zu sein scheinen.
Sie können Arch Linux beispielsweise problemlos mit starten
quelle
Eine anfängliche Einrichtung als Root ist wirklich der einfachste Weg. Insbesondere ist ein Chroot in einem schreibgeschützten Bind-Mount der Weg des geringsten Widerstands.
Sie können bindfs verwenden, anstatt
mount --bind
die schreibgeschützte Ansicht zu erstellen, ohne root sein zu müssen. Sie müssen jedoch etwas als root tun, um den Zugriff auf andere Dateien wie chroot zu verhindern.Ein anderer Ansatz ist
LD_PRELOAD
eine Bibliothek, die sich in das Öffnen von Dateien einhakt und das Schreiben verweigert. Dies erfordert keine besonderen Berechtigungen. Aus Sicherheitsgründen kann dies umgangen werden, aber es ist in Ordnung für Ihren Anwendungsfall, in dem Sie nur eine bestimmte Funktion und keinen beliebigen nativen Code enthalten müssen. Ich kenne jedoch keine vorhandene Bibliothek dafür.LD_PRELOAD
kann auch verwendet werden, um das Programm auf die schreibgeschützte Ansicht zu beschränken, die mitmount --bind
oder erstellt wurdebindfs
; Auch hier kenne ich keine vorhandene Bibliothek.Unter Debian und Derivaten können Sie eine Schroot- Umgebung einrichten . Schroot ist setuid root und muss als root konfiguriert werden, kann aber von jedem autorisierten Benutzer ausgeführt werden.
Eine Methode, die keine Zusammenarbeit von root erfordert, besteht darin, den Prozess in einer virtuellen Maschine auszuführen. Sie können KVM oder VirtualBox oder Linux im Benutzermodus einrichten . Es ist ein bisschen schwergewichtig und bedeutet zusätzlichen Speicherverbrauch, sollte aber die Geschwindigkeit der symbolischen Rohberechnung nicht wesentlich beeinflussen.
Wie kann man einen Prozess "einsperren", ohne root zu sein? könnte Inspiration geben.
quelle
Eine Möglichkeit, um zumindest zu verhindern, dass der Prozess die Dateien schreibt (aber nicht erstellt), besteht darin,
ulimit -f 0
zuerst aufzurufen . Dadurch wird der Vorgang abgebrochen, sobald versucht wird, in eine Datei zu schreiben. Das Erstellen leerer Dateien ist jedoch weiterhin möglich.quelle