天天看點

chroot apache(中文翻譯)

翻譯:山崖  (如需轉載,由你自己高興是否保留此行。)

2007年6月1日

  chroot守護程序允許你運作一個程式,使得它感覺你給它的目錄就是根(/)目錄。實際上就是把程序孤立與真正的"/"檔案系統,鎖定在一個你給它的檔案系統中(chroot囚禁)

。在這一章中我們将讨論如何安裝apache伺服器在這樣的一個環境中。   

  chroot囚禁安裝apache并不會跟apache自身帶來什麼安全。當然,把apache及其子程序限制在一個特定的檔案系統中對防止入侵者非常有利。但是,這也有其潛在的問題。

  是以在你決定是否需要chroot你的web伺服器之前,你應該考慮下這樣安裝的利與弊。

優點:

如果apache被入侵者攻克,那麼他隻能通路到chroot中的檔案。

具有潛在威脅的CGI腳本不能通路你chroot之外的檔案系統。

你web目錄中的内容在一特定的區域,很容易備份或是删除。

缺點:

  chroot安裝跟傳統的安裝方法比較起來困難很多,特别是當你運作一些諸如:perl,php,mysql或python等外部軟體的時候。

如果你的整個WEB目錄在單一的檔案系統中,那麼程序僅僅是能運作.

(譯注:我也不明白這句話什麼意思,可能作者的意思是在性能上會有所下降.)

編譯安裝apache二進制檔案

  在安裝apache為chroot之前我們并沒有什麼特别的步驟。下面的安裝步驟适用于預編譯包(像RPM)的安裝或是你自己編譯安裝。良好的開始有助于以後的調試工作。你僅需要确

定你的伺服器使用的是最新的更新檔包。正常安裝apache,并且确定它跟你預想的一樣正常運作着。

   最後,确定你以配置apache運作在它自己的使用者ID群組ID之上。用下面的指令建立使用者群組。

# groupadd apache

# useradd -c "Apache Server" -d /dev/null -g apache -s /bin/false apache

以上指令建立了一個叫apache的普通使用者和一個apache使用者組。預設情況下apache運作于nobody使用者。可能有很多守護程序在使用nobody,如果該帳号被入侵者獲得,那麼他就得

到了運作于該UID下所有守護程序的通路權限。

  建立chroot目錄樹

chroot囚禁其實就是一個最小化的LINUX檔案系統。我更喜歡單獨給它分一個區,然後挂載為/chroot,然後在我的chroot分區中為apache建立一個名為httpd的目錄。

# mkdir /chroot/httpd

# mkdir /chroot/httpd/dev

# mkdir /chroot/httpd/lib

# mkdir /chroot/httpd/etc

# mkdir -p /chroot/httpd/usr/sbin

# mkdir /chroot/httpd/usr/lib

# mkdir /chroot/httpd/usr/libexec

# mkdir -p /chroot/httpd/var/run

# mkdir -p /chroot/httpd/var/log/apache

# mkdir -p /chroot/httpd/home/httpd

現在為目錄結構設定權限:

# chown -R root /chroot/httpd

# chmod -R 0755 /chroot/httpd

# chmod 750 /chroot/httpd/var/log/apache/

一但你建立了這些必需的目錄後,你還應該再建立一個NULL裝置.

# mknod  /chroot/httpd/dev/null c 1 3

# chown root.sys /chroot/httpd/dev/null (譯注:原文如此,不清楚這裡為什麼不是chown 0.0)

# chmod 666 /chroot/httpd/dev/null

  你必需建立NULL裝置和/chroot/httpd/var/log/httpd/,因為當你運作chroot,apache就會把/chroot/httpd目錄當成"/".這句話的意思是,它将不能通路正常檔案系統下

的/dev/null 或是/var/log.

copy必需的檔案

  現在關閉apache,運作 killall httpd,然後你可以開始copy檔案了.他們的目錄可能不同,取決于當初你是如何安裝apache的.首先,copy配置檔案:

# cp -r /etc/apache /chroot/httpd/etc/

  接着,copy apache主目錄和CGI腳本目錄:

# cp -r /home/httpd/html /chroot/httpd/home/httpd/

# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd/

  然後從/usr/sbin/下copy你的httpd檔案(和apache腳本,如果使用他們)

# cp /usr/sbin/httpd /chroot/usr/sbin/

# cp /usr/sbin/apache* /chroot/usr/sbin/

  如果使用mod_ssl,你還需要copy /etc/ssl目錄:

# cp -a /etc/ssl /chroot/httpd/etc/

  完成拷貝apache(和ssl,如果你需要),你還必需copy apache依賴運作的所有共享庫,為了找出你需要copy的檔案,執行:# ldd /chroot/httpd/usr/sbin/httpd.輸出應該類似于:

        /lib/libsafe.so.2 => /lib/libsafe.so.2 (0x40017000)

        libm.so.6 => /lib/libm.so.6 (0x40037000)

        libcrypt.so.1 => /lib/libcrypt.so.1 (0x40059000)

        libdb.so.2 => /lib/libdb.so.2 (0x40086000)

        libexpat.so.0 => /usr/lib/libexpat.so.0 (0x40096000)

        libdl.so.2 => /lib/libdl.so.2 (0x400b6000)

        libc.so.6 => /lib/libc.so.6 (0x400b9000)

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

首先應該弄清楚以上輸出這些檔案的互相依賴關系,然後copy它們到各自的目錄.

# cp /lib/libsafe* /chroot/httpd/lib/

