传统的限制进程的方法是使用系统调用chroot()
。这个系统调用使得从进程及其任何子进程所引用的其他的
路径变为根路径。对于要使程序运行成功这个调用必须在引用的目录上
拥有执行(搜索)的权限。直到你使用了chdir()
在你的新环境中它才会实际的生效。同时应该注意到如果程序具有超级
用户的权限它很容易的摆脱chroot所设置的环境。它可能靠创建设备节点
来读取内核的内容,对程序在 chroot(8)
外绑定一个调试器, 或者靠其他创造性的方法来完成操作。
系统调用chroot()
的行为可以被 sysctl变量kern.chroot_allow_open_directories
的值在一定程度上控制。当此值为0时,如果有任何目录被打开 chroot()
将会返回EPERM并失败。当被置为默认值1,如果
任何目录被打开并且进程已经准备调用 chroot()
那么chroot()
将会返回EPERM并失败。对于其他的
值,对打开目录的检查会被完全的忽视。
Jail的概念在chroot()
之上作了延伸,它
靠限制超级用户的权力来创建了一个真正的"虚拟服务器"。一旦一个监
狱被设置好后整个网络必须通过特别的IP地址才能到达,在这里"超级用
户权限"的力量完全的受到限制。
当在jail中时,所有在内核中使用suser()
调用的超级用户权限的尝试都会失败。然而,一些对suser()
的调用已经被更改为新的接口suser_xxx()
。这个函数对认可或者拒绝被限制的进程去取得超级用户的权 限的行为负责。
一个在Jail环境中的超级用户进程有以下权力:
使用可信任的操作: setuid
, seteuid
, setgid
, setegid
, setgroups
, setreuid
, setregid
, setlogin
使用setrlimit
设置资源限制
编辑一些sysctl节点值 (kern.hostname)
chroot()
在 vnode 上设置标志: chflags
、 fchflags
设置 vnode 节点的属性, 如访问权限、 所有者、 所有组、 尺寸、 上次访问时间, 以及修改时间。
在互联网域上绑定特权端口 (端口号 < 1024)
Jail
是一个对于在一个安全环境中
运行一个仍有一些缺点的程序非常有用的工具。目前,IPC机制还没有被 更改到suser_xxx
以至于像MySQL之类的程序还不
能运行在jail中。在jail中超级用户的存取可能还有非常有限的含义,
但是没有途径能正确的指出"非常有限"意味着什么。
POSIX®已经发布了一个工作草案,增加了事件审计,访问控制列表, 精细特权控制,信息标签和强制访问控制。
这是一个正在进展中的工作并且是 TrustedBSD项目的重点。一些初始化的工作已经被提交到 FreeBSD-CURRENT(cap_set_proc(3))。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.