用 SSL 構建一個安全的 Apache 來源:quack
一、簡介

這篇文章要說明的是如何將 Apache 與 SSL(Secure Socket Layer) 結合起來安裝
配置。眾所周知,在網路上以明文傳遞敏感訊息是相當不安全的,因此 SSL 提供
了一種加密手段,在底層上為上層協議提供服務和加密方案,因此當用戶在以 HTTP
協議傳輸資料時,窺探者將難以獲取資料的訊息。當然加密只是在傳輸過程中的,
對用戶是完全透明的。那就開始吧……


二、準備工作

如果你的系統是從頭裝起的話,建議你留一個叫 /chroot 的分區用來執行 Apache。
至這個分區的大小,取決你自已,一般來說,一個普通的網站有 40M 也就夠了。
但你的系統如果早就執行了 Apache,你可以另外開辟一個分區,或者選擇不用獨立
分區來安裝,僅僅在根下面開一個目錄。

另外我假定你的系統已經通過了一定的安全檢測在安裝 Apache 之前(如果有其它
漏洞存在的話,你認為執行在其上的 Apache 會怎樣,所謂覆巢之下,焉有完卵,
檢測至少要包括(但不僅限)移除不安全的 SUID 程式、升級某些防護程式,去掉不
必要的服務。還假定你是的 WEB SERVER 是執行 TCP/IP 而且有自己的地址。


三、平台

以下測試都在下列平台下通過: 

1、Slackware 4.x distribution using gcc 2.7.2.3 and Perl v5.005_02

2、Solaris 7 on Sparc using gcc v2.8.1 and Perl v5.005_03 


四、獲取所需要的軟體

Apache 並沒有包含自己 SSL,因此我們必須先下載這些加密網頁所必需的部份:

1、Apache Web Server - http://www.apache.org/dist/

不必多說,我們當然需要獲得這個 web server,現在的版本是 1.3.11,Apache
是現在世界上使用最廣泛的 web @server。

2、mod_ssl - http://www.modssl.org

這是一個為 Apache1.3.x 提供強力加密的的軟體模組,它使用的是 SSL v2 和 v3
以及 TLS(Transport Layer Security) v1。在非商業下,你可以自由地使用它,
該用哪一版本的 mod_ssl,如果是 1.3.11 的 Apache,那就 2.50-1.3.11 的 mod_ssl。

3、mod_perl - http://perl.apache.org/dist/

4、Open SSL - http://www.openssl.org

這軟體提供了 SSL v2/v3 及 TLS v1 協議的加密保護。

5、RSAref - 用搜索引擎查找一下 "rsaref20.tar.Z" 應該就能找到了

我們將把這些程式安裝 /usr/local 目錄下 


五、軟體的安裝

在實際安裝前我們要決定我們將把 web server 安裝在什環境下,對一個對
安全有相當高要求的人來說,可以將伺服器和軟體安裝 chroot 環境,chroot
改變 root 目錄並且僅在這一目錄中執行程式,這提供了一個內建的小環境,即
使入侵者已經通過 cgi 程式或者其它辦法通過 80 埠獲得了系統的進入權限,它
也只能夠在這一受限的環境中活動,從安全角度考量,這當然是最好的,但對
系統管理員來說,這樣安裝相對麻煩一些,還必須把一些必要的庫,perl 以及
相關工具也搬到 chroot 中,這裡我們介紹的是在 chroot 下安裝。

展開這些軟體:

#gzip -d -c apache_1.3.11.tar.gz | tar xvf -
#gzip -d -c mod_ssl-2.5.0-1.3.11.tar.gz | tar xvf -
#gzip -d -c openssl-0.9.4.tar.gz | tar xvf -
#gzip -d -c mod_perl-1.21.tar.gz | tar xvf -


展開並且編譯 rsaref

#mkdir rsaref
#cd rsaref
#gzip -d -c ../rsaref20.tar.Z | tar xvf -
#tar xvf rsaref.tar
#cp -rp install/unix temp
#cd temp
#make
#mv rsaref.a librsaref.a
#cd ../../


編譯 OpenSSL

#cd openssl-0.9.4
#perl util/perlpath.pl /usr/bin/perl (Path to Perl)
#./config -L`pwd`/../rsaref/temp/
#make
#make test
#cd ..


將 mod_perl 加到 Apache 的編譯選項裡

#cd mod_perl-1.21
#perl Makefile.PL APACHE_PREFIX=/usr/local/apache \

APACHE_SRC=../apache_1.3.11/src \

USE_APACI=1

你會得到下面的提示:

Configure mod_perl with ../apache_1.3.11/src ? [y]

直接按 enter 就是預設的 yes

然 Makefile 會問你是否建立 httpd,可以用 n 選擇不。

#make
#make install
#cd ..

將 mod_ssl 加到 Apache 中

#cd mod_ssl-2.5.0-1.3.11
#./configure --with-apache=../apache_1.3.11 \

--prefix=/usr/local/apache \

--with-ssl=../openssl-0.9.4 \

--with-rsa=../rsaref/temp \

--activate-module=src/modules/perl/libperl.a
#cd ..


編譯 Apache:

#cd apache_1.3.11

在編譯前我們可以再編輯 http server 版本的文件,使入侵者摸不著腦袋長哪兒:)

# src/include/httpd.h

尋找下面這行,並且改變 server 的名字及版本可以隨便用你想改成的東西。

define SERVER_BASEVERSION "Apache/1.3.11"

現在你可以編譯 Apache 了

#make

現在你可以生成一個 CA 了(actual certificate).

#make certificate

按照該授權書的安裝介紹做。

