29.17. Apache chroot 監獄

本部分重點介紹如何防止 Apache 被用作入侵其託管系統的入口點。Apache 默認以非 root 用戶身份運行,這將限制以本地 shell 的普通用戶身份可以造成的任何損害。當然,允許相當於匿名訪客帳戶的做法遠遠達不到大多數 Apache 服務器的安全要求,因此可以採取額外步驟 - 即在 chroot 監獄中運行 Apache。

chroot 監獄的主要優點是,監獄會將守護進程可以查看的文件系統部分限制為監獄的根目錄。此外,由於監獄只需要支持 Apache,因此監獄中可用的程序可以非常有限。最重要的是,不需要 setuid-root 程序,這些程序可用於獲得 root 訪問權限並逃脫監獄。

Proxy Netscape Configuration

對 Apache 進行 chroot 並非易事,並且容易導致問題。在我們開始執行此操作之前,我們需要首先決定這樣做是否對您有利。有一些優缺點,但肯定不僅限於以下幾點

下面列出的 chroot 配置假設您已使用外部程序 mod_ssl 編譯了 Apache 服務器。您已使用 Apache Web 服務器編譯的內容的差異在於您需要複製到 chroot 目錄中的庫和二進制文件。

Important: 請記住,如果您已編譯 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 身份運行它會破壞監獄的目的,並且使用系統上已存在的不同 UIDnobody)可能會允許您的服務訪問彼此的資源。考慮一下 Web 服務器以nobody或任何其他過度使用的 UID/GID 運行並被入侵的情況。攻擊者現在可以從 chroot 內部訪問任何其他以 nobody 身份運行的進程。

  1. 這些是示例 UID/GID。檢查/etc/passwd/etc/group文件以查找空閒的 UID/GID 號碼。在我們的配置中,我們將使用數值80UID/GIDwww.
                [root@deep ]/# useradd -c "Apache Server" -u 80 -s /bin/false -r -d /home/httpd www 2>/dev/null || :
              
    上面的命令將創建組www,其數值 GID 值為80,以及用戶www,其數值 UID 值為80.

  2. 設置 chroot 環境。首先,我們需要創建 chroot 的 Apache 結構。我們使用/chroot/httpd作為 chroot 的 Apache。/chroot/httpd僅僅是不同分區上的目錄,我們決定將 Apache 放在那裡以提高安全性。
                  [root@deep ]/# /etc/rc.d/init.d/httpd stop  (1)
                

    (1)
    僅當 Apache 已安裝並在您的系統上運行時才執行此操作。
    
                Shutting down http:                                        [  OK  ]
              
                [root@deep ]/# mkdir /chroot/httpd
              

  3. 接下來,按如下所示創建其餘目錄
                [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
              

  4. 將主配置文件目錄、配置文件、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 的角度來看,我們位於/.

  5. 如果您已使用 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.