Контроль доступа к разделяемой памяти - PullRequest
3 голосов
/ 09 декабря 2010

Полагаю, этот вопрос адресован экспертам по системному программированию Linux / Unix (к сожалению, я пока не такой;)).

Я строю систему, которая работает на Linux / Unix, многоядерной машине, в которой процессы взаимодействуют друг с другом через разделяемую память (важна скорость - минимальные обращения к ядру, насколько это возможно). «Каналы» общей памяти для связи динамически создаются, когда процесс запрашивает связь с другим - у каждого процесса есть поток прослушивания, который получает и «принимает» эти запросы, а затем создает / инициализирует каналы общей памяти. Для процессов a и b создаются два канала (области общей памяти) - один канал используется в качестве «выхода» из a и «ввода» в b и другие наоборот.

Когда каналы связи созданы, обязательно, чтобы процесс a имел R / W доступ к своему соответствующему «выходному» каналу и только R доступ к своему соответствующему «входному» каналу. Другие процессы не должны иметь возможность получать W-доступ к каналам, совместно используемым другими парами процессов (предпочтительно, они не должны даже иметь R-доступ).

Какое решение вы можете предложить?

Я думал о:

  1. определение моих собственных системных вызовов (на данный момент не желательно)
  2. использование прав доступа к файлам, присущих файловой системе, для наложения этих прав доступа

Для второго решения идея состоит в том, чтобы запускать процессы под разными идентификаторами пользователей и использовать динамическое создание групп для каждой пары процессов и соответственно назначать права доступа к файлам для каждого дескриптора общей памяти (R для группы, R / W для процесса записи, - остальным).

Возможно ли второе решение? Есть ли лучшие решения (например, которые включают в себя некоторые системные вызовы, о которых я не знаю)?

Большое спасибо за ваше время и помощь.

1 Ответ

3 голосов
/ 09 декабря 2010

Вы не можете использовать группы для этого, потому что невозможно добавить дополнительные группы к уже запущенному процессу. Тем не менее, пользовательский механизм будет работать нормально.

Запускать каждый процесс под своим собственным uid. Для создания канала общей памяти отправляющая сторона создает объект общей памяти с shm_open(), указав O_RDWR | O_CREAT | O_EXCL и режим 0600. Таким образом, это единственный процесс с открытым, и только его uid разрешено открывать. Затем отправляющая сторона открывает второй файловый дескриптор для того же сегмента разделяемой памяти, на этот раз используя O_RDONLY. Он отправляет этот второй файловый дескриптор только для чтения получающему процессу, используя сообщение SCM_RIGHTS через сокет домена unix. Затем он может закрыть файловый дескриптор только для чтения.

Процесс отправки и получения затем mmap() совместно используемой памяти. Процесс получения имеет доступ только для чтения и не имеет прав для его обновления на чтение и запись. Никакие другие процессы не могут открыть его вообще.

...