Mit welchem ​​Skript können reguläre Benutzer Netzwerknamespaces verwenden?

22

Ich habe eine Architektur mit Netzwerk-Namespaces (Netns). Ich möchte regelmäßigen Benutzern erlauben, einige Operationen in diesen Netzen durchzuführen.

Ich könnte ein Skript schreiben netns-exec.sh, das von diesem Beitrag inspiriert ist und Folgendes sudoenthält:

ip netns exec $1 su $USER -c "$2"

und zu meiner sudoer-Datei hinzufügen:

user ALL=(ALL) /path/to/netns-exec.sh

Aber ich finde es so hässlich, dass ich Albträume haben könnte. Gibt es eine bessere Lösung, um regulären Benutzern die Verwendung von Namespaces zu ermöglichen? Ist es möglich, Benutzer einigen nützlichen Gruppen zuzuordnen? Ich habe danach gesucht, aber nichts gefunden.

Raspbeguy
quelle
1
Warum definieren Sie nicht Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]in Ihrer sudoers-Datei und erstellen dann eine Gruppe, in die Sie Ihre zulässigen Benutzer einfügen, und ordnen Sie diese Gruppe diesem Befehlsalias zu.
Netmonk
2
Es ist der sudoInhalt su, der mich nervt, nicht das Drehbuch selbst. Wie auch immer, ich werde ein Skript schreiben, um das Ding zu verpacken. Es macht 2 Benutzerwechsel, das ist wirklich hässlich, findest du nicht?
Raspbeguy
6
Das sollte dich erschrecken. Der Benutzer könnte $ USER so ändern, dass er root ist.
Stephen
1
Ja, und es macht mir Angst. Aber ich habe später herausgefunden, dass sudoes sich um eine bestimmte Variable handelt $SUDO_USER, die sicherer ist. Aber das ist immer noch hässlich.
Raspbeguy
1
@Elronnd - Kernel ignoriert Setuid auf Skripten
Angelo

Antworten:

1

Lösung 1

Fügen Sie einfach eine Gruppe mit dem Namen "netns" hinzu und fügen Sie alle gewünschten Benutzer hinzu. Geben Sie anschließend root: netns den Besitz und geben Sie der Gruppe Lese- / Ausführungsfunktionen.

Mit anderen Worten:

# New group netns
sudo groupadd --system netns

# Add root to "netns", not sure if needed
sudo usermod -aG netns root

# Do this for every needed user
sudo usermod -aG netns $UserName

# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh

Lösung 2

Diese Lösung ist einfacher, Sie müssen Ihre sudoers-Datei wie in diesem Beispiel gezeigt bearbeiten .

user ALL=(ALL) /bin/ip netns
Taz8du29
quelle
Nun, Lösung 1 ist unmöglich, der Befehl ip netnsgibt einen Fehler zurück, der besagt, dass nur root ihn ausführen kann. Lösung 2 war das, was ich ursprünglich im Sinn hatte, aber meiner Meinung nach nicht zufriedenstellend war.
Raspbeguy
Dies chmod 0633würde write+executeallen Benutzern und der netnsGruppe Berechtigungen erteilen . Ich vermute, Sie wollten das SGID-Bit im Skript setzen, aber wie @Angelo erwähnt: setuidund setgidwird bei Shell-Skripten aus gutem Grund ignoriert .
ckujau
0

Persönlich weiß ich nicht, ob es die Möglichkeit gibt, regulären Benutzern das Ausführen von Befehlen in verschiedenen Netzwerk-Namespaces zu erlauben, aber dieses mit Anmerkungen versehene Shell-Skript könnte Ihren Anforderungen besser entsprechen:

#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline

case "${1}" in
    do)
        shift # remove "do"
        NSNAME="${1}" # remember nsname
        shift # remove nsname to get argument list for su -c
        [ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
        echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
    ;;
    *)
        SCRIPTNAME="${0}" # remember script full path
        exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
    ;;
esac

Installieren Sie es irgendwo in /usr/binund erlauben Sie Ihren Benutzern, es auszuführen.


quelle
Vielen Dank für Ihre Antwort (und entschuldigen Sie, dass Sie dies einige Monate später bemerkt haben). Das Problem bleibt jedoch das gleiche, das heißt, mit sudo.
Raspbeguy