Как установить CAP SYS NICE возможность для пользователя Linux?

моя программа использует системный вызов Linux setpriority() чтобы изменить приоритеты потоков, которые он создает. Он должен установить отрицательные приоритеты (-10), но, как упоминалось в документации, это не удается при запуске как обычный пользователь.

пользователь должен CAP_SYS_NICE возможность устанавливать приоритеты, как он хочет, но я понятия не имею, как дать такую возможность пользователю.

Итак, мой вопрос: Как настроить CAP_SYS_NICE возможность для пользователя Linux?

4 ответов


Ян Худек прав, что процесс не может просто дать себе возможность, а оболочка setuid-это очевидный способ получить возможность. Кроме того, имейте в виду, что вам понадобится prctl(PR_SET_KEEPCAPS, ...) когда вы отбрасываете root. (См. prctl страница для деталей.) В противном случае вы отбросите возможность при переходе к вашему не-root реальному идентификатору пользователя.

если вы действительно просто хотите запустить пользовательские сеансы с другим разрешенным хорошим уровнем, вы можете увидеть pam_limits и limits.conf man страницы, как the pam_limits модуль позволяет изменить жесткий хороший предел. Это может быть строка типа:

yourspecialusername hard nice -10

есть хорошая удобная утилита для настройки функции на двоичном виде: setcap. Это нужно запустить как root в двоичном файле приложения, но после установки можно запустить как обычный пользователь. Пример:

$ sudo setcap 'cap_sys_nice=eip' <application>

вы можете подтвердить, какие возможности есть в приложении, используя getcap:

$ getcap <application>
<application> = cap_sys_nice+eip

Я бы предложил интегрировать возможности в ваш makefile в строке установки,которая обычно запускается как root. Обратите внимание, что возможности не могут быть сохранены в файл TAR или любые производные форматы пакетов. Если вы позже упакуете свое приложение, вам понадобится скрипт (postinst для пакетов Debian), чтобы применить эту возможность при развертывании.


AFAIK невозможно получить возможность. Корневые процессы имеют все возможности и могут отказаться от них, но после отказа они не могут быть восстановлены. Поэтому вам понадобится оболочка suid-root, которая откажется от всех других возможностей и запустит процесс.


Что касается sudo, я добавил пользователя следующим образом:

niceuser ALL=NOPASSWD:/usr/bin/nice

и тогда он работал нормально:

niceuser@localhost $ nice
0
niceuser@localhost $ sudo nice -n -10 nice
-10