# cp /lib/libm* /chroot/httpd/lib/

# cp /lib/libcrypt* /chroot/httpd/lib/

# cp /lib/libdb* /chroot/httpd/lib/

# cp /usr/lib/libexpat* /chroot/httpd/usr/lib/

# cp /lib/libdl* /chroot/httpd/lib/

# cp /lib/libc* /chroot/httpd/lib/

# cp /lib/ld-* /chroot/httpd/lib/

你還要需要一些提供标準網絡功能的庫檔案.

# cp /lib/libnss_compat* /chroot/httpd/lib/

# cp /lib/libnss_dns* /chroot/httpd/lib/

# cp /lib/libnss_files* /chroot/httpd/lib/

# cp /lib/libnsl* /chroot/httpd/lib/

/chroot/httpd/etc 配置檔案

為了讓apache工作起來,可能還要在/etc下配置幾個檔案.首先,編輯/etc/pass和/etc/group檔案,這兩個檔案僅應該有你之前建立的使用者群組.例如:

/etc/passwd:

apache:x:12347:12348:Apache Server:/dev/null:/bin/false

/etc/group:

apache:x:12347:

你還要再編輯幾個網絡配置檔案:

# cp /etc/hosts /chroot/httpd/etc/

# cp /etc/host.conf /chroot/httpd/etc/

# cp /etc/resolv.conf /chroot/httpd/etc/

# cp /etc/nsswitch.conf /chroot/httpd/etc/

為了得到更多的安全,你還可以對這些檔案加"i"标志位,當設定了"i"标志位後,隻有root使用者去掉标志位,檔案才可修改.那麼當入侵者想要修改這些檔案,他們還必需付出更多的努

# chattr +i /chroot/httpd/etc/hosts

# chattr +i /chroot/httpd/etc/host.conf

# chattr +i /chroot/httpd/etc/resolv.conf

# chattr +i /chroot/httpd/etc/nsswitch.conf

# chattr +i /chroot/httpd/etc/passwd

# chattr +i /chroot/httpd/etc/group

為了讓日志檔案的時間正确,你還得檢查/etc/localtime.localtime檔案是否連接配接到/usr/share/zoneinfo檔案.運作ls -l /etc/localtime找出是哪個檔案.然後copy它

到/chroot/httpd/etc/localtime.

預設,syslogd守護程序僅監視/var/log日志檔案,而chroot後的httpd守護程序會把日志寫入/chroot/httpd/var/log.是以,你還需要告訴syslogd守護程序也監視這個目錄.編輯你的

啟動腳本/etc/rc.d/rc.syslog 或是 /etc/rc.d/init.d/syslog檔案.

打開 /etc/rc.d/rc.syslog 檔案

修改: daemon syslogd -m 0

為: daemon syslogd -m 0 -a /chroot/httpd/dev/log

修改:  echo -n " /usr/sbin/syslogd"

    /usr/sbin/syslogd

為:

    echo -n " /usr/sbin/syslogd"

    /usr/sbin/syslogd -m 0 -a /chroot/httpd/dev/log

(譯注:這好像是slackware,如果你是其他的發行版,請自行參考管理者手冊)

在建立日志檔案後給它們加上"a"标志位,是一個不錯的主意

# touch /chroot/httpd/var/log/apache/access_log

# touch /chroot/httpd/var/log/apache/error_log

# chmod 600 /chroot/httpd/var/log/apache/*

# chattr +a /chroot/httpd/var/log/apache/*

最後,修改httpd啟動腳本讓它運作chroot後的httpd.打開/etc/rc.d/rc.httpd或者/etc/rc.d/init.d/httpd檔案,修改指令讓httpd守護程序運作.

/usr/sbin/chroot  /chroot/httpd/  /usr/sbin/httpd.

測試伺服器

關閉HTTPD守護程序,然後重新開機syslog: /etc/rc.d/rc.syslog restart(或 /etc/rc.d/init.d/syslog restart).

好了,現在可以啟動以經chroot後的apache了.

/etc/rc.d/rc.httpd start (或 /etc/rc.d/init.d/httpd start).

如果沒有發現錯誤,那麼運作指令ps -aux |grep httpd 檢查守護程序是否在運作.

如果你看到有輸出,那麼表示apache以經運作.記錄下ps指令輸出的程序号,然後運作

ls -l /proc/PROC_NUMBER/root/ 顯示的是你的/chroot/httpd目錄 而不是你伺服器的"/"檔案目錄。

(譯注:其實我認為運作ls -l /proc/PROC_NUMBER/ 的輸出更直覺一點.因為你直接就看到了諸如: root -> /chroot/httpd的輸出)

一旦所有的工作都完成,你就可以删除你原來安裝的apache了.

  總結:雖然chroot有助于建立一個更安全的環境,但它也并不是完美的.你仍需要保證你的 web伺服器的更新檔包是最新的并經常檢視日志檔案.當然,一旦系統出現未知的漏洞,營造web伺服器的chroot環境更有助于你控制入侵者,保護你系統中的主檔案系統.

---------------------------------------------------------------------------------------------------------------------------

譯者注:就如原作者所說的那樣,chroot隻能在一定的基礎上保證整個系統的安全,為了防範諸如SQL注入類的攻擊,正确配置apache仍是極其重要的。除了文中介紹嚴格的目錄、CGI腳本權限,健全的日志等之外,編譯并合理配置mod_security子產品,是一個不錯的選擇。相關的文章請網上搜尋,因本人水準有限,本翻譯文檔僅供參考,不當之處還請大家斧正。