Linux® 多年来都使用能力(capability)的概念,但是最近实现了 POSIX 文件能力。POSIX 文件能力将根用户的权力划分成更小的特权,比如读取文件或跟踪另一个用户拥有的进程。通过为文件分配能力,可以让非特权用户能够用这些指定的特权执行文件。在本文中,了解程序如何使用能力,以及如何改变系统 setuid root 二进制代码来使用文件能力。
一些程序需要以非特权用户的身份执行特权操作。例如,passwd
程序经常对 /etc/passwd
和 /etc/shadow
文件执行写操作。在 UNIX® 系统上,这种控制是通过设置二进制文件上的 setuid 位实现的。这个位告诉系统,在运行这个程序时,无论执行它的用户是谁,都应该把它看作属于拥有这个文件的用户(通常是根用户)。因为用户不能编写 passwd
程序,而且它对允许用户执行的操作有严格限制,所以这个设置常常是安全的。更复杂的程序使用保存的 uid 在根用户和非根用户之间来回切换。
POSIX 能力将根特权划分成更小的特权,所以可以只用根用户特权的一个子集来运行任务。文件能力特性可以给一个程序分配这样的特权,这大大简化了能力的使用。在 Linux 中已经可以使用 POSIX 能力了。与将用户切换为根用户相比,使用能力有几个好处: