无法在Shell脚本上设置UID


14

谁能帮我找出这里的事吗?我有一些规则来设置跟踪数据包计数。当我以root身份运行以下脚本时:

#!/bin/bash
iptables -t mangle -xnvL

我得到了我期望的输出:

//snip
233203 199929802 MARK  //blah blah blah
//snip

但是,我想将其作为cacti的一部分来运行,该仙人掌以apache的身份运行。现在apache无法运行iptables,这就是为什么我有脚本。我将其设置为SUID root

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

但是然后我得到以下输出:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

显然,我的内核很好,而且我以非root用户身份运行它的事实使事情有些混乱,但我不明白为什么。我用[演示](http://en.wikipedia.org/wiki/Setuid#Demonstration)仔细检查了SUID,并确认它正在工作。

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

我的最终目标是在以apache的身份运行时获取iptables -t mangle -xnvL的输出,因此我可以使用cacti对其进行漂亮的绘制。

Answers:


16

您不能将SUID根目录用于shell脚本。只有真实程序才能成为SUID根目录,shell脚本以“#!”开头。并且解释器将必须运行SUID,由于某种我不知道的原因而无法运行

看看sudo并安装它!编辑/ etc / sudoerrs,添加如下一行:

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

然后就跑

sudo /usr/local/sbin/iptables_packet_report.sh

从您的代码。

然后,它不应该要求输入密码,而是自动评估该过程。

我非常确定,如果您手动输入到www-data并手动运行它,您的错误消息也会发生


13

正如克里斯蒂安(Christian)指出的那样,我的问题是我试图在shell脚本上进行SUID。 如此处所述,在 shell脚本上设置SUID是一个非常糟糕的主意:

在UNIX下执行Shell脚本涉及两个步骤:内核确定要运行的Shell脚本时,它首先启动Shell解释器的SUID副本,然后Shell解释器开始执行Shell脚本。由于这两个操作是分两个步骤执行的,因此您可以在第一步之后中断内核并切换将要执行的Shell解释器的文件。以这种方式,攻击者可以使计算机执行他或她选择的任何shell脚本。

因此,许多现代linux发行版都忽略了SUID shell脚本,包括我正在使用的gentoo。我能够编辑sudoers文件并使它工作。


很棒的答案!
戴夫·切尼

有谁知道这对于Solaris 10是否适用?
埃里克·约翰逊

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.