Именованный канал для межпроцессного взаимодействия

286
highsciguy

Я хочу использовать именованный канал для связи между сервером-скриптом PHP и сервисом, то есть процессом (скриптом Python), слушающим на другом конце канала. Этот сервис преднамеренно работает от имени непривилегированного пользователя, а также создает канал с некоторой командой Python, эквивалентной mkfifo mypipe. Это дает псевдофайл, mypipeпринадлежащий этому непривилегированному пользователю.

Поскольку PHP-скрипт запускается от имени другого пользователя, он не может немедленно записать в этот канал. Конечно, существуют различные способы решения проблемы. Тем не менее, я хочу избежать возможных ошибок безопасности.

Итак, мой вопрос в том, в какой каталог я должен поместить именованный канал (каталог сервера / var / www), какой владелец и разрешения он должен иметь, и, наконец, как и где я должен проверять (экранировать) контент, отправляемый из PHP -скрипт к сервису.

0

1 ответ на вопрос

1
Eugen Rieck

Здесь много вопросов, на некоторые из которых нет канонического ответа. Поэтому, пожалуйста, прочитайте это как мои 0,02 доллара, а не как "фундаментальную правду".

  • Проверка ввода: я считаю, что необходимо проверять ввод как можно раньше, в вашем случае это будет один раз сразу после запуска скрипта PHP, второй раз сразу после того, как скрипт python получит запрос через FIFO, и третий раз после того, как скрипт PHP получил ответ от FIFO.
  • Формат данных интерфейса (экранирование): Вы можете (и IMHO должен) попытаться использовать проверенную в бою библиотеку, чтобы помочь вам достичь этого: на ум приходит JSON, поскольку и PHP, и Python имеют хорошие библиотеки кодирования / декодирования. В этом случае я бы кодировал данные непосредственно перед записью в FIFO и декодировал их сразу после. Фактически, вы можете рассмотреть пару методов "send_to_interface" / "receive_from_interface" на каждой стороне, которая сочетает в себе кодирование / запись, соответственно. чтение / декодирование в атом. Если вы когда-нибудь захотите использовать другой интерфейсный механизм, вам просто нужно создать новую пару пар, не затрагивая остальную часть кода.
  • Владение и привилегии FIFO: я бы пошел по пути создания группы, состоящей только из пользователя сервиса и пользователя www, а затем сделал бы chgrp servicegroup && chmod 660FIFO. Возможно, вы захотите исследовать использование сокета вместо FIFO - это облегчает ситуацию с привилегиями и подготавливает вас к ситуации, когда служба и веб-сервер не работают на одной машине. В зависимости от того, что делает ваш python-сервис, он также может окупиться, если запустит его в веб-слое и использует cURL на стороне PHP для доступа к нему. Инкапсуляция, предложенная в пуле, облегчает переключение между такими различными механизмами.
Спасибо за идеи. Поскольку я уже использую JSON для передачи, поэтому, если вы знаете, я мог бы использовать справку о том, как выполнить экранирование с использованием библиотек кодирования / декодирования на обоих концах (или я могу считать стандартные библиотеки безопасными). Что касается `chgrp servicegroup`, меня немного беспокоит то, что мне, вероятно, нужно будет либо добавить запись в файл sudoers для пользователя службы, чтобы получить разрешения на изменение группы, либо создать скрипт инициализации для выполнения Команда с привилегиями. highsciguy 6 лет назад 0

Похожие вопросы