如何删除权限并仍然清理 /var/run 中的 pid 文件?

Eli*_*ght 6 linux daemon

我有一个名为foo. 我的 init 脚本/etc/init.d/foo启动foo守护进程并将其 pidfile 存储在 中/var/run/foo.pid,这似乎是标准位置。因为/etc/init.d/foo必须以 root 身份运行,所以在/var/run.

foo守护进程是真正的程序/usr/sbin/foo,其目的是由init脚本以root身份调用,但然后立即放弃其权限的非特权foo用户。但是,我还希望该/usr/sbin/foo程序在由于严重错误退出时删除其 pidfile。但由于它已经放弃了它的权限,它不再具有从/var/run目录中删除文件的能力。

我目前的方法是使用seteuid而不是setuid删除我的权限,然后在退出之前立即重新提升权限,以便我可以从/var/run. 但是,我遇到了许多与各种库和外部程序有关的问题,这些问题在使用与 uid 不同的 euid 调用时会出现问题。

有没有其他方法可以做到这一点?我想另一种选择是将我的 pidfile 放在一个目录中,该目录可由 rootfoo用户和用户写入。但是我们其他所有PID文件都在/var/run,包括其运行作为非特权用户,所以我喜欢把其他程序PID文件foo.pid的文件那里。

除了使用之外还有什么方法可以做到这一点seteuid吗?

jco*_*lie 9

不要把PID文件/var/run/foo.pid放进去,把它放进去/var/run/foo/foo.pid并且已经/var/run/foo归用户foo和组所有foo。这样您就可以在退出之前删除 pid 文件,而不必提高您的权限级别。

但是请注意,这是一种糟糕的安全做法,因为允许您的非特权应用程序对其文件进行破坏会打开一个安全漏洞:想象一下您的应用程序被劫持了(毕竟,如果不期望应用程序可以被攻击?)——现在,攻击者更新 pid 文件并将 sshd 的 pid 号放在那里。现在,当系统范围的脚本(以 root 身份运行)尝试使用该 pid 文件停止您的应用程序时,它们将改为关闭 sshd。这只是一个例子,还有更多方法可以滥用您的系统。总而言之,pid 文件应该删除权限之前创建,pid 文件的清理应该由系统范围的脚本执行。——德米特里·D·赫列布尼科夫

一个更好的主意是切换到不需要 PID 文件来管理服务的 init 系统,如 systemd 或 Upstart。

  • 他们要么不放弃特权,要么不从非特权进程中清除 PID 文件。 (2认同)