我想让非 root 用户 ( nicollet
) 能够检测并向 Apache2 启动的进程发送信号(这些进程是 FastCGI 脚本,信号告诉它们清空缓存)。这些进程归 Web 用户 ( www-data
) 所有,我在 Debian 不稳定版上运行。
我找不到任何方法让nicollet
用户看到这些过程。
进程正在运行,和都可以root
看到www-data
:
root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:12 baryton --bot
root 18701 18700 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~#
但是,以我的用户身份运行相同的命令nicollet
不会返回任何内容:
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
我尝试创建一个可执行文件,使用 运行上述查询system()
。它属于www-data
并设置了 setuid 位:
root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update
-rwsr-xr-x 1 www-data www-data 11046 Nov 2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#
然而,我观察到同样的情况:进程通过root
和可见,www-data
但通过 不可见nicollet
:
root@linux-01:~# setuid-update
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:13 baryton --bot
www-data 18712 18711 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
最令人惊讶的是,该grep
进程确实由其运行www-data
(因为它是从 setuid 可执行文件启动的)并且可见,但该baryton
过程却不可见。
这是怎么回事?为什么可以ps
通过www-data
显示这些进程来运行,但ps
通过以 setuid 身份运行的可执行文件却www-data
无法运行,当它由 启动时nicollet
?
答案1
多年来,我们一直可以在内核级别限制普通用户帐户只能查看自己的进程。这种限制可以通过 grsecurity、SELinux 和其他安全框架实现,但发行版通常不默认使用。
我已经有一段时间没有尝试过 Debian 不稳定分支了(一直在运行 Lenny),但也许他们最近在内核配置中打开了那个开关。它会产生与您观察到的完全相同的效果——即使使用 setuid 可执行文件,原始 uid(nicollet)仍然已知,只有 EUID(有效 uid)会发生变化。