Как настроить возможность CAP_SYS_NICE для пользователя Linux? - PullRequest
9 голосов
/ 03 октября 2011

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

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

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

Ответы [ 4 ]

8 голосов
/ 30 мая 2016

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

$ sudo setcap 'cap_sys_nice=eip' <application>

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

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

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

2 голосов
/ 03 октября 2011

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

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

yourspecialusername hard nice -10
1 голос
/ 24 сентября 2015

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

niceuser ALL=NOPASSWD:/usr/bin/nice

И тогда все заработало:

niceuser@localhost $ nice
0
niceuser@localhost $ sudo nice -n -10 nice
-10
0 голосов
/ 03 октября 2011

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

...