【问题标题】:How to find out what linux capabilities a process requires to work?如何找出一个进程需要哪些 linux 功能才能工作?
【发布时间】:2016-05-29 21:15:02
【问题描述】:

我处于一个困难的境地,我不知道一个进程需要哪些 linux 功能才能工作。 最好的方法是什么,或者有什么方法可以找出所需的上限?

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

有更好的建议吗?

【问题讨论】:

  • 我希望安装程序能够配置所需的功能。
  • 如果您准确解释了该过程的作用...?
  • @Paul 好的,让我们做一个具体的例子:# capsh --drop=cap_net_raw -- -c "ping localhost" ping: icmp open socket: Operation not permitted 在这种情况下,我放弃了 ping 所需的上限,然后执行 ping。当然,它不起作用。鉴于这种情况,我如何找出 ping 需要 cap_net_raw?在某些情况下,流程执行需要特定上限的操作。我怎样才能知道是哪一个?
  • 程序是你写的吗?如果是这样,您应该知道它需要哪些功能。如果不是,那么这是一个系统管理员问题,而不是编程问题。
  • 是的,要是有类似 selinux 的许可模式就好了。

标签: linux debugging linux-kernel linux-capabilities


【解决方案1】:

基于最近的 libcap2 更新

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 和 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

(*) 您可以通过sudo apt-get install git libpcap-dev 下载capsh

【讨论】:

  • 谢谢@RtmY。最近 libcap2 开发的重大更新。顺便说一句,这是 getpcaps 的来源:git.kernel.org/pub/scm/libs/libcap/libcap.git
  • 另见capsh --print
  • 您可能还想查看captree,这可能有助于您了解尝试使用系统功能的进程和线程之间的关系。
【解决方案2】:

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

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

capable 的来源可在github 上找到。 BCC 的安装说明(包括 capable)可在here 获得。 更多描述请参考开头提到的博文,另请注意,capable 需要内核 4.4+,博文中也提供了旧内核的替代方案。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这不适用于 python 进程,有没有办法列出 python 进程需要哪些功能?
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多