如何找出进程运行所需的 linux 功能?

How to find out what linux capabilities a process requires to work?

我处在一个困难的境地,我不知道一个进程需要什么 linux 能力才能工作。 找出所需上限的最佳方法或任何方法是什么?

我现在唯一能想到的就是使用 capsh 并删除进程的所有大写字母。然后该过程失败,我开始添加上限(通过删除 --drop=CAP_XZY)直到它起作用。

有更好的建议吗?

事实证明这比预期的要容易。安装 libcap-ng (https://people.redhat.com/sgrubb/libcap-ng/) 并使用 pscap.

在Ubuntu 16.04中,可以安装:

sudo apt-get install libcap-ng-utils

示例输出摘录:

ppid  pid   name        command           capabilities
1     468   root        systemd-journal   chown, dac_override, dac_read_search, fowner, setgid, setuid, sys_ptrace, sys_admin, audit_control, mac_override, syslog, audit_read
1     480   root        lvmetad           full
1     492   root        systemd-udevd     full
1     1040  root        rpc.idmapd        full
1     1062  root        rpc.gssd          full
1     1184  messagebus  dbus-daemon       audit_write +
1     1209  root        NetworkManager    dac_override, kill, setgid, setuid, net_bind_service, net_admin, net_raw, sys_module, sys_chroot, audit_write

另一种方法,我不久前在这个 blog post by Brendan Gregg 中遇到过,是使用功能跟踪器 - capable.

下面是示例输出:

$ sudo /usr/share/bcc/tools/capable
TIME      UID    PID    COMM             CAP  NAME                 AUDIT
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:54  0      2467   capable          21   CAP_SYS_ADMIN        1
11:31:59  1000   2468   ls               1    CAP_DAC_OVERRIDE     1
11:31:59  1000   2468   ls               2    CAP_DAC_READ_SEARCH  1
11:32:02  0      1421   timesync         25   CAP_SYS_TIME         1
11:32:05  1000   2469   sudo             7    CAP_SETUID           1
11:32:05  0      2469   sudo             6    CAP_SETGID           1

它在记录内核为给定进程所做的能力检查方面具有显着优势。这允许根据应用程序实际需要的功能来分析应用程序,例如缩小权限并以非特权用户身份执行。

虽然 pscap 允许列出所有 运行ning 进程的 effective 功能,但它没有提供可靠的方法检查流程实际上需要哪些功能,因为:

  • 进程可能在其允许集中具有 X 能力,并且只能在短时间内将其提升到有效集以执行特权操作。
  • 一个进程可以从更广泛的功能集开始,进行需要提升权限的初始化,并删除一些(或全部)功能(例如 )。
  • 它仅适用于已经 运行 以基于功能的方式运行的进程。如果您必须确定新开发的应用程序所需的最小功能集怎么办?
  • 它不允许将针对应用程序进行的权限检查与其执行的操作相关联,能够您可以获得每次检查的时间戳。

capable 的来源可在 github. Installation instructions for BCC (including capable) are available here 上找到。 进一步的描述请参考开头提到的博客 post,同时请注意,capable 需要内核 4.4+,博客 post 中也提供了旧内核的替代方案。

注意:我不是作者,也不以任何方式隶属于工具开发人员。我只是想将它带给更广泛的受众,因为我个人使用它为一个复杂的监控应用程序开发了一个功能配置文件,该应用程序以前需要 运行 的完全根权限,并且发现这个跟踪器提供了巨大的帮助。

基于最近的 libcap2 更新

1:(短选项):getpcaps

描述:

来自here

getpcaps displays the capabilities on the processes indicated by the pid value(s) given on the command line.

示例:

$ getpcaps <PID>
PID: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+i

2:(更长一点的选项):/proc status and capsh

描述:

proc是一个进程信息pseudo-filesystem或者换句话说-一个可以查看所有进程信息的目录。

关于capsh

Linux capability support and use can be explored and constrained with this tool. This tool provides a handy wrapper for certain types of capability testing and environment creation.
It also provides some debugging features useful for summarizing capability state.

示例:

$ cat /proc/<PID>/status | grep Cap

你会得到(在大多数系统上):

CapInh: 00000000a80425fb (Inherited capabilities)
CapPrm: 0000000000000000 (Permitted capabilities)
CapEff: 0000000000000000 (Effective capabilities)
CapBnd: 00000000a80425fb (Bounding set)
CapAmb: 000000000000000  (Ambient capabilities set)

使用 capsh 实用程序将十六进制数字解码为功能名称:

capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

(*) 您可以通过以下方式下载 capshsudo apt-get install git libpcap-dev.