sandboxing - 隔离执行环境
沙箱是可用于指定安全性和资源隔离要求的进程属性的唯一命名集合。每个沙箱规范由一个项目名称、一个标签和一组用户属性构成。
一组资源管理属性(其项目名称与沙箱名称相同)与沙箱关联。有关可用属性的更多信息,请参见 resource-controls(7) 手册页。这些资源控制应用于在沙箱中执行的所有进程。
每个沙箱都有一个唯一的标签,指定它在层次上与其他所有沙箱如何相关。有关更多信息,请参见 labels(7) 手册页。在沙箱中执行的进程必须有安全许可,它支配沙箱的标签。有关进程标记说明的更多信息,请参见 clearance(7) 手册页。安全许可和标签包含一个分类名称和一个或多个区间名称。这些名称在由 SMF 服务使用的 label_encodings 文件中定义:
labeld:clearance
有关更多信息,请参见 label_encodings(5) 手册页。
sandboxing 功能要求以不相交的方式指定分类和区间的值。使用称为“沙箱标签 v1.0”的特定编码约定。为了方便以及保持一致性,可以使用 sandbox(1) 的 init 子命令生成符合标准的标签编码文件。它提供了用于指定分类和区间总数及其前缀的选项。为确保唯一性,这些前缀附加上从 1 开始的整数值。最大分类和区间名称数分别是 8 个和 4096 个。缺省前缀为 Class 和 Sandbox。保留分类名称 Public 为最小标签,它也是缺省安全许可。
这些编号的分类和区间的位值不相交。后缀 "All" 用于指定分类或区间的父子层次结构。例如,带有标签 Class1 SandboxAll 的沙箱是共享 Class1 分类的所有沙箱的父项。可以说它的标签支配其子项的标签。所有子沙箱都与其他子沙箱不相交,所有父沙箱都与其他父沙箱不相交。如果使用最大值,则每个父沙箱(共 8 个)都能有 4096 个子沙箱,总共有 32,776 个沙箱。仅当沙箱中进程的安全许可支配目标对象的标签时,这些进程才能访问其他进程、文件和共享内存区段。特殊进程安全许可 ClassAll SandboxAll 支配每个沙箱标签。
构造安全许可时,Sandbox 区间名称互斥,所以它们不能组合在一起,但使用特殊区间 SandboxAll 时除外。尽管像 Class1 和 Class2 这样的分类名称不相交且不能组合在沙箱标签中,但是它们可以组合在用户安全许可中。例如,具有以下安全许可的用户:
Class2 Class1 SandboxAll
可以是带有以下标签的两个父沙箱的管理员:
Class1 SandboxAll Class2 SandboxAll
具有相应进程凭证的进程可以使用 sandbox_enter 或使用 sandbox 命令进入沙箱而无需进行验证或使用特权。实施以下安全策略:
如果进程的 uid 和与沙箱关联的用户的 uid 相同,则可以进入父沙箱,并且进程安全许可支配沙箱的标签。也允许在 ADMIN_HIGH 下运行的 root 进程进入父沙箱。进入后,进程安全许可设置为沙箱的标签,uid 和项目设置为沙箱。也会在进程中设置与用户关联的主要组和辅助组。
当某个进程在其父进程的沙箱中运行时,可以进入子沙箱。进程 project 将设置为子沙箱的进程 project。通过将 SandboxAll 区间替换为与子项关联的唯一编号的 Sandbox 区间来降低安全许可。
当进入子沙箱时,调用者可以选择是临时进入还是永久进入。如果指定的是临时选项,则保留父沙箱的 uid。如果已为父沙箱指定了额外的(非沙箱)区间,则可以在新进程安全许可中选择性地保留它们。调用者随后可以使用 sandbox_exit(3SANDBOX) 函数来恢复到父沙箱,这样会恢复与父项关联的进程属性,或者调用者也可以再次调用 sandbox_enter(3SANDBOX) 函数,这次指定永久选项。
如果选择的是永久选项,则调用者也可以指定应该将其 uid 和起始目录设置为子沙箱的 uid 和起始目录。如果 uid 发生了更改,则也会在进程中设置与用户关联的主要组和辅助组。
也可以使用 ssh(1) 等 PAM 服务进入父沙箱和子沙箱。如果为用户分配了与沙箱对应的 uid、安全许可和项目等属性,就可以做到这一点。这类似于调用 sandbox_enter(3SANDBOX) 函数,但是必须先对用户进行验证。此外,还会设置用户的审计 ID 和审计掩码,这是一项可审计的操作。
有关下列属性的说明,请参见 attributes(7):
|
plabel(1)、sandbox(1)、getlabel(2)、libtsol(3LIB)、setproject(3PROJECT)、sandbox_create(3SANDBOX)、label_to_str(3TSOL)、setclearance(3TSOL)、setflabel(3TSOL)、str_to_label(3TSOL)、label_encodings(5)、attributes(7)、clearance(7)、labels(7)、resource-controls(7)、projmod(8)、sandboxadm(8)