本部分重點介紹如何防止 Apache 被用作入侵其託管系統的入口點。Apache 默認以非 root 用戶身份運行,這將限制以本地 shell 的普通用戶身份可以造成的任何損害。當然,允許相當於匿名訪客帳戶的做法遠遠達不到大多數 Apache 服務器的安全要求,因此可以採取額外步驟 - 即在 chroot 監獄中運行 Apache。
chroot 監獄的主要優點是,監獄會將守護進程可以查看的文件系統部分限制為監獄的根目錄。此外,由於監獄只需要支持 Apache,因此監獄中可用的程序可以非常有限。最重要的是,不需要 setuid-root 程序,這些程序可用於獲得 root 訪問權限並逃脫監獄。
對 Apache 進行 chroot 並非易事,並且容易導致問題。在我們開始執行此操作之前,我們需要首先決定這樣做是否對您有利。有一些優缺點,但肯定不僅限於以下幾點
下面列出的 chroot 配置假設您已使用外部程序 mod_ssl 編譯了 Apache 服務器。您已使用 Apache Web 服務器編譯的內容的差異在於您需要複製到 chroot 目錄中的庫和二進制文件。
: 請記住,如果您已編譯 Apache 以使用 mod_perl,則必須將所有相關的二進制文件和 Perl 庫複製到 chroot 目錄。Perl 位於/usr/lib/perl5如果您使用 Perl 功能,請將 Perl 目錄複製到/chroot/httpd/usr/lib/perl5/。不要忘記創建目錄/chroot/httpd/usr/lib/perl5在複製之前,在您的 chroot 結構中。
以下是在 chroot 監獄中運行 Apache Web 服務器的必要步驟
我們必須找到 httpd 的共享庫依賴項。這些稍後需要複製到 chroot 監獄中。要查找 httpd 的共享庫依賴項,請執行以下命令
[root@deep ]/# ldd /usr/sbin/httpd |
libpam.so.0 =>/lib/libpam.so.0 (0x40016000) libm.so.6 =>/lib/libm.so.6 (0x4001f000) libdl.so.2 =>/lib/libdl.so.2 (0x4003b000) libcrypt.so.1 =>/lib/libcrypt.so.1 (0x4003e000) libnsl.so.1 =>/lib/libnsl.so.1 (0x4006b000) libresolv.so.2 =>/lib/libresolv.so.2 (0x40081000) libdb.so.3 =>/lib/libdb.so.3 (0x40090000) libc.so.6 =>/lib/libc.so.6 (0x400cb000) /lib/ld-linux.so.2 =>/lib/ld-linux.so.2 (0x40000000) |
如果尚未完成運行 Apache httpd 的操作,請添加新的 UID 和新的 GID。這很重要,因為以 root 身份運行它會破壞監獄的目的,並且使用系統上已存在的不同 UID (即nobody)可能會允許您的服務訪問彼此的資源。考慮一下 Web 服務器以nobody或任何其他過度使用的 UID/GID 運行並被入侵的情況。攻擊者現在可以從 chroot 內部訪問任何其他以 nobody 身份運行的進程。
這些是示例 UID/GID。檢查/etc/passwd和/etc/group文件以查找空閒的 UID/GID 號碼。在我們的配置中,我們將使用數值80和 UID/GIDwww.
[root@deep ]/# useradd -c "Apache Server" -u 80 -s /bin/false -r -d /home/httpd www 2>/dev/null || : |
設置 chroot 環境。首先,我們需要創建 chroot 的 Apache 結構。我們使用/chroot/httpd作為 chroot 的 Apache。/chroot/httpd僅僅是不同分區上的目錄,我們決定將 Apache 放在那裡以提高安全性。
[root@deep ]/# /etc/rc.d/init.d/httpd stop |
Shutting down http: [ OK ] |
[root@deep ]/# mkdir /chroot/httpd |
接下來,按如下所示創建其餘目錄
[root@deep ]/# mkdir /chroot/httpd/dev [root@deep ]/# mkdir /chroot/httpd/lib [root@deep ]/# mkdir /chroot/httpd/etc [root@deep ]/# mkdir -p /chroot/httpd/usr/sbin [root@deep ]/# mkdir -p /chroot/httpd/var/run [root@deep ]/# mkdir -p /chroot/httpd/var/log/httpd [root@deep ]/# chmod 750 /chroot/httpd/var/log/httpd/ [root@deep ]/# mkdir -p /chroot/httpd/home/httpd |
將主配置文件目錄、配置文件、cgi-bin 目錄、根目錄和 httpd 程序複製到 chroot 監獄:[root@deep ]/# cp -r /etc/httpd /chroot/httpd/etc/ [root@deep ]/# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd/ [root@deep ]/# cp -r /home/httpd/your-DocumentRoot /chroot/httpd/home/httpd/ [root@deep ]/# mknod /chroot/httpd/dev/null c 1 3 [root@deep ]/# chmod 666 /chroot/httpd/dev/null [root@deep ]/# cp /usr/sbin/httpd /chroot/httpd/usr/sbin/ 我們需要/chroot/httpd/etc, /chroot/httpd/dev, /chroot/httpd/lib, /chroot/httpd/usr/sbin /chroot/httpd/var/run, /chroot/httpd/home/httpd和/chroot/httpd/var/log/httpd目錄,因為從 chroot 的角度來看,我們位於/.
如果您已使用 SSL 支持編譯了 Apache Web 服務器,則必須將處理所有私鑰和公鑰的整個/etc/ssl目錄複製到 chroot 監獄。
[root@deep ]/# cp -r /etc/ssl /chroot/httpd/etc/ � require only if you use mod_ssl feature. [root@deep ]/# chmod 600 /chroot/httpd/etc/ssl/certs/ca.crt � require only if you use mod_ssl feature. [root@deep ]/# chmod 600 /chroot/httpd//etc/ssl/certs/server.crt � require only if you use mod_ssl feature. [root@deep ]/# chmod 600 /chroot/httpd/etc/ssl/private/ca.key � require only if you use mod_ssl feature. [root@deep ]/# chmod 600 /chroot/httpd/etc/ssl/private/server.key � require only if you use mod_ssl feature. |