Ich denke, dass viele Details Ihrer Frage gleichermaßen zutreffen könnten avahi-daemon
, die ich kürzlich angeschaut habe. (Ich könnte ein anderes Detail übersehen haben, das sich jedoch unterscheidet). Das Ausführen von avahi-daemon in einer Chroot hat viele Vorteile, falls avahi-daemon gefährdet ist. Diese beinhalten:
- Es kann kein Basisverzeichnis eines Benutzers lesen und keine privaten Informationen herausfiltern.
- Es kann keine Bugs in anderen Programmen ausnutzen, indem es nach / tmp schreibt. Es gibt mindestens eine ganze Kategorie solcher Fehler. ZB https://www.google.de/search?q=tmp+race+security+bug
- Es kann keine Unix-Socket-Datei außerhalb der Chroot öffnen, auf der andere Daemons möglicherweise Nachrichten abhören und lesen.
Punkt 3 könnte besonders nützlich sein, wenn Sie keinen Dbus oder ähnliches verwenden ... Ich denke, Avahi-Daemon verwendet Dbus, sodass sichergestellt ist, dass der Zugriff auf den System-Dbus auch von innerhalb der Chroot aus möglich ist. Wenn Sie nicht in der Lage sein müssen, Nachrichten auf dem System-D-Bus zu senden, ist es möglicherweise eine nette Sicherheitsfunktion, diese Fähigkeit zu verweigern.
Verwaltung mit systemd Unit-Datei
Beachten Sie, dass avahi-daemon, wenn es neu geschrieben wurde, sich möglicherweise aus Sicherheitsgründen auf systemd verlassen und z ProtectHome
. Ich habe eine Änderung an Avahi-Daemon vorgeschlagen, um diese Schutzfunktionen als zusätzliche Ebene hinzuzufügen, zusammen mit einigen zusätzlichen Schutzfunktionen, die von Chroot nicht garantiert werden. Die vollständige Liste der von mir vorgeschlagenen Optionen finden Sie hier:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Es sieht so aus, als gäbe es weitere Einschränkungen, die ich hätte anwenden können, wenn avahi-daemon nicht chroot selbst verwendet hätte, von denen einige in der Festschreibungsnachricht erwähnt sind. Ich bin mir nicht sicher, wie viel dies gilt.
Beachten Sie, dass die von mir verwendeten Schutzfunktionen den Daemon nicht daran gehindert hätten, Unix-Socket-Dateien zu öffnen (siehe Punkt 3 oben).
Ein anderer Ansatz wäre die Verwendung von SELinux. Allerdings würden Sie Ihre Anwendung an diese Untergruppe von Linux-Distributionen binden. Der Grund, warum ich SELinux hier positiv fand, ist, dass SELinux den Zugriff, den Prozesse auf dbus haben, auf feinkörnige Weise einschränkt. Ich denke zum Beispiel, dass Sie oft erwarten können, dass systemd
dies nicht in der Liste der Busnamen enthalten ist, an die Sie Nachrichten senden müssen :-).
"Ich habe mich gefragt, ob die Verwendung von systemd-Sandboxen sicherer ist als chroot / setuid / umask / ..."
Zusammenfassung: Warum nicht beides? Lass uns das obenstehende ein wenig dekodieren :-).
Wenn Sie an Punkt 3 denken, bietet die Verwendung von Chroot mehr Einschränkungen. ProtectHome = und seine Freunde versuchen nicht einmal, so restriktiv wie chroot zu sein. (Zum Beispiel keine der genannten Systemd-Options-Blacklists /run
, in denen wir Unix-Socket-Dateien ablegen).
chroot zeigt, dass das Einschränken des Dateisystemzugriffs sehr mächtig sein kann, aber nicht alles unter Linux ist eine Datei :-). Es gibt systemd-Optionen, die andere Dinge einschränken können, die keine Dateien sind. Dies ist nützlich, wenn das Programm kompromittiert ist. Sie können die verfügbaren Kernelfunktionen reduzieren, um eine Sicherheitsanfälligkeit auszunutzen. Zum Beispiel benötigt avahi-daemon keine Bluetooth-Sockets und ich denke, Ihr Webserver auch nicht :-). Geben Sie ihm also keinen Zugriff auf die AF_BLUETOOTH-Adressfamilie. Verwenden Sie einfach die Whitelist AF_INET, AF_INET6 und möglicherweise AF_UNIX RestrictAddressFamilies=
.
Bitte lesen Sie die Dokumentation für jede Option, die Sie verwenden. Einige Optionen sind in Kombination mit anderen Optionen effektiver und einige sind nicht auf allen CPU-Architekturen verfügbar. (Nicht weil die CPU schlecht ist, sondern weil der Linux-Port für diese CPU nicht so gut ausgelegt ist. Ich denke).
(Hier gibt es ein allgemeines Prinzip. Es ist sicherer, wenn Sie Listen schreiben können, was Sie zulassen möchten, und nicht, was Sie ablehnen möchten. Wenn Sie beispielsweise eine Chroot definieren, erhalten Sie eine Liste der Dateien, auf die Sie zugreifen dürfen, und dies ist robuster als zu sagen, dass Sie blockieren möchten /home
).
Grundsätzlich können Sie alle Einschränkungen vor setuid () selbst anwenden. Es ist alles nur Code, den Sie von systemd kopieren können. Die Optionen für Systemeinheiten sollten jedoch wesentlich einfacher zu schreiben sein, und da sie in einem Standardformat vorliegen, sollten sie leichter zu lesen und zu überprüfen sein.
Daher kann ich nur empfehlen, den Sandbox-Abschnitt man systemd.exec
auf Ihrer Zielplattform zu lesen . Aber wenn Sie die sicherste Ausführung möglich wollen, würde ich keine Angst zu versuchen chroot
(und dann fallen root
Privilegien) in Ihrem Programm auch . Hier gibt es einen Kompromiss. Durch chroot
die Verwendung werden dem Gesamtdesign einige Einschränkungen auferlegt. Wenn Sie bereits ein Design haben, das Chroot verwendet und das zu tun scheint, was Sie brauchen, klingt das ziemlich gut.