从 apache 以 root 身份运行脚本

从 apache 以 root 身份运行脚本

我想更新我的hosts文件并dnsmasq从 Web 界面 (php/apache2) 重新启动。我尝试使用suid bits(演示)。我拥有两者apache,并dnsmasq在 EC2 实例上运行。

我知道 Linux 会忽略文本脚本上的 setuid 位,但可以处理二进制文件。(我是不是搞错了?)我exec("whoami");在 Wikipedia 中的示例 C 程序中添加了以下内容。尽管 C 程序的有效 UID 为 0,但 whoami 并未返回root:-(

我非常想避免

echo 密码 | sudo 服务 dnsmasq 重启

或者将 apache 添加到 sudoers 中而无需密码!有办法吗?webmin 如何做这样的事情?

答案1

我会采取另一种方法并配置因克龙以 root 身份运行的脚本,监视某些文件的更改并通过将您的更改应用于 /etc/hosts 文件来做出响应。

使用 incron 方法,您可以设置 inotify 条目来监视某些文件的更改,并通过运行脚本进行响应;

/var/www/hosts IN_CLOSE_WRITE /run/this/as/root

因此 apache 有权使用 php 或其他方式写入 /var/www/hosts,并且 /run/this/as/root 脚本以 root 身份运行以将更改应用于 /etc/hosts 文件

答案2

我倾向于通过允许运行服务器的进程(在本例中为 Web 服务器)通过无密码 sudo 执行相关命令(且仅执行该命令)来解决这个问题。

例如,这是我的 sudoers 条目,允许名为 NAGIOS 的用户(运行我的本地监控服务器)以 root 身份执行检查 RAID 硬件的插件:

nagios  ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_md_raid

你也许会得到类似的东西:

apache  ALL=(root) NOPASSWD: /sbin/service dnsmasq restart

为了解决您上述的担忧,这不允许任何能够破坏 apache 进程的人运行sudo bashsudo shutdown -h now甚至sudo service dnsmasq stop。它只允许 sudoers 文件中指定的内容。

确实,如果service命令写得很糟糕,并且如果有人能找到方法通过 sudo 以 root 身份运行,service dnsmasq stop从而更改文件的模式passwd,或者在端口 22222 上启动允许所有操作sshd,或者确实做任何邪恶的事情,那么就会有麻烦。 但在这种情况下,无论你如何以 root 身份运行服务命令,你都会遇到问题,无论是通过 sudo 还是其他任何机制。 sudo尽力净化环境,并且服务命令是大多数 GNU/Linux 的库存部分(并且已经存在一段时间了),因此可能没有明显的漏洞。

service通过无密码运行命令sudo并不比任何其他运行方法更安全,并且可能比许多自制或其他未经充分测试的方法更安全。

相关内容