特权分离设置GID程序

时间:2019-07-01 09:08:03

标签: raspberry-pi fork posix message-queue daemon

要表达我的意思,我需要解释一下上下文:

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

到目前为止,我设置了客户端设置的gid(chmod g + s客户端)。在基于Qt的桌面(LXQT)上,客户端将启动并按预期工作。在基于gtk +的桌面(树莓派上的名称LXDE)上,它无法启动,因为gtk +阻止了一组uid / gid程序使用其库。

结果,我将mq_open()的创建提取到设置了gid(chmod g + s)的外部可执行文件中,并使用setegid()来保存已保存的set gid。 客户端创建一个socketpair()fork()execve(),然后将fd通过套接字对(AF_UNIX / SOCK_STREAM)发送到客户端。

我需要满足的要求:

  1. mq必须从mqclients组的所有成员中均可读取
  2. mq上的权利必须为0660
  3. 避免在客户端上设置gid(chmod g + s)
  4. 使chmod g+s的安全影响尽可能小。

现在我的观点/问题:

  1. 我想避免为客户端和守护程序中的mq-opener处理SIGCHLDkill()wait()。我只想在readmsg()上使用socketpair(),如果mq-opener死于任何原因,都会报错。只是不为SIGCHLD编写信号处理程序?

  2. fork()过程以及与mq-opener的连接非常大。有没有更简单的方法可以做到这一点?

  3. mq-opener(以非特权用户身份启动)可以进行双fork()并将其父/子连接断开吗?父母/子女关系在什么时候消失?

  4. 创建一个只处理mq`s的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   |
                    +------------+

0 个答案:

没有答案