Jaki skrypt może pozwolić zwykłym użytkownikom na korzystanie z sieciowych nazw?


22

Mam architekturę używającą sieciowych nazw (netns). Chciałbym umożliwić zwykłym użytkownikom wykonywanie niektórych operacji w tych sieciach.

Mógłbym napisać skrypt netns-exec.sh, zainspirowany tym postem , wykonany za pomocą sudo, zawierający:

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

i dodaj do mojego pliku sudoer:

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

Ale uważam to za tak brzydkie, że mogłam mieć z tego koszmary. Czy istnieje lepsze rozwiązanie umożliwiające zwykłym użytkownikom korzystanie z przestrzeni nazw? Czy można umieścić użytkowników w kilku przydatnych grupach? Szukałem, ale nic nie znalazłem.


1
dlaczego nie zdefiniujesz Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]w pliku sudoers, a następnie nie utworzysz grupy, w której umieścisz dozwolonych użytkowników, i powiążesz tę grupę z tym aliasem poleceń.
netmonk

2
Drażni mnie to sudozawierające a sunie sam skrypt. W każdym razie napiszę skrypt, żeby to owinąć. To sprawia, że ​​2 przełączniki użytkownika, to naprawdę brzydkie, nie sądzisz?
Raspbeguy

6
To powinno cię wystraszyć. Użytkownik może zmodyfikować $ USER, aby był rootem.
Stephen

1
Tak i to mnie przeraża. Ale później zorientowałem się, że sudodostarczyłem określoną zmienną $SUDO_USER, która jest bezpieczniejsza. Ale to wciąż brzydkie.
Raspbeguy,

1
@Elronnd - jądro ignoruje setuid w skryptach
Angelo

Odpowiedzi:


1

Rozwiązanie 1

Wystarczy dodać grupę o nazwie „netns” i dodać do niej wszystkich poszukiwanych użytkowników. Następnie przekaż własność root: netns i daj grupie możliwości odczytu / wykonania.

Innymi słowy:

# 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

Rozwiązanie 2

To rozwiązanie jest prostsze, musisz edytować plik sudoers, jak pokazano w tym przykładzie .

user ALL=(ALL) /bin/ip netns

Cóż, rozwiązanie 1 jest niemożliwe, polecenie ip netnszwróci błąd informujący, że tylko root może go wykonać. Rozwiązanie 2 początkowo miałem na myśli, ale moim zdaniem nie było satysfakcjonujące.
Raspbeguy

To chmod 0633dałoby write+executeuprawnienia do wszystkich użytkowników i do netnsgrupy. Podejrzewam, że chciałeś ustawić bit SGID w skrypcie, ale jak wspomniałem @Angelo: setuidi setgidjest ignorowany w przypadku skryptów powłoki i nie bez powodu .
ckujau

0

Osobiście nie wiem, czy istnieje możliwość zezwolenia zwykłym użytkownikom na uruchamianie poleceń w różnych sieciowych przestrzeniach nazw, ale ten skrypt powłoki z adnotacjami może lepiej odpowiadać Twoim potrzebom:

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

Zainstaluj go gdzieś /usr/bini pozwól użytkownikom go uruchomić.


Dziękujemy za odpowiedź (i przepraszamy za kilka miesięcy później). Ale problem pozostaje ten sam, to znaczy przy użyciu sudo.
Raspbeguy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.