每个非全局区域都有一个安全边界。该安全边界通过以下各项进行维护:
* 采用 Solaris 10 进程权利管理 (privileges(5))
* 名称空间(如 /proc 和 /dev)隔离
* 仅通过网络进行的区域间通信(在 IP 内环回)
4.1 进程权利管理
传统的 UNIX 权限模型将所有的权限与有效的 uid 0(根)关联。这种要么全有要么全无的方法存在很多缺点:
* 不能使用有限的权限集扩展普通用户的能力。
* 每个具有权限的进程都对系统具有完全的支配权。可以利用具有权限的进程对系统进行完全访问。
Solaris 10 OS 通过实现进程权利管理[3]的原则解决了上述问题,该原则是将用户的权限限制为执行作业所需的权限。进程权利管理通过权限集扩展了 Solaris 进程模型。每个权限集包含零个或多个权限。每个进程有四个权限集。其中的一个权限集-有效权限集,决定进程是否可以使用特定权限。
这四个权限集包括:
* 有效权限集-程序在执行时使用的一组权限。要使某一权限成为有效权限,该权限还必须包含在允许权限集中。
* 允许权限集-可用的一组权限。权限可通过继承或分配供程序使用。允许权限集是可继承权限集的子集。可以从允许权限集中删除权限,但不能向该权限集添加权限。可识别权限的程序会从程序的允许权限集中删除其从未使用过的权限。这样,程序便可避免使用不正确地分配或继承的权限。
* 可继承权限集-进程可以从父进程处继承而来的一组权限。子进程实际继承哪些权限由进程的启动方式以及该子进程的允许权限集控制。对用户而言,可继承权限集包括一组基本的权限。通过调用 fork(2) 启动的程序继承父进程的所有权限,并可以将新权限添加至进程。通过调用 exec(2) 启动的程序继承父进程的所有权限。但是,此类程序不能添加任何新权限。也就是说,程序的允许权限集等于可继承权限集。可继承权限集由限制权限集的值来限制。
* 限制权限集-进程及其后代可以继承的权限的上限。缺省情况下,限制权限集包括所有权限。这样,如果为用户分配的配置文件中包括一个已分配权限的程序,则用户可以运行该程序,因为分配的权限在用户的限制权限集内。在执行时,并非允许权限集中的所有权限都可以使用。限制权限集仅在执行 exec(2) 时实施,从而允许进程在执行 exec(2) 时删除权限,但在此时刻之前可以一直使用这些权限。允许权限集是可继承权限集的子集。可继承权限集由限制权限集的值来限制。
exec(2) 权限集变换规则如下所示:
其中
C.E-父进程的有效权限集
C.P-父进程的允许权限集
C.I-父进程的可继承权限集
C.L-父进程的限制权限集
C'.E-子进程的有效权限集
C'.P-子进程的允许权限集
C'.I-子进程的可继承权限集
C'.L-子进程的限制权限集
所有内核安全策略检查都只能使用权限来执行。
内核提供用户使用系统所需的基本权限集。登录时,每个用户都会继承基本权限集。可以使用 ppriv(1) 修改基本权限集。限制权限集通常是完整的权限集合。目前,为权限集定义了 48 种权限。privileges(5) 可列出这些权限及其定义。如果某一进程可识别权限,则其有效权限集将决定该进程的行为。
如果进程的权限识别状态 (Privilege Aware State, PAS) 是不可识别权限 (not privilege aware, NPA),则进程会忽略权限模型。进程的权限状态可以通过 PAS 进行扩展,PAS 可取以下值:
* 可识别权限 (Privilege aware, PA)-完全忽略有效 UID
* 不可识别权限 (Not privilege aware, NPA)-行为几乎与传统进程完全相同
进程可以通过 setpflags(2) 尝试成为 NPA。如果没有继承 PA,内核会尝试在执行 exec(2) 时删除 PA。
4.2 区域进程权限
在非全局区域中运行的所有进程都可以识别权限。这意味着非全局区域中的所有进程都受创建进程时为其分配的权限集的约束。系统创建非全局区域时,会创建一个内核伪进程 zsched 作为该区域的根进程。非全局区域中的所有进程都是 zsched 的后代。zsched 的可继承权限集决定了该区域中进程的有效权限集。
下面的列表显示非全局区域中的进程所具有的权限。由于非全局区域中进程的权限受限,因此某些系统可能返回错误。在大多数情况下,拥有权限的进程将返回 EPERM。某些检查 PRIV_CPC_CPU 或 PRIV_NET_RAWACCESS 的系统调用会返回 EACCESS。第 6.0 节总结了在非全局区域中调用时可能返回错误的系统调用、库函数和命令。
所有权限 区域权限
=========================================================
PRIV_CONTRACT_EVENT PRIV_CONTRACT_EVENT
PRIV_CONTRACT_OBSERVER PRIV_CONTRACT_OBSERVER
PRIV_CPC_CPU
PRIV_DTRACE_PROC
PRIV_DTRACE_USER
PRIV_DTRACE_KERNEL
PRIV_FILE_CHOWN PRIV_FILE_CHOWN
PRIV_FILE_CHOWN_SELF PRIV_FILE_CHOWN_SELF
PRIV_FILE_DAC_EXECUTE PRIV_FILE_DAC_EXECUTE
PRIV_FILE_DAC_READ PRIV_FILE_DAC_READ
PRIV_FILE_DAC_SEARCH PRIV_FILE_DAC_SEARCH
PRIV_FILE_DAC_WRITE PRIV_FILE_DAC_WRITE
PRIV_FILE_LINK_ANY PRIV_FILE_LINK_ANY
PRIV_FILE_OWNER PRIV_FILE_OWNER
PRIV_FILE_SETID PRIV_FILE_SETID
PRIV_IPC_DAC_READ PRIV_IPC_DAC_READ
PRIV_IPC_DAC_WRITE PRIV_IPC_DAC_WRITE
PRIV_IPC_OWNER PRIV_IPC_OWNER
PRIV_NET_ICMPACCESS PRIV_NET_ICMPACCESS
PRIV_NET_PRIVADDR PRIV_NET_PRIVADDR
PRIV_NET_RAWACCESS
PRIV_PROC_CHROOT PRIV_PROC_CHROOT
PRIV_PROC_CLOCK_HIGHRES
PRIV_PROC_AUDIT PRIV_PROC_AUDIT
PRIV_PROC_EXEC PRIV_PROC_EXEC
PRIV_PROC_FORK PRIV_PROC_FORK
PRIV_PROC_INFO PRIV_PROC_INFO
PRIV_PROC_LOCK_MEMORY
PRIV_PROC_OWNER PRIV_PROC_OWNER
PRIV_PROC_PRIOCNTL
PRIV_PROC_SESSION PRIV_PROC_SESSION
PRIV_PROC_SETID PRIV_PROC_SETID
PRIV_PROC_TASKID PRIV_PROC_TASKID
PRIV_PROC_ZONE
PRIV_SYS_ACCT PRIV_SYS_ACCT
PRIV_SYS_ADMIN PRIV_SYS_ADMIN
PRIV_SYS_AUDIT PRIV_SYS_AUDIT
PRIV_SYS_CONFIG
PRIV_SYS_DEVICES
PRIV_SYS_IPC_CONFIG
PRIV_SYS_LINKDIR
PRIV_SYS_MOUNT PRIV_SYS_MOUNT
PRIV_SYS_NET_CONFIG
PRIV_SYS_NFS PRIV_SYS_NFS
PRIV_SYS_RESOURCE PRIV_SYS_RESOURCE
PRIV_SYS_SUSER_COMPAT
PRIV_SYS_TIME
[
本帖最后由 云杉上的蝴蝶 于 2008-6-13 18:12 编辑 ]