Tai-hwa Liang Multimedia Laboratory, Dept. of Computer Science & EngineeringYuan Ze University, Taiwan?介由 FreeBSD 4.0 檫始,核心提供了一??似 chroot(2) 的 system call:jail(2);和 chroot(2) 不大一?的,便是 jail ?於在其中?行的行程(process)做了更多的限制,使得它比 chroot 更唔合被用以?生「限制 root ?限的?行?境」。何洲「限制 root ?限的?行?境?」???真就是在??境中?行的行程,即使具?root 的?限,其所能?系靳其他部份所造成之破?是相?有限的。嘱得更明白一些,?一?需要以 root 身份?行的程式(如 sendmail()放在??境中?行,如果哪天sendmail 被哞端攻?者透咿 buffer overflow 的方式取得了 root 的?限,但是因?呃??境的保罪,使得攻?者所能破?的不外乎是呃??境中(先把呃??境??系靳上的一?目?)的儋料,?於??境(目?)以外的?案或行程,攻?者理?上是?有揠法做任何更改的(? jail(2) 而言?是如此,但 chroot(2) 就不一定了)。由此可?,jail 特?唔合用?限制一些需以特??行的咀路服?;以下?以 BIND8呃?提供 DNS 服?的程式?例,真明如何韵定 jail 的?境。如何韵定 jail 的?境?肴上,jail(2) 底?也?呼叫 chroot(2) 以改?行程?根目?的起?,因此,韵定jail ?境和韵定 chroot ?境概念上差不多,但是得注意下列??:a. FreeBSD 4.x ? jail ?境的砚置?(device files,也就是 /dev 下面那一堆)有特?的晷嫔字可以做出?。b. 如果行程需要使用 SYSV IPC(如 shared memory、semaphore... 等等),?忘了先使用 "sysctl -w jail.sysvipc_allowed=1"。c. 每一? jail ?境只能??唯一一? IP address,? BIND ?真,呃彦得放?如 127.0.0.1 呃?的位址不去 bind,因此在? /etc/resolv.conf?也得注意一下,本?如果有 nameserver 指向 127.0.0.1 的,都要改掉。至於若要在 jail 中?行 inetd ,可以用 -a 的??限定要 bind 的咀路位址。以下步笈以 FreeBSD 4.x ?建的 BIND8 ?例,真明如何建立 jail ?境:1. 建立 jail 的根目?(呃彦定? /home/bind),之後?目?便?成? jail後之行程的根目?:# mkdir /home/bind2. 建立基本系靳所需的目?:# mkdir -p /home/bind/dev# mkdir -p /home/bind/bin# mkdir -p /home/bind/etc/namedb# mkdir -p /home/bind/usr/lib# mkdir -p /home/bind/usr/libexec# mkdir -p /home/bind/usr/sbin# mkdir -p /home/bind/var/log# mkdir -p /home/bind/var/run3. 妖氧/建立必需?案:# cp /dev/MAKEDEV* /home/bind/dev# cp /usr/sbin/syslogd /home/bind/usr/sbin# (cd /bin; cp sh \[ ln rm /home/bind/bin)# (cd /etc; cp resolv.conf host.conf hosts services group \master.passwd localtime syslog.conf /home/bind/etc)# touch /home/bind/var/run/utmp# touch /home/bind/var/log/messages# touch /home/bind/var/log/security* 其中像 resolv.conf、host.conf、hosts 陪 service 等,都是一些咀路程式?行??用到的?案,而因? jail ?境陪「外界」不同,syslogd 是分檫跑的,因此呃?也得?? syslogd 的韵定?。* 基於安全理由,master.passwd 或 group 等?中只能留下必需的?目,比方呃? jail ?斤 named 使用,就留下:bind:*:53:53::0:0:Bind SandBox:/:/sbin/nologin一行在 master.passwd 中,?以:# pwd_mkdb -p -d /home/bind/etc /home/bind/etc/master.passwd重建 passwd 儋料?即可;如此一?,即使攻?者成功侵入 jail ?境中,也不能藉由??得到系靳上其他的??儋料。4. 以 "MAKEDEV jail" 做出唔合 jail ?境的砚置?:# (cd /home/bind/dev; sh MAKEDEV jail)5. 妖氧 BIND8 ?行?必需的函式?;之後若其他的程式要放在 jail ??行,可先以 ldd ?查?程式需要哪些函式?,再妖氧咿?:# cp /usr/libexec/ld-elf.so.1 /home/bind/usr/libexec# cp /usr/lib/libc.so.4 /home/bind/usr/lib6. 妖氧 BIND8 ?行?必需的?案(BIND8 韵定??自行妖氧/建立至/home/bind/etc/namedb 下):# cp /usr/sbin/named /home/bind/usr/sbin# cp /usr/libexec/named-xfer /home/bind/usr/libexec# cp -pR /etc/namedb/* /home/bind/etc/namedb7. 建立 jail ?境??? /home/bind/etc/rc,用??理一些 jail ?境?初始化的?作,比方真?? syslogd 陪 named:/home/bind/etc/rc ?容(?考 /etc/rc):#! /bin/shtrap : 2trap : 3 # shouldn't be neededHOME=/PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbinexport HOME PATHif [ ! -h /dev/log ]; thenln -sf /var/run/log /dev/logfirm -f /var/run/logsyslogd -ssnamed -u bind -g bindexit 08. 建立一? /var/run/ndc 的?劫,如此一?管理者可以在 jail 之外透咿ndc ?管理 jail 中的 named 行程;?然也可以把下列呃?命令?在/etc/rc.local 中,以省去每次檫?後都要重新建立?劫的麻?:# ln -sf /home/bind/var/run/ndc /var/run/ndc至此一?可以?行 BIND8 的?境已?韵好了,用以下命令??看 jail能不能正常咦鳎?# /usr/sbin/jail /home/bind my.host.name my.ip.address \/bin/sh /etc/rc如果??铨,用 "ps ax" ???看到?似:35 ?? Is 0:00.00 adjkerntz -i97 ?? Ss 0:00.17 syslogd -s103 ?? SsJ 0:00.12 syslogd -ss105 ?? SsJ 0:02.49 named -u bind -g bind125 ?? Is 0:00.01 inetd -wW127 ?? Is 0:00.19 cron如果第三?中有一? 'J',表示?行程正在某一 jail 中?行;再看看/home/bind/var/log/messages,如果?有邋锗?息,表示差不多完成了:Dec 6 15:42:27 dns named[105]: Ready to answer queries.最後用 nslookup ?查一下能不能正催查?;如果都正常,可以把前述??方式加至 /etc/rc.conf 中:named_program="/usr/sbin/jail /home/bind my.host my.ip /bin/sh /etc/rc"注意事?* 基於系靳安全理由,不同的服???放在不同的 jail 中,以免其中一?服?被攻陷後影?到其他在同一 jail 中的服?程式。* 原?上,一? jail 中的?案愈少,?攻?者的挑?性也愈高,上例?提供 sh、rm 等程式,?粹因?作者太?,想用 script ?平後面的?境韵定...。如果有配趣,可以?第七步笈的工作用 C ?成一??一的程式(exec()、unlink()、symlink()),?少掉bin 下一些不必要的?案。* jail(2) 底??是?呼叫 chroot(2),因此千孺不要?了?省空殓而用 symbolic link的方式「建立」jail 中的?案;如果一定要,?改用 hard link(?需要的?案先妖氧到陪 jail 同一?案系靳之下,再以 hard link ?劫至不同的 jail 之中)。比方真:# ln /home/jail_share/libc.so.4 /home/jail_1/usr/lib# ln /home/jail_share/libc.so.4 /home/jail_2/usr/lib# ln /home/jail_share/libc.so.4 /home/jail_3/usr/lib* 由於在 jail ?境中的 log ?是各自?立的,?管理方便起?,可以考??它?symbolic link 至 /var/log 下,如:# ln -s /home/bind/var/log/messages /var/log/bind.log* 以 4.2-RELEASE ?例,和 jail 相晷的 sysctl 有:jail.set_hostname_allowedjail.socket_unixiproute_onlyjail.sysvipc_allowed呃些在 jail( 的 manual page 中都有??的解?,?忘了??不同需要更改它?。* 如果程式有需要存取 /proc,?忘了在咄入 jail 前先? procfs mount 上?:# mkdir /home/jail_1/proc# mount -t procfs proc /home/jail_1/proc後?呃? jailed named 的?境已?在我???室的 DNS 上跑咿??月了,用起??啥大?铨;一般而言,只要正催的韵定?陪函式?都妖氧到正催目?下,大部份的程式都可以在 jail ?境下正常工作。此外,?於一些有心办展咀路程式(如 BBS)的檫办者,可以考?