如何找出一个进程需要工作的Linux功能?

时间:2016-02-17 22:27:35

标签: linux debugging linux-kernel linux-capabilities

我处在一个困难的境地,我不知道一个进程需要工作的Linux功能。 什么是最好的方法,或找出所需的上限?

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

有更好的建议吗?

3 个答案:

答案 0 :(得分:6)

事实证明它比预期的要容易。安装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

答案 1 :(得分:4)

1 :(短选项): getpcaps

说明:

来自here

getpcaps显示由 命令行上提供的pid值。

示例:

$ 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是一个进程信息伪文件系统,或者换句话说,是一个目录,您可以在其中查看所有进程的信息。

关于capsh

可以通过以下方式探索和限制Linux功能的支持和使用: 这个工具。该工具为某些类型的 能力测试和环境创建。
它还提供 一些调试功能可用于汇总功能状态。

示例:

$ 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

(*)您可以通过以下网址下载capsh

答案 2 :(得分:0)

我在此blog post by Brendan Gregg中遇到的另一种方法是使用功能跟踪器 - 能力

以下是示例输出:

$ 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 允许列出所有正在运行的进程的有效功能,但它不提供可靠的方法来检查进程实际上需要哪些功能,因为:

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

功能的来源可在github上找到。 BCC的安装说明(包括能力)可用here。 有关进一步说明,请参阅开头提到的博客文章,请注意,功能需要内核4.4+,博客文章中也提供了旧内核的替代方案。

注意:我不是作者,也不是以任何方式与工具开发人员建立联系。我只是想把它带给更广泛的受众,因为我亲自使用它来开发一个复杂的监控应用程序的功能配置文件,以前需要完全root权限才能运行,并且发现这个跟踪器有很大的帮助。