任何人都可以帮我找出这里发生了什么? 我有一些规则设置跟踪数据包计数。 当我以root身份运行以下脚本时:
#!/bin/bash iptables -t mangle -xnvL
我得到我期望的输出:
//snip 233203 199929802 MARK //blah blah blah //snip
不过,我想运行这个作为cacti的一部分,它作为apache运行。 现在Apache不能运行iptables, 这就是为什么我有脚本。 我把它设置为SUID根 :
-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用户正在运行它,但是我不明白为什么。 我做了双重检查SUID与[示范]( http://en.wikipedia.org/wiki/Setuid#Demonstration并确认它正在工作。
server # sudo -u apache ./printid Real UID = 81 Effective UID = 0 Real GID = 81 Effective GID = 0
我的最终目标是获得iptables -t mangle -xnvL的输出,同时以apache的身份运行,所以我可以使用cacti来很好地绘制它。
你不能在shell脚本中使用SUID root。 只有真正的程序可以是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
从你的代码。
它不应该要求密码,而是自动评估过程。
我相当肯定,如果您手动inputwww数据并手动运行,也会发生错误消息
正如Christian所指出的,我的问题是我试图在一个shell脚本上SUID。 如上所述 ,在shell脚本中设置SUID是一个非常糟糕的主意:
在UNIX下执行一个shell脚本涉及两个步骤:当内核确定要运行一个shell脚本时,它首先启动shell解释器的SUID副本,然后shell解释器开始执行shell脚本。 由于这两个操作分两步执行,因此可以在第一步之后中断内核,然后切换shell解释器即将执行的文件。 以这种方式,攻击者可以让计算机执行任何他们select的shell脚本
因此,许多现代Linux发行版忽略SUID shell脚本,包括我使用的gentoo。 我能够编辑sudoers文件并使其工作。
我认为基督徒的解决scheme是最好的,但如果你真的想,你可以使用shc编译脚本,然后在编译的程序上设置root。