![从 apache 以 root 身份运行脚本](https://linux22.com/image/580943/%E4%BB%8E%20apache%20%E4%BB%A5%20root%20%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
我想更新我的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 bash
、sudo shutdown -h now
甚至sudo service dnsmasq stop
。它只允许 sudoers 文件中指定的内容。
确实,如果service
命令写得很糟糕,并且如果有人能找到方法通过 sudo 以 root 身份运行,service dnsmasq stop
从而更改文件的模式passwd
,或者在端口 22222 上启动允许所有操作sshd
,或者确实做任何邪恶的事情,那么就会有麻烦。 但在这种情况下,无论你如何以 root 身份运行服务命令,你都会遇到问题,无论是通过 sudo 还是其他任何机制。 sudo
尽力净化环境,并且服务命令是大多数 GNU/Linux 的库存部分(并且已经存在一段时间了),因此可能没有明显的漏洞。
service
通过无密码运行命令sudo
并不比任何其他运行方法更安全,并且可能比许多自制或其他未经充分测试的方法更安全。