# Capabilities (简体中文)

翻译状态： 本文是英文页面 Capabilities 的翻译，最后翻译时间：2016-05-09，点击这里可以查看翻译后英文页面的改动。

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

## 设置方法

在linux中，能力是通过命名空间security下的extended attributes (`man 7 xattr`)实现。主流linux都支持扩展属性，包括Ext2，Ext3，Ext4，Btrfs，JFS，XFS，和Reiserfs。 下面的例子展示了用`getcap`显示ping命令的能力，然后通过使用`getfattr`显示相同的编码后的数据。

    $ getcap /bin/ping
    /bin/ping = cap_net_raw+ep
    $ getfattr -d -m "^security\\." /bin/ping
    # file: bin/ping
    security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

扩展属性可以通过`cp -a`自动复制, 但是其他的命令需要一个特别的参数,比如: `rsync -X`。

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

## 管理和维护

如果一个包有过度宽松的能力设置将会被认为是一个错误(bug), 所以这种情况应该被报告出来, 而不是在这里指出.等同于root访问权限的能力(CAP_SYS_ADMIN)或者仅仅等同于root访问(CAP_DAC_OVERRIDE)的能力, 因为Arch不支持任何MAC/RBAC系统,所以不当错误(bug).

Warning: 太多能力能让小的特权升级. 查看例子和解释需要看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

## 有用的命令

找到 setuid-root 文件:

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

找到 setgid-root 文件:

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

## 参阅

- Man Page capabilities(7) setcap(8) getcap(8)
- DeveloperWiki:Security#Replacing setuid with capabilities

Category:

- Security (简体中文)