Не могу получить услугу upstart, чтобы соблюдать возможности (7)

Я занимаюсь разработкой демона, запускаемого upstart (Ubuntu 14.04), который должен работать как непривилегированный пользователь (для безопасности), но привязать привилегированный порт 443.

Я использую setcap, чтобы установить возможность CAP_NET_BIND_SERVICE для исполняемого файла (это не скрипт). Я устанавливаю его в Разрешенных, Эффективных и Унаследованных наборах (setcap 'cap_net_bind_service+eip' EXEC).

Я могу su обратиться к непривилегированному пользователю и запустить его напрямую, и он отлично работает. Он правильно связывает порт, и /proc/PID/status показывает соответствующие маски возможностей с установленным битом 0x400.

Но когда я запускаю службу через upstart, она не запускается с возможностями, указанными для двоичного файла, и bind() завершается ошибкой (EPERM). /proc/PID/status показывает, что маски возможностей равны 0.

Есть идеи?

2
задан 5 August 2014 в 01:13

1 ответ

Я теперь думаю, что это - ошибка, и связанный со способом, которым запускает выскочка, сервисы с "ожидают демона" (т.е. сервисы что ветвление дважды после запуска). Я замечаю, что, если я использую strace на процессе, который использует возможности (7), возможности также проигнорированы. Я подозреваю, что выскочка, для определения PID для ожидания на, прослеживает сервис, указанный с, "ожидают, что демон" достаточно долго получит PID, и это заставляет механизм возможностей ядра перестать работать. Таким образом, ошибка находится в способе, которым возможности взаимодействуют с трассировкой процесса, и то, что выскочка использует трассировку процесса при запуске сервиса с, "ожидает демона" (это - гипотеза).

Как простой тест:

  1. Запись маленькая программа C для привязки для портирования 443 (Вы не можете использовать интерпретируемый язык, такой как Python с возможностями (7)).
  2. Выполнение это как некорневое, и видит, что этому не удается связать из-за отсутствия полномочия.
  3. Набор возможность CAP_NET_BIND_SERVICE Вашего ПРОГРАММА (как корень работает setcap 'cap_net_bind_service+epi' PROGRAM)
  4. Выполнение он как некорневой, и видит, что теперь успешно выполняется.
  5. Теперь выполняет его с strace и видят, что это теперь перестало работать.

(отмечают, что на шаге 3 строго говоря Наследованный набор возможности (i флаг) не должен быть изменен для этого теста, но это делает для процесса что forks(), такие как мой демон).

Это поведение необходимо, чтобы избежать, чтобы полномочие использовало, но сделало Новомодное поведение несовместимым с Возможностями.

1
ответ дан 5 August 2014 в 01:13

Другие вопросы по тегам:

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