系统管理指南:安全性服务

权限(概述)

进程权利管理允许在命令、用户、角色和系统四个级别上对进程加以限制。Solaris OS 通过权限实现进程权利管理。权限可以降低与(在系统中具有完全超级用户功能的)某个用户或某个进程相关的安全风险。权限和 RBAC 为传统的超级用户模型提供了功能强大的替代模型。

权限保护内核进程

权限是进程执行某项操作所需的单项权利。权利是在内核中实施的。在 Solaris 权限基本集范围内运行的程序可在系统安全策略范围内运行。setuid 程序是在系统安全策略范围之外运行的程序示例。通过使用权限,程序可以不必调用 setuid

权限会分别枚举针对系统的可能的操作种类。程序可以使用可使其成功执行的确切权限运行。例如,用来设置日期并将其写入管理文件的程序可能需要 file_dac_writesys_time 权限。借助此功能,可以不必以 root 身份运行任何程序。

以前,系统并未遵循权限模型,而是使用超级用户模型。 在超级用户模型中,进程以 root 或用户身份运行。用户进程被限定为对用户的目录和文件执行操作,root 进程则可在系统中的任何位置创建目录和文件。需要在用户目录外部创建目录的进程将使用 UID=0(即作为 root)运行。安全策略依靠 DAC(discretionary access control,自主访问控制)来保护系统文件。设备节点受到 DAC 的保护。例如,组 sys 拥有的设备只能由 sys 组的成员打开。

但是,setuid 程序、文件权限和管理帐户很容易被误用。setuid 进程所允许的操作数比该进程完成其运行过程所需的操作数多。入侵者会破坏 setuid 程序,然后以可执行所有功能的 root 用户身份运行。同样,可访问 root 口令的任何用户都可能会破坏整个系统的安全。

与之相反,通过权限来实施策略的系统允许在用户功能和 root 功能之间划分等级。可以授予用户执行超出普通用户功能的活动,并将 root 加以限制,使 root 具有的权限比目前要少。借助 RBAC,可以将使用权限运行的命令单独放在权限配置文件中,并指定给一个用户或角色。表 8–1 汇总了 RBAC 和权限模型提供的用户功能和超级用户功能之间的等级。

权限模型比超级用户模型具有更大的安全性。已从进程中删除的权限不会被利用。进程权限防止程序或管理帐户获取对所有功能的访问权限。进程权限可为敏感文件提供额外的保护措施,而 DAC 防护功能本身可被用来获取访问权限。

之后,权限可将程序和进程限制为仅具备程序所需的功能。此功能称为最低权限原则。在实现最低权限的系统上,捕获某个进程的入侵者只能访问该进程所具有的那些权限,不会破坏其余部分的系统安全。

权限说明

可以根据权限范围对权限进行逻辑分组。

某些权限对系统具有有限的影响,而某些权限则具有广泛的影响。proc_taskid 权限的定义指明了其有限的影响:


proc_taskid

        Allows a process to assign a new task ID to the calling process.

file_setid 权限的定义指明了其广泛的影响:


net_rawaccess

        Allow a process to have direct access to  the  network layer.

privileges(5) 手册页中提供了每个权限的描述。ppriv -lv 命令会将对每个权限的描述显示在标准输出中。

具有权限的系统的管理差别

具有权限的系统与没有权限的系统之间存在多种明显差别。下表列出了部分差别。

表 8–2 具有权限的系统与没有权限的系统之间的明显差别

功能 

没有权限 

权限 

守护进程 

root 身份运行的守护进程。

以用户 daemon 身份运行的守护进程。

例如,以下守护进程已指定有相应的权限,并以 daemon 身份运行:lockdmountdnfsdrpcbind

日志文件拥有权 

日志文件由 root 拥有。

现在,日志文件由创建了此日志文件的 daemon 拥有。root 用户不拥有此文件。

错误消息 

错误消息涉及超级用户。 

例如,chroot:not superuser

错误消息反映权限的使用。 

例如,chroot 故障的等效错误消息为 chroot:exec failed

setuid 程序

程序使用 setuid 来完成不允许普通用户执行的任务。

许多 setuid 程序都已更改为使用权限运行。

