Raspberry pi 特权分离集gid程序

Raspberry pi 特权分离集gid程序,raspberry-pi,fork,posix,message-queue,daemon,Raspberry Pi,Fork,Posix,Message Queue,Daemon,说到我的观点,我需要解释一下上下文: 我有一个守护进程,可以打开posix mq进行通信。客户端与守护进程位于同一组中,以便与之通信。客户端还打开posix mq并订阅守护进程。为了能够通信,客户机mq必须具有守护进程可以应答的相同组 到目前为止还不错,我设置了客户机set gid(chmod g+s client)。在基于Qt的桌面(LXQT)上,客户端按预期启动和工作。在基于gtk+的桌面(raspberry pi上的名称LXDE)上,它无法启动,因为gtk+阻止一组uid/gid程序使用它

说到我的观点,我需要解释一下上下文:

我有一个守护进程,可以打开posix mq进行通信。客户端与守护进程位于同一组中,以便与之通信。客户端还打开posix mq并订阅守护进程。为了能够通信,客户机mq必须具有守护进程可以应答的相同组

到目前为止还不错,我设置了客户机set gid(chmod g+s client)。在基于Qt的桌面(LXQT)上,客户端按预期启动和工作。在基于gtk+的桌面(raspberry pi上的名称LXDE)上,它无法启动,因为gtk+阻止一组uid/gid程序使用它的库

因此,我将
mq_open()
的创建提取到一个设置为gid(chmod g+s)的外部可执行文件中,并将
setegid()
用于保存的集gid。 客户端创建一个
socketpair()
fork()
execve()
,并通过socketpair(AF\u UNIX/SOCK\u流)将fd发送到客户端

我需要满足的要求:

  • mq必须可从mqclients组的所有成员读取
  • mq上的权限必须为0660
  • 避免在客户端上设置gid(chmod g+s)
  • 尽可能降低chmod g+s的安全影响
  • 现在我的观点/问题:

  • 我希望避免在客户机和守护程序中为mq opener处理
    SIGCHLD
    kill()
    wait()
    。我只想对socketpair()执行
    readmsg()
    ,如果mq opener因任何原因死亡,则会得到一个错误。只是不为SIGCHLD写信号处理程序

  • fork()
    过程和与mq opener的连接相当大。有没有更简单的方法

  • mq opener(以非特权用户启动)是否可以执行double
    fork()
    并断开与父级的父/子连接?父/子关系在什么时候终止

  • 创建一个只处理mq的创建的mq opener守护程序会更好吗

  • 更清楚一点:这里是一个图表:

     +-----------+                           +------------+
     |Daemon     |                           |Client      |
     +-----------+                           +------------+
     |File       |                           |File        |
     |User       |                           |User        |
     |mqdaemon   |                           |pi          |
     |           |                           |            |
     |Group      |                           |Group       |
     |mqdaemon   |                           |pi          |
     |           |                           |            |
     |Rights     |      +------------+       |Rights      |
     |a-s        |      |mq-opener   |       |a-s         |
     +-----------+      +------------+       +------------+
     |Process    |      |File        |       |Process     |
     |User       |      |User        |       |User        |
     |mqdaemon   |      |mq-opener   |       |pi          |
     |           |      |            |       |            |
     |Group      |      |Group       |       |Group       |
     |mqclients  |      |mqclients   |       |pi          |
     +----+------+      |            |       +--+---------+
       ^  |             |Rights      |          |  ^
       |  |             |g+s         |          |  |
       |  |             |            |          |  |
       |  |             +------------+          |  |
       |  |  fork()     |Process     |  fork()  |  |
       |  +------------>|User        |<---------+  |
       |                |(forked)    |             |
       |     send_fd()  |            |  send_fd()  |
       +---------------+|Group       |+------------+
                        |mqclients   |
                        +------------+
    
    +------------++------------+
    |守护程序| |客户端|
    +-----------+                           +------------+
    |文件| |文件|
    |用户| |用户|
    |mqdaemon | | pi|
    |           |                           |            |
    |组| |组|
    |mqdaemon | | pi|
    |           |                           |            |
    |权利|+-------------+|权利|
    |a-s | | mq开启器| | a-s|
    +-----------+      +------------+       +------------+
    |进程| |文件| |进程|
    |用户| |用户| |用户|
    |mqdaemon | | mq opener | | pi|
    |           |      |            |       |            |
    |组| |组| |组|
    |mqclients | | mqclients | pi|
    +----+------+      |            |       +--+---------+
    ^| |权利| |^
    || | g+s | ||
    |  |             |            |          |  |
    |  |             +------------+          |  |
    || fork()| Process | fork()||
    |+------------->|用户|