3.5 限制你的程序环境
传统的限制进程的方法是使用系统调用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 上设置标志:
chflags
、fchflags
设置 vnode 节点的属性, 如访问权限、 所有者、 所有组、 尺寸、 上次访问时间, 以及修改时间。
在互联网域上绑定特权端口 (端口号 < 1024)
Jail
是一个对于在一个安全环境中 运行一个仍有一些缺点的程序非常有用的工具。目前,IPC机制还没有被 更改到suser_xxx
以至于像MySQL之类的程序还不 能运行在jail中。在jail中超级用户的存取可能还有非常有限的含义, 但是没有途径能正确的指出"非常有限"意味着什么。
3.5.2 POSIX®.1e 处理能力
POSIX®已经发布了一个工作草案,增加了事件审计,访问控制列表, 精细特权控制,信息标签和强制访问控制。
这是一个正在进展中的工作并且是 TrustedBSD项目的重点。一些初始化的工作已经被提交到 FreeBSD-CURRENT(cap_set_proc(3))。