跳过导航链接 | |
退出打印视图 | |
手册页第 5 部分:标准、环境和宏 Oracle Solaris 11.1 Information Library (简体中文) |
- 进程特权模型
Oracle Solaris 软件实现了一组特权,用于提供对进程操作的精细控制。如果拥有某种特权,则进程可以执行一组特定的受限操作。
现在 Oracle Solaris 操作系统转变为一个主要基于特权的安全模型,这使开发人员可以限制进程只执行实际需要的那些特权操作,而不是授予所有特权(超级用户)或不授予任何特权(非零 UID)。此外,一组先前不受限制的操作现在需要特权;这类特权被称为“基本”特权,会缺省提供给所有进程。
除了“基本”特权以外,定义的所有特权构成了过去与 root 用户关联的那组特权。“基本”特权是过去无特权的进程拥有的“特权”。
定义的特权包括:
允许进程请求将事件可靠地提交到事件端点。
允许进程将事件包括在模板的关键事件集术语中,该模板可以由用户批量生成。
允许进程设置进程合同模板的服务 FMRI 值。
允许进程观察由进程的有效用户 ID 以外的用户创建和拥有的合同生成的合同事件。
允许进程打开属于进程的有效用户 ID 以外的用户创建和拥有的合同的合同事件端点。
允许进程访问每个 CPU 的硬件性能计数器。
允许执行 DTrace 内核级跟踪。
允许执行 DTrace 进程级跟踪。允许在用户具有权限的进程中放置和启用进程级跟踪探测。
允许执行 DTrace 用户级跟踪。允许使用 syscall 和配置文件 DTrace 提供者检查用户具有权限的进程。
允许进程更改文件的所有者用户 ID。允许进程将文件的组 ID 更改为进程的有效组 ID 之外的某个 ID 或进程的某个补充组 ID。
允许进程放弃其文件。具有此特权的进程运行时就像 {_POSIX_CHOWN_RESTRICTED} 未生效一样。
允许进程执行其权限位或 ACL 禁止进程执行权限的可执行文件。
允许进程读取其权限位或 ACL 禁止进程读取权限的文件或目录。
允许进程搜索其权限位或 ACL 禁止进程搜索权限的目录。
允许进程写入其权限位或 ACL 禁止进程写入权限的文件或目录。缺少有效的 UID 0 时,写入 UID 0 拥有的文件需要所有特权。
允许进程将文件或目录的敏感标签设置为不影响现有敏感标签的敏感标签。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程设置 immutable、nounlink 或 appendonly 文件属性。
允许进程创建指向进程有效 UID 以外的 UID 拥有的文件的硬链接。
允许不是文件的所有者的进程修改该文件的访问权限和修改时间。允许不是目录的所有者的进程修改该目录的访问权限和修改时间。允许不是文件或目录的所有者的进程删除或重命名其父目录设置了“执行后保存文本图像”(sticky) 位的文件或目录。允许不是文件的所有者的进程将 namefs 挂载到该文件上。允许不是文件或目录的所有者的进程修改该文件或目录的权限位或 ACL。
允许进程读取其权限或 ACL 允许进程读取权限的文件或目录。
允许进程更改文件的所有权,或写入未清除 set-user-ID 和 set-group-ID 位的文件。允许进程对所属组不是进程的有效组或进程的某个补充组的文件或目录设置 set-group-ID 位。允许进程在存在 PRIV_FILE_OWNER 时对具有不同所有权的文件设置 set-user-ID 位。当创建或修改 setuid 0 文件时,还适用其他限制。
允许进程将文件或目录的敏感标签设置为影响现有敏感标签的敏感标签。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程写入其权限或 ACL 允许进程写入权限的文件或目录。
允许进程对图形设备创建带特权的 ioctl。通常仅 xserver 进程需要具有此特权。具有此特权的进程也允许执行带特权的图形设备映射。
允许进程通过图形设备执行带特权的映射。
允许进程读取其权限位禁止进程读取权限的 System V IPC 消息队列、信号集或共享内存区段。
允许进程写入其权限位禁止进程写入权限的 System V IPC 消息队列、信号集或共享内存区段。
允许不是 System V IPC 消息队列、信号集或共享内存区段的所有者的进程删除、更改该消息队列、信号集或共享内存区段的所有权或权限位。
允许进程打开 TCP、UDP、SDP 或 SCTP 网络端点。
允许进程绑定到配置为进程区域的多级端口 (multi-level port, MLP) 的端口。此特权适用于共享地址和区域特定的地址 MLP。有关配置 MLP 端口的信息,请参见 Trusted Extensions 手册页中的 tnzonecfg(4)。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程发送和接收 ICMP 包。
允许进程使用 setpflags(2) 设置 NET_MAC_AWARE 进程标志。此特权还允许进程使用 setsockopt(3SOCKET) 设置 SO_MAC_EXEMPT 套接字选项。NET_MAC_AWARE 进程标志和 SO_MAC_EXEMPT 套接字选项都允许本地进程与无标签的对等进程通信(如果本地进程的标签影响对等进程的缺省标签,或本地进程在全局区域中运行)。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
只允许进程打开设备接收网络通信,禁止发送通信。
允许进程绑定到特权端口号。特权端口号是 1-1023(传统 UNIX 特权端口)和标记为 “udp/tcp_extra_priv_ports” 的端口(保留供 NFS 和 SMB 使用的端口除外)。
允许进程直接访问网络层。
允许进程生成审计记录。允许进程获取自身的审计预选信息。
允许进程更改其根目录。
允许进程使用高分辨率计时器。
允许进程调用 exec(2)。
允许进程检查它可以向其发送信号的进程以外的进程的状态。不能被检查的进程在 /proc 中不可见,并且显示为不存在。
允许进程锁定物理内存中的页。
允许进程向其他进程发送信号,以及检查和修改其他进程中的进程状态,而不管所有权如何。修改其他进程时,还适用其他限制:访问进程的有效特权集必须是目标进程的有效特权集、允许特权集和可继承特权集的超集;其限制特权集必须是目标的限制特权集的超集;如果目标进程的任何 UID 设置为 0,则必须声明所有特权,除非有效 UID 为 0。允许进程将任意进程绑定到 CPU。
允许进程将其优先级提升到其当前级别之上。允许进程将其调度类更改为任何调度类,包括 RT 类。
允许进程向其会话之外的进程发送信号或对其跟踪。
允许进程随意设置其 UID,设置为 UID 0 要求声明所有特权。
允许进程将一个新任务 ID 分配给其调用进程。
允许进程跟踪其他区域中的进程或向其发送信号。请参见 zones(5)。
允许进程通过 acct(2) 启用、禁用和管理记帐。
允许进程执行系统管理任务,例如设置节点和域名称、指定 coreadm(1M) 和 nscd(1M) 设置等
允许进程启动(内核)审计守护进程。允许进程查看和设置审计状态(审计用户 ID、审计终端 ID、审计会话 ID、审计预选掩码)。允许进程禁用和启用审计。允许进程配置审计参数(高速缓存和队列大小、事件到类的映射以及策略选项)。
允许进程执行各种系统配置任务。允许执行文件系统特定的管理过程,例如文件系统配置 ioctl、配额调用、创建和删除快照以及处理 PCFS 引导扇区。
允许进程创建设备特殊文件。允许进程成功调用某个调用内核 drv_priv(9F) 函数的内核模块以检查允许的访问权限。允许进程直接打开真实控制台设备。允许进程打开已以独占方式打开的设备。
允许进程配置系统的数据链路接口。
允许进程配置系统的 IP 接口和路由。允许进程配置 TCP/IP 参数。允许进程弹出具有匹配 zoneid 的固定 STREAM 模块。
允许进程增加 System V IPC 消息队列缓冲区的大小。
允许进程链接目录以及解除该链接。
允许进程挂载和卸载本来操作受限的文件系统(即,除 namefs 之外的大多数文件系统)。允许进程添加和删除交换设备。
允许进程执行 PRIV_SYS_IP_CONFIG、PRIV_SYS_DL_CONFIG 和 PRIV_SYS_PPP_CONFIG 允许的所有操作以及以下操作:使用 rpcmod STREAMS 模块和插入/删除模块栈顶部之外的位置上的 STREAMS 模块。
允许进程提供 NFS 服务:启动 NFS 内核线程、执行 NFS 锁定操作、绑定到 NFS 保留端口:端口 2049 (nfs) 和端口 4045 (lockd)。
允许进程使用 pppd(1M) pppd(1M) 创建、配置和销毁 PPP 实例,以及使用 sppptun(1M)sppptun(1M) 控制 PPPoE 激活。缺省情况下此特权会授予独占 IP 栈实例区域。
允许进程将进程绑定到处理器集。
允许进程将进程绑定到处理器集(如同 PRIV_SYS_RES_BIND 特权),还允许执行此段落中所述的下列操作。允许进程创建和删除处理器集,将 CPU 分配给处理器集,以及覆盖 PSET_NOESCAPE 属性。允许进程使用 p_online(2) 更改系统中 CPU 的运行状态。允许进程配置文件系统配额。允许进程配置资源池和将进程绑定到池。
允许进程超出通过 setrlimit(2) 和 setrctl(2) 对其施加的资源限制。
允许进程共享文件系统和取消共享。
允许进程提供 NetBIOS 或 SMB 服务:启动 SMB 内核线程或绑定到 NetBIOS 或 SMB 保留端口:端口 137、138、139 (NetBIOS) 和 445 (SMB)。
允许进程成功调用某个调用内核 suser() 函数的第三方可装入模块以检查允许的访问权限。仅当兼容第三方可装入模块时才存在此特权,Oracle Solaris 属性不使用该特权。
允许进程使用以下任何合适的系统调用管理系统时间:stime(2)、adjtime(2) 和 ntp_adjtime(2)。
允许进程将不受进程的敏感标签影响的标签转换为外部字符串格式或反之。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程管理虚拟化环境。
允许进程覆盖颜色映射限制。
允许进程安装或删除颜色映射。
允许进程检索其他进程分配的颜色映射单元条目。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程配置或销毁 X 服务器永久保留的资源
允许进程使用 SetScreenSaver 设置屏幕保护程序超时值
允许进程使用 ChangeHosts 修改显示访问控制列表。
允许进程使用 GrabServer。
允许进程使用 SetCloseDownMode 请求保留窗口、像素映射、颜色映射、属性、光标、字体或图形文本资源。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程从不归其所有的窗口资源中读取(具有不同的用户 ID)。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程写入或创建不归其所有的窗口资源(具有不同的用户 ID)。新创建的窗口属性使用窗口的用户 ID 创建。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程对窗口输入设备执行各种操作。
允许进程获取和设置键盘和指针控制。
允许进程修改指针按钮和按键映射。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程使用直接图形访问 (DGA) X 协议扩展。仍需要对帧缓存器有直接进程访问权限。因此,该进程必须具有可访问帧缓存器的 MAC 和 DAC 特权,或者必须为该进程分配了帧缓存器。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程将窗口资源的敏感标签设置为不影响现有敏感标签的敏感标签。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程设置字体路径。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程从其敏感标签不等于进程敏感标签的窗口资源中读取。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程创建其敏感标签不等于进程敏感标签的窗口资源。新创建的窗口属性使用窗口的敏感标签创建。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程在没有选择确认器干预的情况下请求在窗口间移动数据。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
允许进程将窗口资源的敏感标签设置为影响现有敏感标签的敏感标签。
仅当系统配置有 Trusted Extensions 时,才会解释该特权。
在上面列出的特权中,特权 PRIV_FILE_LINK_ANY、PRIV_FILE_READ、PRIV_FILE_WRITE、PRIV_PROC_INFO、PRIV_PROC_SESSION、PRIV_NET_ACCESS、PRIV_PROC_FORK 和 PRIV_PROC_EXEC 视为“基本”特权。过去,没有特权的进程始终具有这些特权。缺省情况下,进程仍具有基本特权。
进程的限制特权集(请参见下文)中必须存在特权 PRIV_PROC_SETID、PRIV_PROC_AUDIT 和 PRIV_SYS_RESOURCE,setuid root exec 才能成功,即获取值为 0 的有效 UID 和其他特权。
Oracle Solaris 中的特权实现使用四个特权集扩展进程凭证:
exec 中继承的特权。
进程的最大特权集。
当前有效的特权。
进程及其子级可以获取的特权的上限。对 L 的更改将在下一个 exec 中生效。
对于没有特权的进程,I、P 和 E 集通常与基本特权集相同。限制特权集通常是整个特权集。
每个进程都有权限识别状态 (Privilege Awareness State, PAS),该状态可以接受的值为 PA(privilege-aware,可识别特权)和 NPA(非 PA)。PAS 是一种过渡机制,用于允许用户在与旧超级用户模型完全兼容的方式和完全忽略有效 UID 的方式之间进行选择。
为了方便讨论,下面引入了“观察到的有效特权集”(oE) 和“观察到的允许特权集”(oP) 概念以及实现特权集 iE 和 iP。
通过 setppriv(2) 或者使用 setpflags(2) 处理有效特权集、允许特权集或限制特权集,进程将变为可识别特权的进程。在所有情况下,在变为可识别特权的过程中 oE 和 oP 都是不变的。在变为可识别特权的过程中,将进行以下赋值:
iE = oE iP = oP
如果进程可识别特权,oE 和 oP 在更改 UID 时保持不变。如果进程不识别特权,观察到的 oE 和 oP 如下:
oE = euid == 0 ? L : iE oP = (euid == 0 || ruid == 0 || suid == 0) ? L : iP
如果不识别特权的进程具有值为 0 的有效 UID,它可以行使其限制特权集中包含的特权(特权的上限)。如果不识别特权的进程具有任何值为 0 的 UID,则它表现为有能力行使 L 中的所有特权。
使用 setpflags() 可以使进程恢复到不识别特权的状态。内核在执行 exec(2) 时始终会尝试此操作。仅当满足以下条件时,才允许执行此操作。
如果有任何 UID 等于 0,则 P 必须等于 L。
如果有效 UID 等于 0,则 E 必须等于 L。
当进程放弃特权识别时,将进行以下赋值:
if (euid == 0) iE = L & I if (any uid == 0) iP = L & I
在 UID 不为 0 时获取的特权是受限制特权集限制的进程可继承特权集。
只有进程的(观察到的)有效特权集中的特权才允许进程执行受限的操作。进程可以使用任何特权处理函数来在特权集中添加或删除特权。特权始终是可删除的。只能将允许特权集中的特权添加到有效特权集和可继承特权集中。限制特权集无法扩展。可继承特权集可以大于允许特权集。
当进程执行 exec(2) 时,内核将首先尝试取消特权识别,然后进行以下特权集修改:
E' = P' = I' = L & I L is unchanged
如果进程未处理其特权,则特权集实际上保持不变,因为 E、P 和 I 已相同。
在执行 exec 时,将强制使用限制特权集。
要以向后兼容的方式运行不识别特权的应用程序,可识别特权的应用程序应以 I=basic 启动不识别特权的应用程序。
对于大多数特权,缺少特权仅会导致失败。在某些情况下,缺少特权会导致系统调用的行为方式发生变化。在其他情况下,删除特权会导致 setuid root 应用程序出现严重故障。此类型的特权被视为“不安全的”。当进程的限制特权集中缺少任何不安全的特权时,系统将不会接受 setuid root 应用程序的 setuid 位。setuid root 应用程序可继续执行,不会更改有效用户 ID 或增加特权。已经确定以下特权是不安全的:PRIV_PROC_SETID、PRIV_SYS_RESOURCE 和 PRIV_PROC_AUDIT。
在某些情况下,某一个特权会导致进程获取一个或多个未显式授予给该进程的其他特权。为了阻止此类特权升级,安全策略应要求显式授予这些其他特权。
升级通常源自那些允许通过“原始”接口修改系统资源的机制;例如,通过 /dev/kmem 更改内核数据结构或者通过 /dev/dsk/* 更改文件。当受控制的进程比控制进程具有更多特权时,也会发生升级。上述这种特殊情况包括:处理或创建 UID 0 所有的对象或尝试使用 setuid(2) 获取 UID 0。由于 UID 0 拥有所有系统配置文件,并且普通文件保护机制允许 UID 为 0 的进程修改系统配置,因此需要对 UID 0 进行特殊处理。通过进行相应的文件修改,以值为 0 的有效 UID 运行的给定进程可以获取所有特权。
在进程可能获取 UID 0 的情况下,安全策略应要求具有其他特权,最高为整个特权集。在有其他机制保护系统文件的情况下,可以放松或删除此类限制。当前的 Oracle Solaris 发行版中没有此类机制。
应尽可能限制使用 UID 0 进程。这些进程应替换为以其他 UID 运行的程序,并且该 UID 具有恰好需要的特权。
不再需要执行 (exec) 子进程的守护进程应从其允许特权集和限制特权集中删除 PRIV_PROC_EXEC 特权。
向用户分配特权时,系统管理员可能会为该用户提供比所需更多的权限。管理员应考虑是否需要添加保护。例如,如果为用户指定了 PRIV_PROC_LOCK_MEMORY 特权,则管理员还应考虑设置 project.max-locked-memory 资源控制,以阻止该用户锁定所有内存。
在配置文件或命令行中列出特权时,有时可以使用扩展策略语法。在扩展策略中,特权集括在花括号中,后跟一个分号和一个对象。扩展策略可为指定的对象添加使用该列表中特权的能力。当前网络端口、UID 和文件对象支持扩展策略。
例如,
访问 /var/core 下的文件时允许使用特权 file_dac_read。
允许进程将网络端点绑定到 TCP 端口 80 和 443。
允许进程将 UID 更改为 UID 80 到 100(包括两端)。
允许进程将 UID 更改为用户名 "casper" 的 UID。
安装扩展策略时,扩展策略中列出的特权集将从可继承特权集中删除,并随后从允许特权集和有效特权集中删除,除非该策略中设置的特权包括该区域中可用的所有特权。例如,当安装 {zone}:/etc/shadow 格式的扩展策略时,将不会删除任何特权;而如果扩展策略的格式为 {file_dac_read}:/etc/shadow,将会删除 PRIV_FILE_DAC_READ 特权。
仅当有效特权集中缺少相应特权时,扩展策略才会生效。
虽然可以指定 {all}:/some/file 这样的扩展策略,但系统仍会对某些应用进行限制,例如添加 setuid 位。
当进程安装扩展策略时,该策略中列出的所有特权都需要在该进程中有效。例如,当使用 ppriv(1) 安装策略时,需要所有特权都列在其有效特权集中。不会对作为 ppriv 的对象的进程应用此类限制。但是,其限制特权集将覆盖该扩展策略中的所有特权。
在某些上下文中,需要对部分扩展策略语法进行转义。例如,在 exec_attr(4) 中,需要使用反斜杠 (\) 转义分号 (:)。文件名中的某些字符可能也需要使用反斜杠进行转义,具体取决于上下文。
会在文件系统中的每一层对扩展策略进行评估;对于 lofs(7FS) 文件系统,指定的策略需要考虑以下方面:该策略需要同时指定 lofs 文件系统和底层文件系统。
以下列表包含对象类型和相关特权。
|
1 如 services(4) 中所定义的数字
2 匹配以指定路径名开头的所有文件名
当系统调用由于权限错误失败时,导致该问题的原因并不总是显而易见。要调试此类问题,可以使用名为特权调试的工具。当对进程启用特权调试时,内核会在进程的控制终端报告缺少的特权。(使用 ppriv(1) 的 -D 选项可对进程启用调试。)此外,管理员可以通过以下方式设置 system(4) 变量 priv_debug 来启用系统范围的特权调试:
set priv_debug = 1
在运行系统上,可以使用 mdb(1) 更改此变量。
使用 usermod(1M) 或 rolemod(1M) 可分别为用户或角色分配特权或修改其特权。使用 ppriv(1) 可枚举系统上支持的特权,使用 truss(1) 可确定程序需要哪些特权。
mdb(1)、ppriv(1)、add_drv(1M)、ifconfig(1M)、lockd(1M)、nfsd(1M)、pppd(1M)、rem_drv(1M)、smbd(1M)、sppptun(1M)、update_drv(1M)、Intro(2)、access(2)、acct(2)、acl(2)、adjtime(2)、chmod(2)、chown(2)、chroot(2)、creat(2)、exec(2)、fcntl(2)、fork(2)、fpathconf(2)、getacct(2)、getpflags(2)、getppriv(2)、getsid(2)、kill(2)、link(2)、memcntl(2)、mknod(2)、mount(2)、msgctl(2)、nice(2)、ntp_adjtime(2)、open(2)、p_online(2)、priocntl(2)、priocntlset(2)、processor_bind(2)、pset_bind(2)、pset_create(2)、readlink(2)、resolvepath(2)、rmdir(2)、semctl(2)、setegid(2)、seteuid(2)、setgid(2)、setgroups(2)、setpflags(2)、setppriv(2)、setrctl(2)、setregid(2)、setreuid(2)、setrlimit(2)、settaskid(2)、setuid(2)、shmctl(2)、shmget(2)、shmop(2)、sigsend(2)、stat(2)、statvfs(2)、stime(2)、swapctl(2)、sysinfo(2)、uadmin(2)、ulimit(2)、umount(2)、unlink(2)、utime(2)、utimes(2)、bind(3SOCKET)、door_ucred(3C)、priv_addset(3C)、priv_set(3C)、priv_getbyname(3C)、priv_getbynum(3C)、priv_set_to_str(3C)、priv_str_to_set(3C)、socket(3SOCKET)、t_bind(3NSL)、timer_create(3C)、ucred_get(3C)、exec_attr(4)、proc(4)、services(4)、system(4)、user_attr(4)、lofs(7FS)ddi_cred(9F)、drv_priv(9F)、priv_getbyname(9F)、priv_policy(9F)、priv_policy_choice(9F)、priv_policy_only(9F)
删除进程的任何基本特权会使进程处于不符合标准的状态,可能导致意外的应用程序故障,只能在完全了解可能的副作用的情况下执行该操作。