我想更新我的hosts文件,并从Web界面(php / apache2)重新启动dnsmasq 。 我试着玩耍(示威) 。 我有一个EC2实例上运行的apache和dnsmasq 。
我知道Linux忽略文本脚本上的setuid位,但对二进制文件起作用。 (我有什么问题吗?) 我加了exec("whoami"); 到维基百科的例子C程序。 虽然C程序的有效UID是0,但是whoami不返回root 🙁
我完全想避免
或者将apache添加到没有密码的sudoers中! 有出路吗? webmin如何做这样的事情?
我会采取另一种方法,configuration一个以root身份运行的incron脚本,它监视某个文件的更改,并通过将更改应用到/ 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文件
我倾向于通过允许运行服务器的进程(在本例中为web服务器)执行相关的命令来解决这个问题,并且只通过无密码的sudo执行该命令。
例如,这里是我的sudoers条目,允许名为NAGIOS的用户(运行我的本地监视服务器的用户)执行插件,检查RAID硬件为root:
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改变passwd文件的模式,或者在端口22222上启动一个允许所有的sshd ,什么恶毒,那么你有一个问题。 但在这种情况下,你有一个问题,但是你运行服务命令作为根 ,无论是通过sudo或任何其他机制。 sudo尽最大努力净化环境,服务命令是大多数GNU / Linux的一个库存部分(已经有一段时间了),因此可能没有明显的漏洞。
通过无密码的sudo运行service命令不会比其他任何运行方式安全,并且可能比许多家庭酿造或其他不太经过testing的方法更安全。