Я занимаюсь разработкой демона, запускаемого 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.
Есть идеи?
Я теперь думаю, что это - ошибка, и связанный со способом, которым запускает выскочка, сервисы с "ожидают демона" (т.е. сервисы что ветвление дважды после запуска). Я замечаю, что, если я использую strace на процессе, который использует возможности (7), возможности также проигнорированы. Я подозреваю, что выскочка, для определения PID для ожидания на, прослеживает сервис, указанный с, "ожидают, что демон" достаточно долго получит PID, и это заставляет механизм возможностей ядра перестать работать. Таким образом, ошибка находится в способе, которым возможности взаимодействуют с трассировкой процесса, и то, что выскочка использует трассировку процесса при запуске сервиса с, "ожидает демона" (это - гипотеза).
Как простой тест:
setcap 'cap_net_bind_service+epi' PROGRAM
) (отмечают, что на шаге 3 строго говоря Наследованный набор возможности (i
флаг) не должен быть изменен для этого теста, но это делает для процесса что forks()
, такие как мой демон).
Это поведение необходимо, чтобы избежать, чтобы полномочие использовало, но сделало Новомодное поведение несовместимым с Возможностями.