[ 安裝心得 ] 如何設定 named 的 chroot ﹖


作者﹕網中人 <netman@study-area.org>
------------- 前言﹕ 網路越來越不安全了﹗這不是什麼危言聳聽了吧﹖ 不知道什麼時候起﹐入侵者(我這裡不使用“駭客”這詞)竟然對 DNS 服務程式 bind 起了興趣﹐ 去年的 lion worm 就是一件非常惡劣的例子。在可見的將來﹐ 我也相信越來越多入侵者會無所不用其極的嘗試利用這個全球最通用的協定進行入侵。 下面的方法﹐並不是教您如何杜絕 bind 的安全漏洞﹐ 而僅是教您萬一真的被人利用 bind 入侵的時候﹐如何儘量降低其危害程度而已。 所使用的方法﹐就是所謂的 chroot jail ﹔也就是為 named 打造一個局限的環境。 ------------- 測試環境﹕ RedHat 7.2 ------------- 設定步驟﹕ 1) 先關閉 named 服務﹕ service named stop 2) 備份 named 目錄﹕ cd /var cp -a named named.bak 3) 重建 named 環境﹕ rm -rf /var/named/* cd /var/named mkdir -p dev etc usr/sbin var/named var/run/named /var/lock/subsys chown -R named.named /var/named/ chmod -R g+s /var/named/ cp -a /usr/sbin/named* usr/sbin/ cp -a /usr/sbin/dns* usr/sbin/ cp -a /usr/sbin/lwresd usr/sbin/ cp -a /usr/sbin/rndc usr/sbin/ cp -a /etc/named.conf etc/ rm -f /etc/named.conf ln -s /var/named/etc/named.conf /etc/named.conf cp -a /etc/localtime etc/ cp -a /etc/rndc.* etc/ cp -a /var/named.bak/* var/named/ cd dev/ mknod -m 0666 null c 1 3 mknod -m 0644 urandom c 1 9 ln -s urandom random 4) 準備好 named 所需的函式庫﹐您可以透過如下的 script 來完成﹕ #!/bin/bash NAMED_DIR=/var/named get_lib=$(ldd $(which named) | cut -d ' ' -f 3) for i in $get_lib; do if [ ! -z "$(echo $(ls -l $i) | grep '^l')" ]; then test_lib=${i%/*}/$(ls -l $i | awk '{print $11}') fi ln_lib="$ln_lib $test_lib" done req_lib="$get_lib $ln_lib" for i in $req_lib; do TARGET=${NAMED_DIR}${i%/*} if [ ! -d $TARGET ]; then mkdir -p $TARGET fi cp -a $i $TARGET done #--- end of script --# 我將之命名為 get_named_lib ﹐然後執行﹕ sh get_named_lib 5) 修改 syslog DAEMON﹕ cp /etc/rc.d/init.d/syslog /etc/rc.d/init.d/syslog.bak vi /etc/rc.d/init.d/syslog --> 在 RETVAL 句子下面新增一行﹐結果如下﹕ RETVAL=0 SYSLOGD_OPTIONS="$SYSLOGD_OPTIONS -a /var/named/dev/log" service syslog restart ls /var/named/dev/log # 以確定有成功建立起 log 這個 socket 6) 修改 named DAEMON﹕ cp /etc/rc.d/init.d/named /etc/rc.d/init.d/named.bak vi /etc/rc.d/init.d/named --> 修改 prog 變數﹐及新增一行設定﹐結果如下﹕ RETVAL=0 prog="/var/named/bin/named" ROOTDIR=/var/named service named restart # 建議執行兩遍 tail -20 /var/log/messages # 以確定沒任何錯誤信息 ------------- 檢視成果﹕ 只要使用 dig 或 nslookup 等查詢程式就可以了﹐如﹕ dig @127.0.0.1 soa your.domain.name 在 /var/named/etc/named.conf 和 /var/named/var/named/* 裡嘗試新增(或修改)一些記錄﹐ 再來重複測試。 ------------- 一些注意﹕ * 確定 named 這個帳號已經存在﹐並且其 home dir 為 /var/named 。 * 確定 named 所需的程式和函式庫都正確的複製到指定目錄。 * 確定正確的修改 named 和 syslog 這兩個 daemon 。 * 我不清楚那兩個 mknod 是做什麼用的﹐所以不必問我了。 * 我也不確定 /etc/localtime 是否必要﹐如果有問題不妨告訴我。 ------------- 後記﹕ 大家都知道﹕一個系統提供的服務越多﹐那麼遭到入侵的機會就越高。 因為系統有提供服務就會讓入侵者有機可乘﹐所以請關閉所有不必要的服務程式﹐ 包括目前介紹的 named 服務﹐如果覺得沒必要向外提供﹐那就取消它吧。 如何增加系統的安全性﹐是一個非常大的題目﹐ 這篇文章只是眾多安全設定之一而已﹐ 任何一個疏忽﹐都可能導致整個安全防禦的崩潰。 ------------- 最後更新日期﹕ 2002/06/06