允许任何用户在特定网络命名空间中运行程序的安全方法

Modified on: Sat, 30 Jun 2018 07:00:00 +0800

我有一个连接到我的服务器的单元调制解调器,我想用它作为在固定电话线路死亡时收到通知电子邮件的方法。

为了很好地分离正常的网络访问和这种特殊的单元调制解调器访问,我创建了一个网络命名空间,并在那里创建了网络设备作为唯一的设备。要让程序使用单元调制解调器,我只需使用ip netns exec

我想让任何用户在命名空间中运行他们想要的任何程序,但netns exec需要root。我的解决方案如下:

的/ usr / local / sbin中/ _oob_shim:

#!/bin/sh cmd_line="$@" /bin/ip netns exec oob \ /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

的/ etc / sudoers的:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

我认为在没有root的情况下运行填充程序或知道root密码是通过sudo的唯一方法,我可以信任sudo将$ SUDO_UID和$ SUDO_GID设置为正确的值。

我是否面临重大风险?或者,我应该说我错过了任何明显的警告吗?

最佳答案

我在代码中看到的唯一错误是,当您直接运行时,您通过sh -c不必要地运行用户命令。通过sh -c运行它只会给你带来什么,但它会破坏用户最初输入命令的引用。例如,试试这个:

sudo /usr/local/sbin/_oob_shim ls -l "a b"

应该在命名空间的上下文中列出一个名为a b的文件,而是列出两个名为ab的文件。

sudo /usr/local/sbin/_oob_shim ls -l "*"

应该列出一个名为*(文字星号)的文件,出于同样的原因失败。

所以它看起来应该是这样的:

#!/bin/sh /bin/ip netns exec oob \ /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

使脚本更容易启动!

我可以做的另一点是,尽管在这种情况下,错误只是一个功能错误,而不是安全漏洞,但在审核安全敏感代码并发现它通过shell运行时,总是会产生怀疑,因为这几乎总是问题

最后,用户的补充组不会传播到命名空间(他们只获得他们的uid和主gid),但这似乎不是一个大问题,修复并不是一件容易的事。

除此之外,它对我来说很好。

作者:,Celada

相关问答

添加新评论