我有一个名为foo的守护进程.我的init脚本/etc/init.d/foo启动foo守护进程并将其pidfile存储在/var/run/foo.pid中,这似乎是标准位置.因为/etc/init.d/foo必须以root身份运行,所以在/ var / run中创建和删除pidfiles没有问题.
foo守护程序实际上是程序/usr/sbin / foo,它旨在以root用户身份在init脚本中调用,但随后立即将其权限删除给非特权foo用户.但是,我还希望这个/usr/sbin / foo程序在由于严重错误而退出时删除它的pid文件.但由于它已经删除了它的权限,它不再能够从/ var / run目录中删除文件.
我目前的方法是使用seteuid而不是setuid来删除我的权限,然后在退出之前立即重新提升权限,以便我可以从/ var / run中正确删除pidfile.但是,我遇到了很多很多问题,各种库和外部程序在使用不同于eid的euid时会出现问题.
有没有其他方法可以实现这一目标?我想另一种选择是将我的pidfile放在root和foo用户都可写的目录中.但是我们所有的其他pidfiles都在/ var / run中,包括其他以无特权用户身份运行的程序的pidfiles,所以我也想把foo.pid文件放在那里.
除了使用seteuid之外,还有什么方法可以做到这一点吗?
解决方法
不要将PID文件放在/var/run/foo.pid中,将其放在/var/run/foo/foo.pid中,并让用户foo和group foo拥有/ var / run / foo.这样您就可以在退出之前删除pid文件,而不必提高您的权限级别.
但请注意,这是一个糟糕的安全措施,因为允许您的非特权应用程序损坏其文件将打开一个安全漏洞:想象您的应用程序被劫持(毕竟如果没有预期应用程序可以删除权限的点遭到攻击?) – 现在,攻击者更新了pid文件并将sshd的pid号放在那里.现在,当系统范围的脚本(以root身份运行)尝试使用该pid文件停止应用程序时,它们将关闭sshd.这只是一个例子,有更多方法可以滥用您的系统.总而言之,应该在删除权限之前创建pid文件,并且应该由系统范围的脚本执行pid文件的清理. – 德米特里D.赫莱布尼科夫
更好的想法是切换到像systemd或Upstart这样的init系统,它不需要PID文件来管理服务.