Gid программа для разделения привилегий - PullRequest
1 голос
/ 01 июля 2019

Чтобы перейти к моей точке зрения, мне нужно объяснить контекст:

Я получил процесс демона, который открывает posix mq для связи.Клиенты находятся в той же группе, что и демон, для связи с ним.Клиенты также открывают posix mq и подписываются на демона.Чтобы иметь возможность общаться, клиентские mq должны иметь ту же группу, на которую демон может ответить им.

Пока все хорошо, я установил gid клиентского набора (клиент chmod g + s).На рабочем столе на основе Qt (LXQT) клиент запускается и работает как положено.На рабочем столе, основанном на gtk + (имя LXDE на raspberry pi), он не запускается, так как gtk + не позволяет программам uid / gid использовать его библиотеку.

В результате я извлек создание mq_open() ввнешний исполняемый файл, для которого задан gid (chmod g + s) и который использует setegid() для сохраненного набора gid.Клиент создает socketpair(), fork(), execve() и отправляет клиенту через fd сокет пары (AF_UNIX / SOCK_STREAM).

Требования, которые мне необходимы для полного заполнения:

  1. mq должны быть доступны для чтения всем членам группы mqclients
  2. Права должны быть 0660 для mq's
  3. избегать установки gid (chmod g + s) на клиенте
  4. Держите возможное влияние на безопасность chmod g+s как можно меньше.

Теперь моя точка зрения / вопросы:

  1. Я бы хотел избежать SIGCHLD и kill(), wait() для mq-opener в клиенте и демоне.Я просто хотел бы readmsg() на socketpair () и получить ошибку, если mq-opener умирает по какой-либо причине.Просто напишите никакой обработчик сигнала для SIGCHLD?

  2. Процедура fork() и соединение с mq-opener довольно велики.Есть ли более простой способ сделать это?

  3. Может ли mq-opener (который запускается как непривилегированный пользователь) выполнить двойной fork() и сбросить соединение родитель / потомок сродитель?В какой момент прекращаются отношения родитель / потомок?

  4. Было бы лучше создать демон mq-opener, который просто обрабатывает создание mq`s?

Чтобы сделать это немного более понятным: вот диаграмма:

 +-----------+                           +------------+
 |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   |
                    +------------+
...