Quel script pourrait permettre aux utilisateurs réguliers d'utiliser des espaces de noms réseau?

22

J'ai une architecture utilisant des espaces de noms réseau (netns). Je voudrais permettre aux utilisateurs réguliers d'effectuer certaines opérations dans ces réseaux.

Je pourrais écrire un script netns-exec.sh, inspiré de ce post , exécuté avec sudo, contenant:

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

et ajouter à mon fichier sudoer:

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

Mais je le trouve si moche que je pourrais totalement faire des cauchemars à ce sujet. Existe-t-il une meilleure solution pour permettre aux utilisateurs réguliers d'utiliser des espaces de noms? Est-il possible de placer les utilisateurs dans certains groupes utiles? J'ai cherché mais je n'ai rien trouvé.

Raspbeguy
la source
1
pourquoi ne pas définir Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]dans votre fichier sudoers puis créer un groupe dans lequel vous placez vos utilisateurs autorisés et associer ce groupe à cet alias de commande.
netmonk
2
C'est le sudocontenant suqui m'ennuie, pas le script lui-même. Quoi qu'il en soit, je vais écrire un script pour envelopper la chose. Ça fait 2 changements d'utilisateur, c'est vraiment moche, tu ne crois pas?
Raspbeguy
6
Cela devrait vous faire peur. L'utilisateur peut modifier $ USER pour qu'il soit root.
Stephen
1
Oui, et ça me fait peur. Mais j'ai compris plus tard que sudofourni une variable spécifique $SUDO_USER, qui est plus sûre. Mais c'est toujours moche.
Raspbeguy
1
@Elronnd - le noyau ignore setuid sur les scripts
Angelo

Réponses:

1

Solution 1

Ajoutez simplement un groupe appelé "netns", ajoutez-y tous les utilisateurs souhaités. Donnez ensuite la propriété à root: netns et donnez des capacités de lecture / exécution au groupe.

En d'autres termes :

# 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

Solution 2

Cette solution est plus simple, vous devez éditer votre fichier sudoers comme indiqué dans cet exemple .

user ALL=(ALL) /bin/ip netns
Taz8du29
la source
Eh bien, la solution 1 est impossible, la commande ip netnsrenverra une erreur indiquant que seul root peut l'exécuter. La solution 2 est ce que j'avais à l'esprit au départ, mais n'était pas satisfaisante à mon avis.
Raspbeguy
Cela chmod 0633donnerait des write+executeautorisations à tous les utilisateurs et au netnsgroupe. Je soupçonne que vous vouliez définir le bit SGID sur le script, mais comme @Angelo l'a mentionné: setuidet setgidest ignoré pour les scripts shell, et pour une bonne raison .
ckujau
0

Personnellement, je ne sais pas s'il est possible d'autoriser des utilisateurs réguliers à exécuter des commandes dans différents espaces de noms de réseau, mais ce script shell annoté peut mieux répondre à vos besoins:

#!/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

Installez-le quelque part /usr/binet laissez vos utilisateurs l'exécuter.


la source
Merci pour votre réponse (et désolé de l'avoir remarqué plusieurs mois après). Mais le problème reste le même, c'est-à-dire en utilisant sudo.
Raspbeguy