建立安全的DNS伺服器

火星人 @ 2014-03-12 , reply:0


  和其它大型軟體一樣,BIND(DNS伺服器)也因其體積龐大和功能繁雜而存在許多問題。因此針對BIND安全漏洞的系統入侵數量也在大幅度上升,最嚴重的甚至可獲取目標主機的所有遠程控制權。由於DNS伺服器主機對網路系統有著很大的影響,如何避免這些系統入侵也變得至關重要了。

  這篇短文的主旨是講述如何利用chroot()環境在RedHat Linux(或類似系統)中建立安全的BIND 8.x伺服器。本文內容主要來自於Adam Shostack和他在這方面的文章(Solaris版本)。


步驟一:軟體獲取和安裝

  請到ISC FTP站點下載BIND的最新版本(本文內容在BIND 8.x版本中經過測試)。

  到Obtuse System FTP站點下載本文必需的免費軟體:holelogd(及其它有用的工具)。該軟體用於在chroot環境中建立/dev/log套接字(socket),從而使syslogd能夠記錄named進程的日誌。OpenBSD系統的syslogd已內建了這一功能("syslogd -a /chroot/dev/log"),但Linux系統尚未實現這一功能。Holelogd軟體就是用來模仿OpenBSD的這個功能。

  按照軟體文檔安裝holelogd(通常被安裝到/usr/local/sbin)。


步驟二:構造靜態(static)的named和named-xfer二進位文件

  在編譯和安裝后,你需要構造可執行文件的靜態鏈接版本。只要對%BIND%/src/port/linux目錄下的Makefile.set文件稍加修改後即可。
  修改文件內容:

'CDEBUG= -O2 -g'

替換為:

'CDEBUG= -O2 -static'

  切換到BIND的源代碼路徑,執行"make clean"和"make"命令。在下面的步驟中將會把這些文件複製到chroot()目錄下。

  本步驟構造的靜態鏈接執行文件在運行時無需裝載動態鏈接庫。在chroot()環境中,這種「獨立」可執行文件可避免出現缺少鏈接庫文件問題。它在chroot()環境中無需任何靜態鏈接庫,可使服務配置簡單化。其它所有的網路守護進程也可以編譯和使用這種靜態鏈接版本。


步驟三:構造BIND目錄

  為chroot()環境構造BIND目錄。這個目錄將在chroot()環境中被BIND當作系統根目錄。

/dev
/etc
   /namedb
/usr
   /sbin
/var
   /run

需要複製以下文件到其下的相應子目錄中,和進行一些必要的處理:

/
   無

/etc
   複製系統/etc目錄下的named.conf文件
   複製系統/etc目錄下的localtime文件(為syslog提供正確的named日誌記錄時間)
   創建僅包含named GID的/etc/group文件

/etc/namedb
   複製系統/etc/namedb目錄下的所有「區(zone)」資料庫和文件

/dev
   mknod ./null c 1 3; chmod 666 null(請參閱相應版本的mknod命令)

/usr/sbin
   複製系統%BIND%/src/bin/named目錄和系統%BIND%/src/bin/named-xfer目錄下的named和named-xfer二進位文件(靜態鏈接版本)

/var/run
   無

  另外還可根據需要指定日誌記錄目錄(如/var/log)。


步驟四:添加named用戶和組

  在/etc/passwd和/etc/group文件中添加named用戶和組。它們是DNS伺服器運行時的UID/GID。

  此時,你可以到chroot環境中執行"chown -R named.named /etc/namedb"命令。這樣當你向系統發送中斷信號(kill -INT )時,named進程能夠保存伺服器緩存和統計信息。如果該目錄為root所有則named進程無法將輸出寫到目錄中,但不會影響named伺服器功能。另一個選擇是僅改變目錄許可權(使named用戶具有寫許可權),而屬主仍然是root。這種方法也是可行的,但必須小心設置,確保其它用戶不會修改named記錄!

*** 重要警告***
  不要用一個已存在的UID/GID(如"nobody")運行named。記住,以chroot環境中使用任何已存在的UID/GID都可能會影響到服務的安全性。必須養成在chroot環境中為每一個守護進程提供獨立的UID/GID的習慣。

步驟五:編輯啟動腳本

  Linux使用SYS V風格的init文件,所以有幾個地方都可以放置運行named的命令。(大多數情況下)最好將named初始化腳本放置到/etc/rc.d/init.d/named中。在其中你會找到有關named啟動的那一節內容。我們需要添加和修改其中的某些行。

1、在運行named前插入一行以啟動holelogd。需要向holelogd提供遠程套接字
位置的參數,它應該是在上面步驟中創建的chroot named dev目錄。命令行
內容如下:

    # Start daemons.
    echo -n "Staring holelogd: "
   daemon /usr/local/sbin/holelogd /chroot/named/dev/log
   echo
    echo -n "Starting named: "
    daemon named
    echo
    touch /var/lock/subsys/named
    ;;

2、另外還需要修改BIND的啟動參數。BIND 8.x版本允許指定運行用戶ID和組ID,
它也應該是在上面步驟中特別創建的UID/GID:

    # Start daemons.
    echo -n "Staring holelogd: "
    daemon /usr/local/sbin/holelogd /chroot/named/dev/log
    echo
    echo -n "Starting named: "
   daemon /chroot/named/usr/sbin/named -u named -g named -t /chroot/named
    echo
    touch /var/lock/subsys/named
    ;;

3、named附帶的"ndc"腳本可用於控制named的工作。需要編輯這個文件以將PID
文件位置從/var/run/named.pid修改為/chroot/named/var/run/named.pid。


步驟六:伺服器測試

  輸入如下命令啟動holelogd進程

   /usr/local/sbin/holelogd /chroot/named/dev/log

  進入/chroot/named/dev/目錄並輸入ls -al。應該得到與下面類似的輸出:

   srw-rw-rw- 1 root wheel 0 Jan 01 12:00 log

  設定的"s"位指示這是一個套接字(socket)文件。chroot()環境中的named進程將通過該套接字與syslog通訊。

  現在輸入:

   /chroot/named/usr/sbin/named -u named -g named -t /chroot/named

  如果一切正常,named進程將啟動,日誌文件將記錄named伺服器"Ready to answer queries."。

  進行適當的DNS測試以確保伺服器能正確工作,然後重新啟動系統並檢驗所有配置。BIND正常啟動後會報告其chroot()目錄和運行UID/GID。你可以使用lsof之類的程序列出主機中所有網路套接字進行檢查。

  當一切工作正常后,建議將/etc/namedb改名為/etc/namedb.orig或其它名字,同時chmod 000 /usr/sbin/named,這樣可以確保這些舊版本的named不會因偶然的失誤而使用。

<< 完>>

資料來源:
  ISC (Internet Software Consortium)
  Steinar Haug
  Bernhard Weisshuhn
  Marc Heuse
  Jan Gruber
  Adam Shostack
  Psionic





[火星人 via ] 建立安全的DNS伺服器已經有330次圍觀

http://www.coctec.com/docs/security/show-post-73092.html