翻譯:山崖 (如需轉載,由你自己高興是否保留此行。)
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子產品,是一個不錯的選擇。相關的文章請網上搜尋,因本人水準有限,本翻譯文檔僅供參考,不當之處還請大家斧正。