Capabilities (简体中文) - ArchWiki

Jump to content
翻译状态：本文是 Capabilities 的翻译。上次翻译日期：2021-07-29。如果英文版本有所更改，则您可以帮助同步翻译。

能力(capability) (POSIX 1003.1e, capabilities(7)) 用更小的粒度控制超级管理员权限，可以避免使用 root 权限。软件开发者应该为二进制文件赋予最小权限，而不是使用强大的setuid。很多软件包用了能力，比如 iputils 提供的`ping` 使用了 `CAP_NET_RAW` （能力的一种） ，因此 `ping` 可以被普通用户执行（效果和使用 setuid 相似）,同时减少了`ping`的潜在安全隐患。

## 实现

在 Linux 中，能力通过名空间 security 下的 extended attributes（扩展属性） (xattr(7)) 实现。主流 linux 文件系统都支持 extended attributes ，包括Ext2，Ext3，Ext4，Btrfs，JFS，XFS 和 Reiserfs。

下面的示例使用 `getcap` 显示“ping”的能力（Capabilities），以及通过 `getfattr` 显示编码后的“ping”的能力信息。

    $ getcap /usr/bin/ping

    /usr/bin/ping = cap_net_raw+ep

    $ getfattr -d -m "^security\\." /usr/bin/ping

    # file: usr/bin/ping
    security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

在进行文件复制时，诸如“能力”等文件的扩展属性可以通过 `cp -a` 自动复制, 但是其他的命令可能需要一个特别的参数,例如：`rsync -X`。

在Arch中, 能力可以通过包安装脚本（如 iputils 中的 `iputils.install`）设置。

## 管理和维护

如果一个软件包设置了过度宽松的能力，那应当被视为一个错误（bug）并上报, 而不是在这里列举出来。 同时，因为Arch不支持 MAC/RBAC ，所以设置 `CAP_SYS_ADMIN` 或 `CAP_DAC_OVERRIDE` ，不应当被视为错误（bug）。

警告： 过多的能力会可能会导致权限问题。可以在 Brad Spengler的帖子中查看例子和解释：False Boundaries and Arbitrary Code Execution.

## 其他从capabilities受益的程序

下面程序的软件包内不包含使用 setuid 属性的文件，但是一些命令需要 root 权限才能执行。通过设置一些能力，普通用户就可以使用软件。

### beep

    # setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep

### chvt

    # setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt

### iftop

    # setcap cap_net_raw+ep /usr/bin/iftop

### mii-tool

    # setcap cap_net_admin+ep /usr/bin/mii-tool

### mtr

    # setcap cap_net_raw+ep /usr/bin/mtr-packet

### nethogs

    # setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs

### wavemon

    # setcap cap_net_admin+ep /usr/bin/wavemon

## 实用命令

找到 setuid-root 文件:

    $ find /usr/bin /usr/lib -perm /4000 -user root

找到 setgid-root 文件:

    $ find /usr/bin /usr/lib -perm /2000 -group root

## 为程序临时授予能力

capsh(1)可以以指定的能力运行程序，而不需要修改文件扩展属性。

下面的例子展示了如何为 GDB 赋予 `CAP_SYS_PTRACE` 能力来调试程序：

    $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

netcat 绑定低端口号的例子：

    $ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
    Listening on 0.0.0.0 123

## 参阅

- Man Pages: capabilities(7), setcap(8), getcap(8)
- Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions
- Seccomp BPF (SECure COMPuting with filters)

Category:

- Security (简体中文)