什么脚本可以允许普通用户使用网络名称空间?


22

我有一个使用网络名称空间(netns)的体系结构。我想允许普通用户在这些netns中进行一些操作。

我可以编写一个netns-exec.sh本文启发的脚本,由执行sudo,包含:

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

并添加到我的sudoer文件中:

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

但是我发现它是如此丑陋,我完全可以做噩梦。有没有更好的解决方案,允许普通用户使用名称空间?是否可以将用户分成一些有用的组?我搜索了一下,但一无所获。


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个用户开关,这真的很丑,您不觉得吗?
Raspbeguy 2015年

6
那应该吓到你了。用户可以将$ USER修改为root。
斯蒂芬

1
是的,这确实使我感到恐惧。但是我后来发现sudo提供了一个特定的变量$SUDO_USER,它更安全。但这仍然很丑。
Raspbeguy 2015年

1
@Elronnd-内核忽略脚本中的setuid
Angelo

Answers:


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

好吧,解决方案1是不可能的,该命令ip netns将返回一个错误,指出只有root用户才能执行它。解决方案2是我最初的想法,但我并不满意。
拉什伯吉(Raspbeguy)'17

chmod 0633将向write+execute所有用户和netns组授予权限。我怀疑您想在脚本上设置SGID位,但正如@Angelo所提到的:由于外壳脚本setuidsetgid被忽略,这是有充分理由的
ckujau

0

我个人不知道是否有可能允许普通用户在不同的网络名称空间中运行命令,但是此带注释的shell脚本可能更适合您的需求:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.