Capabilities (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 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_ADMINCAP_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

参阅