例如,以下实用程序会使用权限:ufsdumpufsrestorershrloginrcprdistpingtraceroutenewtask

文件权限 

设备权限受 DAC 控制。例如,sys 组的成员可以打开 /dev/ip

文件权限 (DAC) 不会预测可以打开设备的对象。设备通过 DAC 设备策略进行保护。

例如,/dev/ip 文件具有 666 种权限,但是设备只能由具有相应权限的进程打开。原始套接字仍受 DAC 保护。

审计事件 

su 命令的使用进行审计涉及许多管理功能。

对权限的使用进行审计涉及大多数管理功能。pmas 审计类包括用于配置设备策略的审计事件以及用于设置权限的审计事件。

进程 

进程受进程属主保护。 

进程受权限保护。进程权限和进程标志可显示为 /proc/<pid> 目录中的一个新项 priv

调试 

核心转储中不引用任何权限。 

核心转储的 ELF 注释部分包括有关 NT_PRPRIVNT_PRPRIVINFO 注释中的进程权限和标志的信息。

ppriv 实用程序和其他实用程序可显示大小合适的集的正确数目。这些实用程序会将位集中的位正确映射为权限名称。

如何实现权限

每个进程都有四个权限集,用于确定进程是否可以使用特定权限。内核会自动计算权限的有效集。可以修改权限的初始可继承集。通过编码来使用权限的程序可以减小程序的权限允许集。可以缩小权限的限制集

内核可识别基本权限集。在未修改的系统上,每个用户的初始可继承集等效于登录时获取的基本集。可以修改用户的初始可继承集,但不能修改基本集。

在未修改的系统上,用户在登录时的权限集将显示以下类似信息:


E (Effective): basic

I (Inheritable): basic

P (Permitted): basic

L (Limit): all

因此,登录时所有用户在其各自的可继承集、允许集和有效集中包含基本集。用户的限制集包含所有权限。要在用户的有效集中加入更多权限,必须为该用户指定一个权限配置文件。此权限配置文件将包括已向其中添加了权限的命令。还可以将权限直接指定给用户或角色,尽管这种权限指定可能会存在风险。有关风险的介绍,请参见直接指定安全属性时的安全注意事项

进程如何获取权限

进程可以继承权限。或者,可以为进程指定权限。进程从其父进程继承权限。登录时,用户的初始可继承权限集确定可用于此用户进程的权限。用户初始登录的所有子进程都可继承此权限集。

还可以将权限直接指定给程序、用户和角色。当某个程序需要权限时,可以在权限配置文件中将权限指定给此程序的可执行文件。允许运行此程序的用户或角色会被指定包括此程序的配置文件。登录或进入配置文件 shell 时,如果在配置文件 shell 中键入程序的可执行文件,则可使用权限运行此程序。例如,拥有对象访问管理配置文件的角色可以使用 file_chown 权限运行 chmod 命令。

当某个角色或用户运行已直接指定有其他权限的程序时,指定的权限会添加到此角色或用户的可继承集中。指定有权限的程序的子进程会继承父进程的权限。如果子进程需要的权限比父进程的权限多,则必须为子进程直接指定这些权限。

通过编码来使用权限的程序称为可识别权限的程序。可识别权限的程序可在程序执行过程中启用和禁用权限。要在生产环境中成功执行,必须为程序指定其启用和禁用的权限。

有关可识别权限的代码的示例,请参见《Solaris 开发者安全性指南》中的第 2  章 “开发特权应用程序”。要为需要权限的程序指定权限,请参见如何为命令添加权限

指定权限

您作为系统管理员应负责指定权限。通常,可在权限配置文件中将权限指定给命令。然后,将权限配置文件指定给角色或用户。Solaris Management Console 提供了图形用户界面 (graphical user interface, GUI) 来指定权限。还可以使用 smusersmrole 等命令来指定权限。有关如何使用 GUI 来指定权限的更多信息,请参见第 9 章,使用基于角色的访问控制(任务)

还可以将权限直接指定给用户。如果您相信某些用户在其整个会话过程中会负责地使用某种权限,则可以直接指定此权限。适合直接指定的权限是具有有限影响的权限,如 proc_clock_highres。不适合直接指定的权限是具有广泛影响的权限,如 file_dac_write

