Quale script potrebbe consentire agli utenti normali di utilizzare gli spazi dei nomi di rete?


22

Ho un'architettura che usa gli spazi dei nomi di rete (netns). Vorrei consentire agli utenti regolari di eseguire alcune operazioni su questi netns.

Potrei scrivere una sceneggiatura netns-exec.sh, ispirata a questo post , eseguita con sudo, contenente:

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

e aggiungi al mio file sudoer:

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

Ma lo trovo così brutto che potrei avere degli incubi al riguardo. Esiste una soluzione migliore per consentire agli utenti regolari di utilizzare gli spazi dei nomi? È possibile mettere gli utenti in alcuni gruppi utili? L'ho cercato ma non ho trovato nulla.


1
perché non si definisce Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]nel file sudoers e quindi si crea un gruppo in cui si inseriscono gli utenti autorizzati e si associa questo gruppo a questo alias di comando.
Netmonk,

2
È il sudocontenuto a suche mi dà fastidio, non la sceneggiatura stessa. Comunque scriverò una sceneggiatura per avvolgere la cosa. Rende 2 switch utente, è davvero brutto, non credi?
Raspbeguy,

6
Questo dovrebbe spaventarti. L'utente può modificare $ USER in modo che sia root.
Stephen,

1
Sì, e mi fa paura. Ma in seguito ho scoperto che sudoforniva una variabile specifica $SUDO_USER, che è più sicura. Ma è ancora brutto.
Raspbeguy,

1
@Elronnd - il kernel ignora setuid sugli script
Angelo

Risposte:


1

Soluzione 1

Basta aggiungere un gruppo chiamato "netns" aggiungere tutti gli utenti desiderati ad esso. Quindi assegna la proprietà a root: netns e dai al gruppo le capacità di lettura / esecuzione.

In altri termini:

# 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

Soluzione 2

Questa soluzione è più semplice, devi modificare il tuo file sudoers come mostrato in questo esempio .

user ALL=(ALL) /bin/ip netns

Bene, la soluzione 1 è impossibile, il comando ip netnsrestituirà un errore dicendo che solo root può eseguirlo. La soluzione 2 è ciò che inizialmente avevo in mente, ma secondo me non era soddisfacente.
Raspbeguy,

Ciò chmod 0633darebbe write+executeautorizzazioni a tutti gli utenti e al netnsgruppo. Ho il sospetto che tu volessi impostare il bit SGID sullo script, ma come menzionato da @Angelo: setuided setgidè ignorato per gli script della shell, e per una buona ragione .
ckujau,

0

Personalmente non so se esiste la possibilità di consentire agli utenti regolari di eseguire comandi in diversi spazi dei nomi di rete, ma questo script shell con annotazioni potrebbe soddisfare meglio le tue esigenze:

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

Installalo da qualche parte /usr/bine consenti ai tuoi utenti di eseguirlo.


Grazie per la tua risposta (e scusami per averlo notato diversi mesi dopo). Ma il problema rimane lo stesso, vale a dire usando sudo.
Raspbeguy,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.