Solaris 开发者安全性指南

如何实现权限

每个进程都有四个权限集,用于确定进程是否可以使用特定权限:

允许权限集

允许权限集中必须包含进程可能使用的所有权限。相反,应该从相应程序的允许权限集中排除任何永远不会使用的权限。

启动进程时,该进程将从父进程继承允许权限集。通常,在登录时或进入新的配置文件 shell 时,在初始的允许权限集中包含所有权限。此集中的权限由管理员指定。每个子进程都可以从允许集中删除权限,但不能向允许集中添加其他权限。作为安全预防措施,应该从允许集中删除程序从不使用的那些权限。这样,便可避免程序使用错误分配或继承的权限。

系统将从有效集中自动删除从允许集中删除的权限。

可继承权限集

在登录时或在新的配置文件 shell 中,可继承集包含管理员指定的权限。调用 exec(1) 后,可以将这些可继承权限传递给子进程。进程应该删除任何不必要的权限以防止这些权限传递给子进程。通常,允许集和可继承集是相同的。但是,可以从可继承集删除某个权限,而允许集中仍保留该权限。

限制权限集

使用限制集,开发者可以控制进程可以使用或传递给子进程的权限。子进程和后续进程只能获取限制集中的权限。执行 setuid(0) 函数时,限制集将确定允许应用程序使用的权限。限制集是在执行 exec(1) 时强制实施的。执行 exec(1) 之前,从限制集中删除权限不会影响任何其他集。

有效权限集

进程可实际使用的权限包含在该进程的有效集中。启动程序时,有效集等于允许集。之后,有效集将成为允许集的子集,或等于允许集。

建议将有效集缩小至基本权限集。权限类别中介绍了基本权限集(包含核心权限)。请将程序中不需要的所有权限全部删除。禁用任何基本权限,直到需要该权限为止。例如,使用 file_dac_read 权限可以读取所有文件。程序可以具有多个读取文件的例程。对于适当的读取例程,程序最初会禁用所有权限,然后启用 file_dac_read。这样,开发者可以确保程序不会针对错误的读取例程使用 file_dac_read 权限。此做法称为权限包括权限编码示例中说明了权限包括。