当前位置:操作系统 > Unix/Linux >>

如何以jail(8)提升FreeBSD系統安全

Tai-hwa Liang

  Multimedia Laboratory, Dept. of Computer Science & Engineering

  Yuan 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/bind

  2. 建立基本系靳所需的目?:

  # 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/run

  3. 妖氧/建立必需?案:

  # 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/lib

  6. 妖氧 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/namedb

  7. 建立 jail ?境??? /home/bind/etc/rc,用??理一些 jail ?境?

  初始化的?作,比方真?? syslogd 陪 named:

  /home/bind/etc/rc ?容(?考 /etc/rc):

  #! /bin/sh

  trap : 2

  trap : 3 # shouldn't be needed

  HOME=/

  PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin

  export HOME PATH

  if [ ! -h /dev/log ]; then

  ln -sf /var/run/log /dev/log

  fi

  rm -f /var/run/log

  syslogd -ss

  named -u bind -g bind

  exit 0

  8. 建立一? /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 -i

  97 ?? Ss 0:00.17 syslogd -s

  103 ?? SsJ 0:00.12 syslogd -ss

  105 ?? SsJ 0:02.49 named -u bind -g bind

  125 ?? Is 0:00.01 inetd -wW

  127 ?? 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_allowed

  jail.socket_unixiproute_only

  jail.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 上跑咿??月了,用起??啥大
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,