面向开发者的 Oracle® Solaris 11 安全性指南

退出打印视图

更新时间: 2014 年 7 月
 
 

如何实现特权

    每项进程具有 4 组特权,这些特权决定了某项进程是否可以使用某个特定的特权:

  • 允许特权集合

  • 可继承特权集合

  • 有限特权集合

  • 有效特权集合

允许特权集合

进程可能会使用到的所有特权都必须包含在允许特权集合中。相反,从来不会用到的特权应从该程序的允许特权集合中排除。

进程启动后,该进程会从其父进程中集成允许特权集合。通常在登录时或在新的配置文件 shell 中,所有特权都包含在初始的允许特权集合中。该集合中的特权是由管理员指定的。每项子进程都可以从该允许特权集合中删除特权,但是子进程无法向允许特权集合中添加其他特权。作为一个安全事项,您应该将程序从不使用的特权从允许特权集合中删除。这样,可以通过避免使用指定有误的或继承有误的特权来保护程序。

从允许特权集合中删除的特权也会从有效特权集合中自动删除。

可继承特权集合

在登录时或在新的配置文件 shell 中,可继承特权集合包含已由管理员指定的特权。调用 exec(1) 后,这些特权可能会传递到子进程中。进程应删除不必要的特权来避免将这些特权传递到子进程中。允许特权集合通常与可继承特权集合相同。但是,在某些情况下,从可继承特权集合中删除的特权还保留在允许特权集合中。

有限特权集合

通过有限特权集合,开发者可控制某个进程可以使用哪些特权或可将哪些特权传递到子进程。子进程和子孙进程只能从有限特权集合中获取特权。执行 setuid(0) 函数时,有限特权集合负责确定允许应用程序使用的特权。在执行 exec(1) 时,将强制使用限制特权集。只有在执行 exec(1) 后,从有限特权集合中删除特权的操作才会影响其他集合。

有效特权集合

进程实际可以使用的特权位于该进程的有效特权集合中。启动程序时,有效特权集合与允许特权集合是等同的。然后,有效特权集合既不是允许特权集合的子集也不与其等同。

将有效特权集合减少到基本特权是一个好的做法。基本特权集合包含核心特权,Privilege Categories对其进行了说明。将程序不需要的所有特权完全删除。将所有不需要的基本特权切换为禁用,直到程序需要该进程。例如,file_dac_read 特权,可以使所有文件被读取。一个程序可以具备多个读取文件的例程。程序起初将所有特权关闭,然后会打开 file_dac_read 特权执行相应的读取例程。这样,开发者就可以确保程序不会执行 file_dac_read 特权执行错误的读取例程。此做法称为特权包围特权编码示例对特权包围进行了演示。