You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用户bar向foo属主守护进程发送SIGUSR1信号的权限及通信方案咨询

问题解答

能否直接发送SIGUSR1信号?

不能。即使bar属于foo组,Linux系统的信号发送权限规则并不考虑组身份匹配。默认情况下,只有以下情况允许发送信号:

  • 发送进程拥有root权限;
  • 发送进程的真实/有效UID与目标进程的真实/保存设置UID一致;
  • 发送的是SIGCONT信号且双方属于同一个会话。

由于bar的UID与守护进程的UID(foo)不匹配,且没有root权限,因此直接执行kill -SIGUSR1 <DAEMON PID>会被拒绝。

现有架构下的通信方案

无需完全重新设计,可通过以下方式解决:

1. 替换sleep为管道阻塞读取

修改守护进程的逻辑,将等待sleep的代码替换为阻塞读取输入命名管道。当bar通过talk_foo脚本向输入管道写入任务数据时,守护进程的读取操作会自动解除阻塞,无需依赖SIGUSR1信号触发处理。这种方式彻底规避了信号权限问题,是最安全可靠的方案。

2. 编写Setuid辅助程序

创建一个由foo用户所有的小型编译程序(避免使用shell脚本,因为Setuid脚本存在安全风险),设置Setuid权限(chmod u+s)。该程序的唯一功能是读取守护进程的PID(例如从/var/run/foo.pid文件)并发送SIGUSR1信号。当bar执行此程序时,程序会以foo用户身份运行,从而拥有发送信号的权限。

确保辅助程序的安全性:

  • 仅允许foo用户修改该程序;
  • 验证读取到的PID确实属于目标守护进程,防止误发信号。

3. 配置Sudo规则

在sudoers文件中添加规则,允许bar无需密码即可执行针对该守护进程的kill命令。例如:

# /etc/sudoers 中的规则
bar ALL=(foo) NOPASSWD: /bin/kill -SIGUSR1 $(cat /var/run/foo.pid)

或者更安全地,创建一个由foo编写的脚本(用于获取PID并发送信号),然后允许bar通过sudo执行该脚本:

bar ALL=(foo) NOPASSWD: /path/to/send_foo_signal.sh

内容的提问来源于stack exchange,提问作者Justin Landis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:52:48