跳过导航链接 | |
退出打印视图 | |
![]() |
系统管理指南:安全性服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
进程权限管理允许在命令、用户、角色和系统四个级别上对进程加以限制。Oracle Solaris 通过特权实现进程权限管理。特权可以降低与(在系统中具有完全超级用户功能的)某个用户或某个进程相关的安全风险。特权与 RBAC 相结合,是传统超级用户模型的强大的替代模型。
有关 RBAC 的信息,请参见基于角色的访问控制(概述)。
有关如何管理特权的信息,请参见第 11 章。
有关特权的参考信息,请参见第 12 章。
特权是进程执行某项操作所需的独立权限。权限是在内核中实施的。若程序在 Oracle Solaris 的基本特权集界限内运行,则该程序也会在系统安全策略界限内运行。例如,setuid 程序就是在系统安全策略界限外部运行的程序。通过使用特权,程序可以不必调用 setuid。
特权以离散方式枚举可在系统上执行的操作种类。程序可以使用可使其成功执行的确切特权运行。例如,设置日期并将日期写入管理文件的程序可能需要 file_dac_write 和 sys_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 防护功能本身可被用来获取访问权限。
之后,特权可以限制程序和进程,使其仅具备程序所需的功能。此功能称为最小特权原则。在实现最小特权的系统上,捕获某个进程的入侵者只能访问该进程所具有的那些特权,不会破坏其余部分的系统安全。
FILE 特权-以字符串 file 开头的特权用于文件系统对象。例如,file_dac_write 特权允许在写入文件时覆盖自主访问控制。
IPC 特权-以字符串 ipc 开头的特权允许覆盖 IPC 对象访问控制。例如,ipc_dac_read 特权允许进程读取受 DAC 保护的远程共享内存。
NET 特权-以字符串 net 开头的特权授予对特定网络功能的访问权限。例如,net_rawaccess 特权允许设备连接到网络。
PROC 特权-以字符串 proc 开头的特权允许进程修改进程本身的限定属性。PROC 特权包括影响非常有限的特权。例如,proc_clock_highres 特权允许进程使用高分辨率的计时器。
SYS 特权-以字符串 sys 开头的特权为进程授予对各种系统属性的无限制访问权限。例如,sys_linkdir 特权允许进程建立和断开指向目录的硬链接。
有些特权对系统的影响有限,而有些特权则具有广泛的影响。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 具有特权的系统与不具有特权的系统之间的明显差别
|
从 Solaris 10 8/07 发行版开始,project.max-locked-memory 和 zone.max-locked-memory 资源控制可用于限制指定有 PRIV_PROC_LOCK_MEMORY 特权的进程的内存使用。此特权允许进程锁定物理内存中的页。
如果将 PRIV_PROC_LOCK_MEMORY 特权指定给某个权限配置文件,则可为具有此特权的进程提供锁定所有内存的功能。作为一项保护措施,请设置资源控制以防止具有该特权的用户锁定所有内存。对于在非全局区域中运行的特权进程,请设置 zone.max-locked-memory 资源控制。对于在系统上运行的特权进程,请创建一个项目,然后设置 project.max-locked-memory 资源控制。有关这些资源控制的信息,请参见《系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones》中的第 6 章 "资源控制(概述)"和《系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones》中的第 17 章 "非全局区域配置(概述)"。
每个进程都有四个特权集,用于确定进程是否可以使用某个特定的特权。内核会自动计算有效特权集。可以修改初始可继承特权集。通过编码来使用特权的程序可以减小该程序的允许特权集。可以缩小限制特权集。
允许特权集 (P)-可供使用的特权集。特权可通过继承或指定供程序使用。执行配置文件便是一种将特权指定给程序的方法。setuid 命令可将 root 具有的所有特权指定给程序。可从允许特权集中删除特权,但不能向该集中添加特权。已从 P 中删除的特权会自动从 E 中删除。
可识别特权的程序会从该程序的允许特权集中删除程序从不使用的特权。通过这种方法,程序或恶意进程将无法利用不必要的特权。有关可识别特权的程序的更多信息,请参见《Oracle Solaris 开发者安全性指南》中的第 2 章 "开发特权应用程序"。
可继承特权集 (I)-进程可通过调用 exec 继承的特权集。调用 exec 之后,允许特权集和有效特权集会相同,但 setuid 程序这种特殊情况除外。
对于 setuid 程序,调用 exec 之后,可继承特权集首先会受限制特权集的限制。然后,系统会从继承特权集 (I) 中删除限制特权集 (L) 中的所有特权,并将结果指定给此进程的 P 和 E。
限制特权集 (L)-对可用于某个进程及其子进程的特权的外部限制。缺省情况下,限制特权集为所有特权。进程可以缩小限制特权集,但是永远不能扩展限制特权集。L 用于限制 I。因此,L 会在调用 exec 时限制 P 和 E。
如果为用户指定的配置文件中包含指定有特权的程序,则此用户通常可以运行该程序。在未修改的系统上,为此程序指定的特权在用户的限制特权集中。已指定给程序的特权会成为用户的允许特权集的一部分。要运行已指定有特权的程序,用户必须从配置文件 shell 运行此程序。
内核可以识别基本特权集。在未修改的系统上,每个用户的初始可继承特权集等同于登录时获取的基本特权集。可以修改用户的初始可继承特权集,但不能修改基本特权集。
E (Effective): basic I (Inheritable): basic P (Permitted): basic L (Limit): all
因此,在登录时,所有用户在其可继承特权集、允许特权集和有效特权集中包含了基本特权集。用户的限制特权集包含所有特权。要在用户的有效特权集中加入更多特权,必须为该用户指定一个权限配置文件。此权限配置文件将包含已添加了特权的命令。还可以直接将特权指定给用户或角色,但这种特权指定可能会有风险。有关风险的介绍,请参见直接指定安全属性时的安全注意事项。
进程可以继承特权。或者,也可以为进程指定特权。进程从其父进程继承特权。登录时,用户的初始可继承特权集确定该用户的进程可用的特权。用户初始登录的所有子进程都从此特权集继承。
也可以直接将特权指定给程序、用户和角色。当某个程序需要特权时,可以在权限配置文件中将特权指定给该程序的可执行文件。系统会向获许运行程序的用户或角色指定包含该程序的配置文件。登录或进入配置文件 shell 时,如果在配置文件 shell 中键入了程序的可执行文件,则可使用特权运行该程序。例如,拥有 Object Access Management(对象访问管理)配置文件的角色可以使用 file_chown 特权运行 chmod 命令。
当某个角色或用户运行已直接指定有附加特权的程序时,该指定特权会添加到此角色或用户的可继承特权集中。指定有特权的程序的子进程会继承父进程的特权。如果子进程需要的特权比父进程的特权多,则必须直接为子进程指定这些额外特权。
通过编码使用特权的程序称为可识别特权的程序。可识别特权的程序可在程序执行过程中启用和禁用特权。要在生产环境中成功执行程序,必须为程序指定其可启用和禁用的特权。
有关可识别特权的代码示例,请参见《Oracle Solaris 开发者安全性指南》中的第 2 章 "开发特权应用程序"。要为需要特权的程序指定特权,请参见如何为命令添加特权。
您作为系统管理员应负责指定特权。通常,在权限配置文件中将特权指定给命令。然后,将该权限配置文件指定给角色或用户。Solaris Management Console 提供了图形用户界面 (graphical user interface, GUI) 来指定特权。也可以使用 smuser 和 smrole 等命令来指定特权。有关如何使用 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_drv 和 update_drv 命令可以修改设备策略项以及驱动程序特定的特权。必须使用完全特权集运行进程才能更改设备策略。有关更多信息,请参见 add_drv(1M) 和 update_drv(1M) 手册页。
Oracle Solaris 提供了用于调试特权问题的工具。ppriv 命令和 truss 命令可提供调试输出。有关示例,请参见 ppriv(1) 手册页。有关过程,请参见如何确定程序所需的特权。