#make install

這將會把 Apache 裝在 /usr/local/apache。

測試 web server (還沒裝 SSL) 是否執行正常啟動 web server:

/usr/local/apache/bin/apachectl start

當 WEB 伺服器執行起來,你可以用 lynx 或者任意什瀏覽器連接你的 80 埠,
如果能看到 apache 的歡迎頁,就 OK 了。

停止 server:

/usr/local/apache/bin/apachectl stop

測試 web server (同時起用 SSL) 啟動帶 SSL 的 WEB 伺服器

/usr/local/apache/bin/apachectl startssl

執行時你用 Netscape 或者其它支援 SSL 的瀏覽器來看 https://your.ip.here,
看到歡迎頁了?

要停止 SERVER:

/usr/local/apache/bin/apachectl stop


六、 Apache 的配置

現在我們可以來看看 Apache 的配置文件了需要記住的是如果你對它做了更改,
在未重新啟動 httpd 防護程式前,它是不會發生作用的。現在我們可以進目錄
/usr/local/apache/conf 看看了。

httpd.conf -
這是 Apache 的主要配置文件,你可以在這裡設定伺服器啟動時的基本環境,
比如伺服器的啟動方式、埠號、允許的最多連接數等,這一文件的注釋非常詳細,
要看明白應該沒什問題。

access.conf -
這文件是設定系統中的存取方式和環境,但現在已經可以在 httpd.conf 中設定了,
所以推薦你別動它。

srm.conf - 
這主要做的是資源上的設定,僅僅設定 httpd.conf 中的相關項。

現在重啟 web server 來使改動生效:

#/usr/local/apache/bin/apachectl restart


七、將 Apache 設定在 chroot 環境下

現在我們開始把剛才建立的東西移到 chroot 環境下包括 Apache 伺服器以及所有需
要的檔案。當然如前面所說的,這部份是可選的,如果你怕麻煩的話就算了,但轉移
可以對你的 web server 多一個可靠的保護。

建立 /chroot 目錄

#mkdir /chroot

建立一些必需的子目錄

#mkdir /chroot/dev
#mkdir /chroot/lib
#mkdir /chroot/etc
#mkdir /chroot/bin
#mkdir /chroot/usr
#mkdir /chroot/usr/local

在我們的 chroot 建立 /dev/null

#mknod -m 666 /chroot/dev/null c 1 3

將 Apache 拷貝到 /chroot 目錄中

#cp -rp /usr/local/apache/ /chroot/usr/local

拷貝必需的二進制文件

#cp /bin/sh /chroot/bin

確定哪些檔案是必需的這取決你編譯時內建了哪些模組

#ldd /usr/local/apache/bin/httpd

將需要的檔案拷貝到 chroot 目錄

#cp /lib/libm.* /chroot/lib/
#cp /lib/libgdbm.* /chroot/lib
#cp /lib/libdb.* /chroot/lib
#cp /lib/libdl.* /chroot/lib
#cp /lib/libc.* /chroot/lib

拷貝網路連接所需要的函數庫

#cp /lib/libnss* /chroot/lib

拷貝必需的 /etc 下的文件到 chroot

#cp /etc/passwd /chroot/etc
#cp /etc/shadow /chroot/etc
#cp /etc/group /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/hosts /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/ld.so.* /chroot/etc

測試 chroot 下的 Apache 

#chroot /chroot /usr/local/apache/bin/apachectl start

現在再

#chroot /chroot /usr/local/apache/bin/apachectl stop

伺服器就停下來了,如果不行的話,再次確認所有需要的檔案都拷到了 /chroot/lib
下了,如果仍然無幫助的話,或者可以以 strace 方式執行 httpd,它的輸出可能會
有一些有價值的內容可以幫助確定是遺失了哪些檔案或者二進制文件。

預設情況下 Apache 是以 nobody 用戶及用戶組執行的,不要更改它。

在 passwd\shadow\group 等文件中包含了大量系統訊息,所以你可以替換掉它們。

建立一個用戶名為 httpd,UID 為 80
建立一個組名為 httpd,GID 為 80

用下面的命令來將 /chroot 下的 passwd, shadow, group 替換掉

#echo "httpd:x:80:100:,,,:/home/httpd:/bin/false" > /chroot/etc/passwd
#echo "httpd:*LK*:11010:0:99999:7:::" > /chroot/etc/shadow
#echo "httpd:x:80:" > /chroot/etc/group

設定好文件的許可權限

#chmod 600 /chroot/etc/passwd shadow group

現在我們可以編輯 apache 的配置文件並進行需要的配置,文件在
 /chroot/usr/local/apache/conf/httpd.conf
尋找到包含 apache 執行用戶的行並改變它,當然是改成 httpd/httpd。

一切執行正常我們可以刪除前面的那些伺服器安裝的東西 /usr/local 下的,
包括伺服器以及那些內建的模組等等。

#rm -rf /usr/local/apache
#rm -rf /usr/local/mod_ssl-2.5.0-1.3.11/
#rm -rf /usr/local/mod_perl-1.21/
#rm -rf /usr/local/openssl-0.9.4/
#rm -rf /usr/local/rsaref

如果以還想改變它們的配置,增加新的模組,那將原先的 apache 留下來也行。

將 Apache 設定為在開機時自啟動,修改 /etc/rc.d/rc.local 並且加入以下行:

echo "Starting Apache-SSL"
/usr/sbin/chroot/apache/bin/apachectl startssl

如果一切都執行正常的話,你已經成功地執行了帶 SSL 支援的 Apache 了,
這會使你的 web server 更加安全。

小恐龍工作坊 提供