Sichere Möglichkeit, jedem Benutzer das Ausführen von Programmen in einem bestimmten Netzwerk-Namespace zu ermöglichen


9

Ich habe ein Mobilfunkmodem an meinen Server angeschlossen, mit dem ich Benachrichtigungs-E-Mails versenden möchte, wenn das Festnetz ausfällt.

Um den normalen Netzwerkzugriff und diesen außergewöhnlichen Mobilfunkmodemzugriff gut zu trennen, habe ich einen Netzwerk-Namespace erstellt und das Netzwerkgerät dort als einziges Gerät erstellt. Um ein Programm zu haben, benutze ich einfach das Zellenmodem ip netns exec.

Die Falte ist, dass ich jedem Benutzer erlauben möchte, jedes gewünschte Programm im Namespace auszuführen, aber netns execroot benötigt. Meine Lösung lautet wie folgt:

/ usr / local / sbin / _oob_shim:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

/ etc / sudoers:

ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim

Ich denke, die einzige Möglichkeit, den Shim auszuführen, ohne bereits root zu sein oder das root-Passwort zu kennen, ist über sudo, und ich kann darauf vertrauen, dass sudo $ SUDO_UID und $ SUDO_GID auf die richtigen Werte setzt.

Öffne ich mich einem erheblichen Risiko? Oder sollte ich sagen, dass mir offensichtliche Einschränkungen fehlen?

Antworten:


6

Der einzige Fehler, den ich bei Ihrem Code sehe, ist, dass Sie den Befehl des Benutzers unnötig sh -causführen, wenn Sie ihn nur direkt ausführen sollten. Wenn Sie es durchlaufen, erhalten sh -cSie nichts, aber es zerstört das Zitat, das der Benutzer ursprünglich in den Befehl eingegeben hat. Versuchen Sie zum Beispiel Folgendes:

sudo /usr/local/sbin/_oob_shim ls -l "a b"

sollte eine Datei a bauflisten, die im Kontext des Namespace aufgerufen wird, stattdessen werden zwei Dateien mit dem Namen aund aufgelistet b.

sudo /usr/local/sbin/_oob_shim ls -l "*"

Sollte eine Datei mit dem Namen *(Literal Asterisk) aufgelistet werden, schlägt dies aus demselben Grund fehl.

Also sollte es stattdessen so aussehen:

#!/bin/sh
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

Erleichtert das Booten des Skripts!

Ein weiterer Punkt, den ich ansprechen kann, ist, dass, obwohl in diesem Fall der Fehler nur ein Funktionsfehler und kein Sicherheitsfehler war, man immer misstrauisch ist, wenn man sicherheitsrelevanten Code überprüft und feststellt, dass er Dinge durch Shells führt, da dies fast immer ein Problem ist.

Schließlich werden die zusätzlichen Gruppen des Benutzers nicht in den Namespace weitergegeben (sie erhalten nur ihre UID und Haupt-GID), aber das scheint kein großes Problem und keine Behebung zu sein, die nicht trivial ist.

Davon abgesehen sieht es für mich gut aus.


1
Die Verwendung der Shell hat mir nichts gebracht, sie verhindert, dass sudo /usr/local/sbin/_oob_shim -u root cat /etc/shadowes sich um ein Loch in Ihrer vorgeschlagenen Version handelt. Sie haben völlig Recht mit dem Zitat, ich werde damit beginnen sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"und weiter nach Sicherheitslücken suchen.
Michael Shick

Sie haben so Recht damit, dass der Benutzer Optionen mit meiner Version überschreiben kann. Das habe ich total vermisst. Ihre Lösung zu verwenden, --wenn natürlich richtig. Ich bearbeite das besser in meiner Antwort!
Celada
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.