Чтобы перейти к моей точке зрения, мне нужно объяснить контекст:
Я получил процесс демона, который открывает 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).
Требования, которые мне необходимы для полного заполнения:
- mq должны быть доступны для чтения всем членам группы mqclients
- Права должны быть 0660 для mq's
- избегать установки gid (chmod g + s) на клиенте
- Держите возможное влияние на безопасность
chmod g+s
как можно меньше.
Теперь моя точка зрения / вопросы:
Я бы хотел избежать SIGCHLD
и kill()
, wait()
для mq-opener в клиенте и демоне.Я просто хотел бы readmsg()
на socketpair () и получить ошибку, если mq-opener умирает по какой-либо причине.Просто напишите никакой обработчик сигнала для SIGCHLD?
Процедура fork()
и соединение с mq-opener довольно велики.Есть ли более простой способ сделать это?
Может ли mq-opener (который запускается как непривилегированный пользователь) выполнить двойной fork()
и сбросить соединение родитель / потомок сродитель?В какой момент прекращаются отношения родитель / потомок?
Было бы лучше создать демон 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 |
+------------+