如何管理 Linux 文件功能
在此页
- 共同能力
- 所需工具
- libcap
- 安装
- 用法
- 安装
- 用法
传统上,Linux 进程要么具有特权(以 root 身份运行)要么没有特权。特权进程不受内核权限检查,因此对系统拥有全部权力。能力是一种独特且独立的特权,进程可以使用它来绕过某些权限检查。能力在 Linux 2.2 中首次引入,并在以后的版本中添加了更多能力。它们通常设置在可执行文件上,并在执行具有功能的文件时自动授予进程。功能实质上将 root 用户的权力划分为不同的特权,这通过限制攻击者通过利用或滥用服务获得的访问权限来提高安全性。
本指南将介绍一些常用的功能,并演示如何查看和修改它们。
通用能力
Linux 内核实现了多种功能。他们之中有一些是:
- CAP_SYS_ADMIN:允许范围广泛的操作。应避免使用此功能以支持更具体的功能。
- CAP_CHOWN:更改文件的用户 ID 和组 ID
- CAP_DAC_READ_SEARCH:绕过文件读取和目录读取/执行检查。具有此功能的程序可用于读取系统上的任何文件。
- CAP_DAC_OVERRIDE:覆盖 DAC(自主访问控制),即绕过读/写/执行权限检查。此功能授予可执行文件访问和修改文件系统上任何文件的能力。
- CAP_NET_BIND_SERVICE:允许绑定到低于 1024 的端口号。
- CAP_KILL:绕过向 SIGHUP 和 SIGKILL 等进程发送信号的权限检查。
- CAP_SYS_NICE:修改进程的 niceness 值和调度优先级等。
- CAP_SYS_RESOURCE:允许覆盖对系统资源的各种限制,例如磁盘配额、CPU 时间限制等。
完整列表可在 capabilities(7) 手册页中找到。
可以在 3 个不同的集合中为文件分配权限:允许的、可继承的和有效的。线程有 2 个附加集:环境和边界。每个集合可以包含零个或多个功能,文件的有效集合除外,它实际上是一个位。这些集合定义了超出本指南范围的复杂内核行为。在为文件分配能力时,我们在大多数情况下会使用允许和有效的集合。
注意:SELinux 会干扰功能。在 SELinux 处于强制模式的系统上,它可能会阻止进程利用其功能。
所需工具
存在两个不同的功能管理包:libcap 和 libcap-ng。后者的设计比前者更容易。两者都包含在本指南中。
libcap 提供用于查看和设置文件功能的 getcap 和 setcap,而 libcap-ng 将这两个功能整合到一个工具 filecap 中。
libcap
安装
在 Debian、Ubuntu 和其他基于 Debian 的发行版上,libcap 实用程序可以安装:
apt update apt install libcap2-bin
要在 CentOS 上安装,请使用以下命令:
yum install libcap
要在 Fedora 上安装,请使用以下命令:
dnf install libcap
要在 Arch 上安装,请使用以下命令:
pacman -Sy libcap
用法
getcap 仅显示分配给文件的功能(如果有)。使用以下语法:
getcap /path/to/binary
例如:
Getcap 还可以使用 -r 标志递归搜索。例如:
注意:2>/dev/null 用于避免因“不支持的操作”错误而使输出混乱,这种情况在 getcap 尝试获取 /sys、/proc 等中文件的功能时发生。这些特殊的虚拟文件系统确实不支持功能。
要使用 setcap 设置文件功能,请使用以下语法:
setcap CAP+set filename
例如,要将 CAP_CHOWN 和 CAP_DAC_OVERRIDE 添加到允许集和有效集,请使用:
setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1
要从文件中删除功能,请使用 -r 标志:
setcap -r filename
下面是一些额外的例子:
libcap-ng
安装
在 Debian、Ubuntu 和其他基于 Debian 的发行版上安装:
apt update apt install libcap-ng-utils
在 CentOS 上安装:
yum install libcap-ng-utils
在 Fedora 上安装:
dnf install libcap-ng-utils
在 Arch 上安装:
pacman -Sy libcap-ng
用法
- filecap 程序引用没有“CAP_”前缀的功能(例如,NET_ADMIN 而不是 CAP_NET_ADMIN)。
- filecap 不适用于相对路径,它在将文件或目录作为参数传递时需要完整路径。
- filecap 不允许您指定能力集,它在设置能力时总是使用允许和有效。
查看分配给文件的能力:
filecap /full/path/to/file
要递归搜索目录,请使用:
filecap /full/path/to/dir
要使用 filecap 搜索整个文件系统,请使用以下命令之一:
filecap / filecap -a
以下是使用 filecap 检查文件和目录的几个示例:
要在文件上设置功能,请使用以下语法:
filecap /full/path/to/file cap_name
例如:
filecap /usr/bin/tac dac_override
要删除功能,请使用以下语法:
filecap /full/path/to/file none
以下是使用 filecap 设置和删除功能的几个示例:
结论
Capabilities 是一个强大的内核特性,具有广泛的安全应用。只要有可能,它们就应该被替换为完全权限和根 SUID。