Solaris 开发者安全性指南

关于权限

权限是授予进程执行 Solaris 操作系统禁止执行的操作的独立权利。大多数程序不使用权限,因为程序通常在系统安全策略界限内运行。

权限是由管理员指定的。权限是根据程序的设计来启用的。登录或进入配置文件 shell 时,管理员的权限指定将应用于任何在 shell 中执行的命令。运行应用程序时,将通过编程方式启用或禁用权限。如果使用 exec(1) 命令启动新程序,则该程序可能会使用父进程的所有可继承权限。但是,该程序不能添加任何新权限。

管理员如何指定权限

系统管理员负责为命令指定权限。有关权限指定的更多信息,请参见《系统管理指南:安全性服务》中的“权限(概述)”

如何实现权限

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

允许权限集

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

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

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

可继承权限集

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

限制权限集

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

有效权限集

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

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

超级用户模型与权限模型之间的兼容性

为了适应传统应用程序,权限的实现使用超级用户模型和权限模型。此适应通过使用 PRIV_AWARE 标志(指示程序使用权限)得以实现。PRIV_AWARE 标志由操作系统自动处理。

请考虑不能识别权限的子进程。此类进程的 PRIV_AWARE 标志为 false。从父进程继承的所有权限均可在允许集和有效集中找到。如果子进程将 UID 设置为 0,则进程的有效集和允许集将仅限于限制集中的那些权限。子进程不会获取全部的超级用户权限。这样,可识别权限进程的限制集会限制不能识别权限的子进程的超级用户权限。如果子进程可以修改任何权限集,则可以将 PRIV_AWARE 标志设置为 true。

权限类别

可以按照以下方式根据权限范围对权限进行逻辑分组:

有关 Solaris 权限的完整列表以及说明,请参见 privileges(5) 手册页。


注 –

Solaris 提供区域功能,通过此功能,管理员可以为运行的应用程序设置隔离环境。请参见 zones(5)。由于一个区域中的进程无法监视或干扰该区域外系统中的其他活动,因此该进程的所有权限也限于该区域。但是,如果需要,可以将 PRIV_PROC_ZONE 权限应用于全局区域中需要权限才能在非全局区域中操作的进程。