Какой сценарий может позволить обычным пользователям использовать сетевые пространства имен?

22

У меня есть архитектура с использованием сетевых пространств имен (NetNS). Я хотел бы позволить обычным пользователям выполнять некоторые операции в этих сетях.

Я мог бы написать сценарий netns-exec.sh, вдохновленный этим постом , с использованием sudo:

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

и добавьте в мой файл sudoer:

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

Но я нахожу это настолько уродливым, что у меня могут быть кошмары об этом. Есть ли лучшее решение, позволяющее обычным пользователям использовать пространства имен? Можно ли поместить пользователей в некоторые полезные группы? Я искал об этом, но ничего не нашел.

Raspbeguy
источник
1
почему вы не определяете Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]в своем файле sudoers, а затем создаете группу, в которую вы помещаете разрешенных пользователей, и связываете эту группу с псевдонимом этой команды.
netmonk
2
Это sudoсодержащее , suчто раздражает меня, а не сам сценарий. Во всяком случае, я напишу сценарий, чтобы обернуть вещь. Это делает 2 пользовательских переключения, это действительно ужасно, не так ли?
Распбегуй
6
Это должно вас напугать. Пользователь может изменить $ USER для получения прав root.
Стивен
1
Да, и это меня пугает. Но позже я понял, что sudoэто определенная переменная $SUDO_USER, которая безопаснее. Но это все еще безобразно.
Распбегуй
1
@Elronnd - ядро ​​игнорирует setuid в сценариях
Angelo

Ответы:

1

Решение 1

Просто добавьте группу «netns» и добавьте в нее всех желаемых пользователей. Затем передайте права владения root: netns и предоставьте группе возможность чтения / исполнения.

Другими словами:

# 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

Решение 2

Это решение проще, вы должны отредактировать файл sudoers, как показано в этом примере .

user ALL=(ALL) /bin/ip netns
Taz8du29
источник
Что ж, решение 1 невозможно, команда ip netnsвернет ошибку, сообщающую, что ее может выполнить только root. Решение 2 - это то, что я изначально имел в виду, но, на мой взгляд, не удовлетворяло меня.
Распбегуй
Это chmod 0633дало бы write+executeразрешения всем пользователям и netnsгруппе. Я подозреваю , что вы хотите установить битый SGID на сценарии, но , как упоминалось @Angelo: setuidи setgidигнорируетесь для сценариев оболочки, и по уважительной причине .
ckujau
0

Лично я не знаю, есть ли возможность разрешать обычным пользователям запускать команды в разных сетевых пространствах имен, но этот аннотированный сценарий оболочки может лучше удовлетворить ваши потребности:

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

Установите его где-нибудь /usr/binи позвольте своим пользователям выполнить его.


источник
Спасибо за ваш ответ (и прошу прощения за то, что заметил через несколько месяцев). Но проблема остается той же, то есть с использованием sudo.
Распбегуй