还可以拒绝为用户或系统指定权限。从用户或系统的初始可继承集或限制集中删除权限时必须谨慎。

扩展用户或角色的权限

用户和角色具有可继承权限集以及限制权限集。限制集不能扩展,因为限制集最初包括所有权限。可以针对用户、角色和系统扩展初始可继承集。还可以将不在可继承集中的权限指定给进程。

按进程指定权限是最精确的添加权限方法。可以通过允许某用户承担某种角色,扩展此用户可执行的特权操作的数目。可以为角色指定包括具有已添加权限的命令的配置文件。用户承担角色时,便会获取此角色的配置文件 shell。通过在角色的 shell 中键入角色配置文件中的命令,便可使用已添加的权限执行这些命令。

还可以将配置文件指定给用户而不是用户承担的角色。配置文件可包括具有已添加权限的命令。用户打开配置文件 shell(如 pfksh)时,便可使用权限执行用户配置文件中的命令。在常规 shell 中,不使用权限执行命令。特权进程只能在特权 shell 中执行。

扩展用户、角色或系统的初始可继承权限集是一种风险性较高的指定权限方法。可继承集中的所有权限都位于允许集和有效集中。用户或角色在 shell 中键入的所有命令都可以使用直接指定的权限。使用直接指定的权限,用户或角色可以轻松执行可能超出其管理职责范围的操作。

向某系统上的初始可继承权限集中添加权限后,所有登录到此系统的用户都会具有更大的基本权限集。通过这种直接指定,系统的所有用户都可以轻松执行可能超出普通用户执行范围的操作。

限制用户或角色的权限

通过删除权限,可以防止用户和角色执行特定的任务。可以从初始可继承集和限制集中删除权限。分配小于缺省集的初始可继承集或限制集之前,应谨慎地对权限删除进行测试。通过从初始可继承集中删除权限,可能会使用户无法登录。从限制集中删除权限后,传统的 setuid 程序可能会失败,因为此程序需要的权限已被删除。

向脚本指定权限

脚本与命令一样,也是可执行文件。因此,在权限配置文件中,可以将权限添加到脚本中,就像将权限添加到命令中一样。已指定有配置文件的用户或角色在配置文件 shell 中执行脚本时,将会使用已添加的权限来运行脚本。如果脚本包含需要权限的命令,则具有已添加权限的命令也应该位于配置文件中。

可识别权限的程序可以限制每个进程的权限。包含可识别权限的程序的作业是指为可执行文件指定此程序所需的确切权限。然后测试此程序,查看此程序是否成功执行了其任务。还可以检查此程序是否误用了其权限。

权限和设备

权限模型使用权限来保护系统接口,这些接口在超级用户模型中单独由文件权限保护。在具有权限的系统中,文件权限太小,因此无法保护这些接口。proc_owner 等权限可以覆盖文件权限,然后提供对所有系统的完全访问权限。

因此,具有设备目录的拥有权不足以打开设备。例如,不再自动允许 sys 组的成员打开 /dev/ip 设备。/dev/ip 的文件权限为 0666,但是需要 net_rawaccess 权限才能打开设备。

设备策略受权限控制。getdevpolicy 命令可显示每个设备的设备策略。设备配置命令 devfsadm 可用于安装设备策略。devfsadm 命令可将权限集与 open 绑定,以便设备读取或写入。有关更多信息,请参见 getdevpolicy(1M)devfsadm(1M) 手册页。

使用设备策略,可以更灵活地为打开的设备授予权限。您可以要求与缺省设备策略不同的权限,或者比其更多的权限。可以针对设备策略和驱动程序适当地修改权限要求。可以在安装、添加或更新设备驱动程序时修改权限。

add_drvupdate_drv 命令可以修改设备策略项以及驱动程序特定的权限。必须使用完整的权限集运行进程才能更改设备策略。有关更多信息,请参见 add_drv(1M)update_drv(1M) 手册页。

权限和调试

Solaris OS 提供了各种工具来调试权限故障。ppriv 命令和 truss 命令可提供调试输出。有关示例,请参见 ppriv(1) 手册页。有关过程,请参见如何确定程序所需的权限