当前位置: 首页 > 文档资料 > FreeBSD 开发手册 >

3.5 限制你的程序环境

优质
小牛编辑
124浏览
2023-12-01

传统的限制进程的方法是使用系统调用chroot() 。这个系统调用使得从进程及其任何子进程所引用的其他的 路径变为根路径。对于要使程序运行成功这个调用必须在引用的目录上 拥有执行(搜索)的权限。直到你使用了chdir() 在你的新环境中它才会实际的生效。同时应该注意到如果程序具有超级 用户的权限它很容易的摆脱chroot所设置的环境。它可能靠创建设备节点 来读取内核的内容,对程序在 chroot(8) 外绑定一个调试器, 或者靠其他创造性的方法来完成操作。

系统调用chroot()的行为可以被 sysctl变量kern.chroot_allow_open_directories 的值在一定程度上控制。当此值为0时,如果有任何目录被打开 chroot()将会返回EPERM并失败。当被置为默认值1,如果 任何目录被打开并且进程已经准备调用 chroot() 那么chroot()将会返回EPERM并失败。对于其他的 值,对打开目录的检查会被完全的忽视。

3.5.1 FreeBSD的jail功能

Jail的概念在chroot()之上作了延伸,它 靠限制超级用户的权力来创建了一个真正的"虚拟服务器"。一旦一个监 狱被设置好后整个网络必须通过特别的IP地址才能到达,在这里"超级用 户权限"的力量完全的受到限制。

当在jail中时,所有在内核中使用suser() 调用的超级用户权限的尝试都会失败。然而,一些对suser() 的调用已经被更改为新的接口suser_xxx() 。这个函数对认可或者拒绝被限制的进程去取得超级用户的权 限的行为负责。

一个在Jail环境中的超级用户进程有以下权力:

  • 使用可信任的操作: setuid, seteuid, setgid, setegid, setgroups, setreuid, setregid, setlogin

  • 使用setrlimit设置资源限制

  • 编辑一些sysctl节点值 (kern.hostname)

  • chroot()

  • 在 vnode 上设置标志: chflagsfchflags

  • 设置 vnode 节点的属性, 如访问权限、 所有者、 所有组、 尺寸、 上次访问时间, 以及修改时间。

  • 在互联网域上绑定特权端口 (端口号 < 1024)

Jail是一个对于在一个安全环境中 运行一个仍有一些缺点的程序非常有用的工具。目前,IPC机制还没有被 更改到suser_xxx以至于像MySQL之类的程序还不 能运行在jail中。在jail中超级用户的存取可能还有非常有限的含义, 但是没有途径能正确的指出"非常有限"意味着什么。

3.5.2 POSIX®.1e 处理能力

POSIX®已经发布了一个工作草案,增加了事件审计,访问控制列表, 精细特权控制,信息标签和强制访问控制。

这是一个正在进展中的工作并且是 TrustedBSD项目的重点。一些初始化的工作已经被提交到 FreeBSD-CURRENT(cap_set_proc(3))。