UNIX的自主访问控制的设计是简单而高效的。前面几章讲述了自主访问控制的一部分,基于允许位及作为允许位扩展的访问控制列表(ACL)的访问控制逻辑。其基本思想就是,主体(进程)有若干id,客体(文件、目录、管道、IPC、socket……)有属主id和属组id,此外客体中还存储了允许位或访问控制列表(ACL)。当主体访问客体时,先比较id,根据结果,取出允许位的一部分作为操作许可。但是,有些情况是上述逻辑无法覆盖的,例如设置系统时间,又如重启系统。这就涉及UNIX自主访问控制的另一部分:特权机制。
特权分为两类,一类是无法纳入允许位控制的任务,例如上述设置系统时间和重启系统;还有一类是超越允许位控制,就是在允许位不允许操作的情况下,仍然进行操作。UNIX的特权机制设计得很简单,内核判断一个进程是否具有特权就是看进程凭证中的euid是否为0。euid为0的进程就是拥有特权的进程。特权进程可以执行任何任务,还不受允许位约束。
特权的英文是privilege。能力的英文是capability,是对特权的另一种称呼。在本书中,这两个词同义。
特权机制的设计是简单、高效、巧妙的。如果没有它,为了解决设置系统时间这类任务,势必引入新的客体类型,或者引入一种新的文件类型。第7章讲到的SELinux就引入了一堆奇怪的、难以理解的客体类型。但是凡事都有利弊,特权也是对系统安全的潜在威胁,因为拥有特权的进程可以不受任何限制。(www.xing528.com)
在Linux还处于童年的时候,在众多UNIX类操作系统蓬勃发展的时候,各UNIX厂商就已经考虑如何缩小特权机制对安全的威胁。在20世纪90年代中期,UNIX厂商酝酿了两个标准草案:IEEE 1003.1e和IEEE 1003.2c。其中提到了将特权分割为若干互不相干的小特权,命名为能力(capability)。这样进程就有可能不具有全部特权,而只拥有需要完成任务的几个能力,这也就实现了所谓的最小特权原则。可惜的是这两个草案没有最后称为标准。当年参与讨论的IRIX、Solaris、HP-UX等操作系统也先后淡出。斗转星移,Linux势力渐长,成为UNIX类操作系统的主流。
Linux很早就对能力方案感兴趣,经过几个版本的演进,Linux参考IEEE 1003.1e和IEEE 1003.2c实现了自己的能力机制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。