Capabilities (简体中文)

From ArchWiki
翻译状态:本文是 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

参阅