2

Для уже запущенного процесса требуется привилегированная инструкция, например, с использованием опции сокета SO_RCVBUFFORCE. Этот процесс работает как обычный пользовательский процесс.Предоставить возможности для выполнения процесса

Как предоставить возможность/разрешение на этот процесс? Настройки параметров на основе файлов по-прежнему являются мечтой?

Я попытался /usr/sbin/setpcaps утилиты из пакета libcap и cap_set_proc() апи, но способность CAP_SETPCAP блокируется на системе (старая системы на основе Fedora 4 с 2.6.20 ядра), поэтому он не может предоставить/удалить возможности для другого процесса.

Мысль об установке временного корневого uid для этого процесса, но есть ли способ изменить эффективный UID внешнего, уже запущенного процесса? Функции setuid()/seteuid()/... могут просто изменить текущий процесс (кто вызывает функцию).

ответ

1

Вы не можете. Модель безопасности позади возможностей (скорее, «разрешенный набор возможностей») заключается в том, что они могут быть удалены процессом, никогда не добавлены.

Если вы не можете настроить вещи в своей архитектуре таким образом, чтобы возможности были правильно унаследованы от родителя (ов) процесса, вы можете попробовать выполнить вызов setsocktopt() в отдельном процессе, используя передачу дескриптора файла. То есть, настроен «демон sockopt», работающий на нужном уровне привилегий, подключитесь к нему с новым сокетом, передайте дескриптор файла с помощью sendmsg() и позвольте ему выполнить необходимые вызовы. Это уродливый API, и решение бесполезно сложно. Но может быть предпочтительнее перестроить структуру запуска и инициализации вашего приложения.

+0

Если включен CAP_SETPCAP, возможно добавить новые возможности в процесс с помощью cap_set_proc(). – CsTamas

+0

Я принимаю этот ответ, указав на возможное решение: либо у вас есть демон, либо через сокет, передающий файловый дескриптор (см. Сообщение Kragen Sitaker по адресу http://lists.canonical.org/pipermail/kragen-hacks/2002- Январь/000292.html), или же для каждого запроса запускается утилита (исполняемая с флагом setuid) с fork() + exec(), которая наследует дескриптор сокета – CsTamas