如何将CAP_SYS_NICE特权设置给Linux用户?

24

我的程序正在使用Linux系统调用setpriority()来改变它创建的线程的优先级。它需要设置负优先级(-10),但是如文档中所述,在以普通用户身份运行时会失败。

用户需要CAP_SYS_NICE权限才能按照自己的意愿设置优先级,但我不知道如何将这样的权限授予给用户。

因此,我的问题是:如何将CAP_SYS_NICE权限设置给Linux用户?


很好-10是更高的优先级,但绝对不是实时的。 - Jan Hudec
这只是一个指针,所以我添加了一条注释:请查看此答案:https://dev59.com/e3I-5IYBdhLWcg3wO1vl#17685265 - tzot
5个回答

20

有一个方便实用的工具可以为二进制文件设置能力:setcap。它需要在应用程序二进制文件上以 root 权限运行,但一旦设置完成后,就可以在普通用户权限下运行。例如:

$ sudo setcap 'cap_sys_nice=eip' <application>

您可以使用 getcap 命令确认应用程序的能力:

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

我建议在安装行中将能力集成到您的makefile中,该行通常以root身份运行。请注意,能力不能存储在TAR文件或任何衍生包格式中。如果您稍后要打包应用程序,则需要一个脚本(Debian软件包的postinst)来在部署时应用此功能。


2
你的命令可以运行,但我想问一下你在哪里找到了 cap_sys_nice=eip 这个参数,特别是 =eip 部分?我在 man setcapman capabilities 中都没有看到这个。 - elmicha
5
至少在我的系统上,man setcap页面包含以下内容: _这些能力以cap_from_text(3)中描述的形式指定_。请注意,即使您已经安装了setcap,cap_from_text手册页可能默认情况下也不可用。例如,在CentOS上,它可以在libcap-devel软件包中使用。它将额外的字母描述为“操作符标志”,其中e =有效(effective),i =可以继承(inheritable),p =允许(permitted)。 - Ryan Armstrong
eip 代表什么?我可以用它来运行脚本吗? - vbt
1
你可以在脚本上理论上应用功能,但我不知道会产生什么影响。如果你需要一个缺失的功能,可以尝试一下。 - Ryan Armstrong

4
Jan Hudec说一个进程不能自己获得一个能力,而setuid包装器是获取能力的明显方法。此外,请记住在降权时需要使用prctl(PR_SET_KEEPCAPS,...)。否则,当您转换为非根实际用户ID时,您将丢失该功能。(有关详细信息,请参见prctl手册页。)如果您真的只想使用不同的允许美好水平启动用户会话,则可以查看pam_limits和limits.conf手册页,因为pam_limits模块允许您更改硬美好限制。它可能是这样一行:
yourspecialusername hard nice -10

4
我知道这个答案古老得不能再古老了,但是有一个pam_cap.so模块,它将读取/etc/security/capability.conf文件并相应地设置能力。 - Bratchley

0
据我所知,无法获取能力。根进程拥有所有能力并可以放弃它们,但一旦放弃,就无法重新获得。因此,您需要一个suid-root包装器,它将放弃所有其他能力并运行该进程。

0
如果你通过sudo拥有root访问权限, 你可以使用setpriv来为命令添加任何你想要的能力。 不过,使用它真的很麻烦,所以我为此编写了一个脚本。
#!/bin/bash

uid="$(id -u)"
gid="$(id -g)"

sudo --preserve-env \
    setpriv --reuid="$uid" --regid="$gid" --init-groups \
    --inh-caps +sys_nice --ambient-caps +sys_nice \
    "$@"

将此保存为/usr/local/bin/chyort并对其进行chmod +x
要使用该脚本,请在需要实时权限的命令前加上chyort前缀。
$ chyort jackd -d alsa -r 44100 -p 256

(这个名字是受到“chrt”和чёрт的启发。)

-1
关于sudo,我是这样添加用户的:

niceuser ALL=NOPASSWD:/usr/bin/nice

然后它正常工作了:

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

3
不要这样做。它会以root用户身份运行命令,这不是您通常想要的,也不是原始问题所寻求的。 - Gregor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接