02-能力基本原理
39.1 能力基本原理
传统的UNIX权限模型将进程分为两类:能通过所有权限检测的有效用户ID为0(超级用户)的进程和其他所有需要根据用户和组ID进行权限检测的进程。
这个模型的粗粒度划分是一个问题。如果需要允许一个进程执行一些只有超级用户才能执行的操作——如修改系统时间——那么就必须要让进程的有效用户 ID 为 0。(如果一个非特权用户需要执行这样的操作,那么通常需要使用set-user-ID-root程序来完成。)但这种做法同时也赋予了进程执行其他操作的权限——如在访问文件时会通过所有的权限检测——从而为程序表现异常(可能是由于未预见的环境或由于恶意用户的有意操作)时引起安全性问题埋下了隐患。第38章列出了处理此类问题的传统方法:删除有效权限(如将有效用户ID改为非零,同时将零保存在saved set-user-ID中)并只在需要的时候临时请求这些权限。
Linux能力模型优化了对这个问题的处理方式,即在内核中执行安全性检测时不再使用单个权限(即有效用户ID为0),超级用户权限被划分成了不同的的单元,这个单元成为能力。每个特权操作与一个特定的能力相关联,进程只有在拥有相应的能力的时候(不管其有效用户ID是什么)才能执行相应的操作。换句话说,本书中所讨论的Linux中的特权进程其实是指拥有相应的能力来执行特定操作的进程。
在大多数时候,Linux能力模型对程序员来讲是不可见的,其原因是当一个对能力一无所知的应用程序的有效用户ID为0时,内核会赋予该进程所有能力。
Linux能力是基于POSIX 1003.1e标准草案(http://wt.tuxomania.net/publications/posix.1e/)实现的。虽然这一项标准化工作在20世纪90年代末完成之前被放弃了,但各种能力实现仍然是根据这个标准草案来实施的。(表39-1列出了POSIX.1e草案中定义的一些能力,但大多数能力是Linux上的扩展。)
一些UNIX实现也提供的能力模型,如Sun’s Solaris 10以及早期的Trusted Solaris发行版、SGI’s Trusted Irix、以及作为FreeBSD一部分的TrustedBSD项目(([Watson, 2000])。其他一些操作系统中也存在类似的模型,如Digital’s VMS系统中的特权机制。