Linux和Solaris建立Apache的虛擬根環境

火星人 @ 2014-03-12 , reply:0
←手機掃碼閱讀

  By 書生


介紹

??我曾經利用CERN httpd安裝和使用了已經虛擬根環境下的Web伺服器。對Web伺服器建立虛擬根環境有各種各樣的優點和缺點。在Web發展的早期階段,這種技術還提供了額外的有價值的安全機制。但是在這個apache的領域中,這種技術似乎沒有太大的用處,可它仍舊很有趣。

??我提供對apache在linux和soloris環境下實現虛擬根環境的安裝的例子,它既可以做標準的編輯(在必要的時候被標記為non-DSO)或者做動態共享對象編輯(在必要時它將被標記為DSO)。選項為DSO的Solaris的例子還沒有進行文檔化,所以我沒有測試它(我打算在測試時使用Solaris 8)。

??在Linux上安裝一個虛擬根環境化的Apache目錄樹是相當的簡單的。這個例子使用的是Red Hat 6.*和Apache 1.3.12。同時,它也包含PHP4(作為一個Apache模塊),以及在虛擬根環境化的目錄樹上的perl5的安裝。另外還安裝了mod-ssl和mod-perl。

??該例也假定Red Hat 安裝比較完整 (即:有足夠的文件、庫和開發工具)。注意,如果你安裝Red Hat時用了custom(prefered)的配置,並且選擇了development選項;或者你就是使用了伺服器(server)配置,你都會有一個完全的開發環境。

??Mysql3.22.27並沒有安裝在實現了虛擬根環境目錄樹中,但是為了完整性我們在此將它包含進去。

聲明

??我並不是個專家:),尤其在加密方面(openssl、mod-ssl和company)我的水平更是有限。我也是個普通的人,也會犯錯誤,所以,如果你發現了什麼或是有什麼建設性的意見,請告訴我。

??我寫這篇文章只是希望,你能從中學到一些東西,獲得一些幫助。我也可以經常提供一些RPM,但如果你知道你可以從草圖開始,獨立的建一個自己的現代Web網站,那恐怕會更有趣些。但是,在當前的Internet上,學習、理解關於運行一個Web網站各種問題以及所冒的風險,都要靠你自己了。

Solaris 例子
??對Web目錄樹進行虛擬根環境化的solaris的例子與Linux的例子十分相似。當然,如果你沒有安裝GNU開發環境,solaris的例子就不可能像Linux例子那樣容易。

??Solaris的例子文檔在另一個web頁中。

附加的註釋

使用工具ldd來發掘必要的共享庫。
在這個例子中,用戶有這樣的提示:
root user:
ROOT#
ordinary user:
$

我基本上都是作為普通用戶而不是root用戶來編譯和安裝各種軟體的。這有助於避免對文件系統(尤其是在使用不熟悉的軟體時)造成的不必要的破壞。這也有助於在進行危險操作前給以警示,例如在已經安裝的二進位文件上的「setuid"操作,以及在不尋常的地方安裝文件的操作等危險操作前的警示。
在這個例子中,我作為用戶soft:soft來進行編譯和安裝等操作。

其實,只要保證軟體的所有者的身份ID與Apache目錄樹用戶的ID(在本例中我們用的是888)不同就可以了。

Red Hat的預設root環境中,有一個互動式的開關-I被加在命令cp、mv和rm上。如果你的root環境中沒有這些設置,建議你最好將它加上。你可以檢查下面的文件:

ROOT# alias |grep '-i'
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

你應當使你的配置盡量的簡單——不要安裝那些用不到或根本不必要的模塊。一般說來,一個標準的non-DSO(非動態共享對象)Apache,在安裝一個perl,對大多數人都是足夠的。
關於DSO和mod-ssl需要注意的地方:
如果你打算把任何東西都按照DSO模版進行編譯,那你首先要建立mod-ssl,然後你確實要按照下面的順序建立自己的Apache目錄樹。Mod-ssl會明顯的修改Apache 建立的目錄樹,據我的經驗,在使用我們剛才提到的軟體版本的前提下,下面的順序是做起來最簡單的順序:

建立Apache
在Apache中建立和增加mod-ssl
在Apache中建立和增加php 和mod-perl。
你應該在適當的地方記錄下來你是如何編譯你的目錄樹的,以便再做時參考。(你可以將其列印出來,並加上註釋)
安裝了各種軟體之後,最終的虛擬根環境化的目錄樹有23MB,其中包含了8MB的共享庫和perl。下面是基於DSO安裝的文件的總結(以KB表示):
ROOT# pwd
/www
ROOT# du -s .
22737 .
ROOT# du -s *
6832??apache
0?? bin
1?? dev
7?? etc
6679??lib
1?? tmp
9215??usr
1?? webhome
ROOT# du -s apache /*
600?? apache /bin
3?? apache /cgi-bin
125?? apache /conf
1560??apache /htdocs
133?? apache /icons
392?? apache /include
3925??apache /libexec
64?? apache /man
29?? apache /var
ROOT# du -s usr/*
8410??usr/Local
336?? usr/bin
340?? usr/lib
128?? usr/share
1.獲得源代碼

??如果你想將一個包加入到你的虛擬根環境化的目錄樹中,那你必須獲得這個包中任何一個文件的源代碼。多數源文件都可以從相應的Linux版本的被稱為SRPMs(RPM源代碼包)的原碼光碟中獲取;當然也可從tarball文件(.tar.gz)中獲取(這種方法很適合於你的帶寬有限的情況)。

??在Red Hat 系統中你作為root用戶安裝Source:

??ROOT# rpm -i /path/to/SRPMfile.src.rpm

??然後,在/usr/src/redhat/SOURCES/目錄中提取出源代碼。

??在我們的例子中我將指出,在Internet上你可從何處獲取這些源代碼:

??軟體包????版本號????????源代碼??????????文檔信息
??Apache??? 1.3.12????www.apache.org/dist/?????www.apache.org/docs/
??MySQL????3.22.27??? www.mysql.com/downloads???www.mysql.com/documentation/
??PHP?????4.0.2?????www.php.net/downloads.php??www.php.net/docs.php
??Perl???? 5.00503??? www.cpan.org/src/?????? www.cpan.org/doc/manual/html/index.html
??mod_perl??1.24????? perl.apache.org/dist/???? perl.apache.org/#docs
??Hello.pm?????????????????????????? perl.apache.org/dist/contrib/
??mod_ssl?? 2.6.6-1.3.12 ftp://ftp.modssl.org/source/?www.modssl.org/docs/2.6/
??OpenSSL?? 0.9.5a????ftp://ftp.openssl.org/source/?www.openssl.org/support/faq.html
??RSAref???2.0??????google search????????? google search

2.步驟細節

??準備好一個虛擬根環境化后的文件系統

2.1 在任何一個地方安裝目錄樹

??注意:最好是在另一個磁碟上,或是在非系統分區上安裝,這樣可以避免別人從Web目錄樹以外建立到文件的連接,但是你可以使用symlink(例如:/www)連接來找到這棵目錄樹。

??ROOT# mkdir /export/misc/www
??ROOT# ln -s /export/misc/www /www

2.2 生成基本的目錄,bin將是usr/bin的連接

??注意: 在這些例子中(除了我直接從一般文件系統中拷貝的代碼)我都省略了前導的「/」,所以,注意不要將你的虛擬根環境化的目錄樹與真正的「/」混淆。

??在下面我將用紫紅色標記出虛擬根環境化的文件

??ROOT# cd /www
??ROOT# mkdir -p usr/bin usr/lib lib etc tmp dev webhome
??ROOT# ln -s usr/bin bin

2.3 /tmp是假定的專用perms

??ROOT# chmod 777 tmp
??ROOT# chmod +t tmp

2.4 構造特殊的裝置 dev/null

??ROOT# mknod -m 666 dev/null c 1 3

2.5 為你自己的時區設定時區信息(這裡使用的是MET)

??ROOT# mkdir -p usr/share/zoneinfo
??ROOT# cp -pi /usr/share/zoneinfo/MET usr/share/zoneinfo/
??ROOT# cd etc
??ROOT# ln -s ../usr/share/zoneinfo/MET localtime
??ROOT# cd ..

2.6 你會發現由於缺乏本地設置,perl和mod-perl多有不便,但你可以通過在實現了虛擬根環境目錄樹中安裝本地文件來克服它:

??ROOT# set |grep LANG
??LANG=en_US
??ROOT# mkdir /www/usr/share/locale
??ROOT# cp -a /usr/share/locale/en_US /www/usr/share/locale/

2.7 現在,在可以提供非常基礎的虛擬根環境化的文件系統的共享庫

??ROOT# cp -pi /lib/libtermcap.so.2 /lib/ld-linux.so.2 /lib/libc.so.6 lib/

2.8 測試你的目錄樹(Apachect1後面將要用到「cat」,但也不是必需的)

??ROOT# cp -pi /bin/ls /bin/sh /bin/cat bin/
??ROOT# chroot /www /bin/ls -l /

??lrwxrwxrwx 1 0????0?????? 7 Jan 29 09:24 bin -> usr/bin
??drwxr-xr-x 2 0????0??????1024 Jan 29 09:28 dev
??drwxr-xr-x 2 0????0??????3072 Jan 29 13:17 etc
??drwxr-xr-x 2 0????0??????1024 Jan 29 13:12 lib
??drwxrwxrwt 2 0????0??????1024 Jan 29 09:23 tmp
??drwxr-xr-x 5 0????0??????1024 Jan 29 09:23 usr
??drwxr-xr-x 2 0????0??????1024 Jan 29 10:41 webhome

2.9 你可以移動一下ls,它只是用於測試的。

??ROOT# rm bin/ls

3.準備一個用戶和名字伺服器

??下面我們生成一個運行Apache的用戶,下面是這種配置的必要的命名服務:

3.1 生成一個不存在於系統上的新的用戶,給他起一個特殊的名字和用戶ID(例如888)。

注意:對於存在真正的鑒定文件(/etc/passwd /etc/group)的user.group,這並不是必需的,完全有你決定:

??ROOT# cd /www
??ROOT# touch etc/passwd etc/group etc/shadow
??ROOT# chmod 400 etc/shadow

3.2 編輯三個文件,在這個例子中,我只是將數據再傳迴文件中:

??ROOT# echo 'www:x:888:888:Web Account:/webhome:/usr/bin/False' > etc/passwd
??ROOT# echo 'www:x:888:' > etc/group
??ROOT# echo 'www:*:10882:-1:99999:-1:-1:-1:134537804' > etc/shadow

3.3 我沒有給這個用戶login或shell,只是為了完整,編譯了一下稱為false的no-go shell。

??ROOT# echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c
??ROOT# cc -o /www/usr/bin/False /tmp/False.c

3.4 下面讓我們標記一下二進位流:

??ROOT# chmod 111 usr/bin/*

3.5 一些命名服務是必須的。但是由於glibc和命名服務轉換庫的存在,那些庫是必不可少不是那麼一目了然的。至於其中的細節,你可以使用命令「man nsswitch」來察看。儘管在我的機器上運行著網路信息服務(NIS),但我還是選擇依賴於文件和域名服務(DNS)。注意:libresolve庫也是必需的,在安裝了PHP之後,這種需求就相當明顯了。

??ROOT# cp -pi /lib/libnss_files.so.2 lib/
??ROOT# cp -pi /lib/libnss_dns.so.2 lib/

3.6 我們將需要三個文件來完成對命名服務的配置。

??這些文件的內容決定於你IP和DNS設置。在這裡我們假定web伺服器的名字是ns.mynet.home,它的IP地址是:192.168.196.2(實際上它也是我的名字伺服器)

??# ---- Contents of??etc/nsswitch.conf ----#
??passwd: files
??shadow: files
??group: files
??hosts: files dns

??# ---- Contents of??etc/resolv.conf ----#
??domain mynet.home
??## use the IP address of your naming server
??## if bind is not installed on your web server
??#nameserver 192.168.196.xxx
??## use this if your web server is a (caching) name server
??nameserver 127.0.0.1

??# ---- Contents of??etc/hosts ----#
??127.0.0.1 localhost loopback
??192.168.196.2 ns.mynet.home ns www


4.編譯和安裝Apache

4.1 為Apache的安裝建立頂層目錄,並且在真正的目錄樹中生成到它的系統連接。

??ROOT# mkdir /www/apache
??ROOT# ln -s /www/apache /apache

4.2 我都是作為一般的用戶來進行安裝和編譯的工作的(就像這個例子中的softs),

??注意:Apache的安裝是需要root身份的。在這個例子中我是在usr/local/src/chr (該文件是屬於softs:softs的)中進行源代碼編譯的

??$ cd /usr/local/src/chr
??$ tar zxf /path/to/apache_1.3.12.tar.gz
??$ cd apache_1.3.12

4.3 編輯config.layout,這樣它將包含一個稱為chroot的特殊的設計(layout)。

??# chroot layout.
??
??prefix:????/apache
??exec_prefix: $prefix
??bindir:????$exec_prefix/bin
??sbindir:?? $exec_prefix/bin
??libexecdir:??$exec_prefix/libexec
??mandir:????$prefix/man
??sysconfdir:??$prefix/conf
??datadir:?? $prefix
??iconsdir:?? $datadir/icons
??htdocsdir:?? $datadir/htdocs
??cgidir:????$datadir/cgi-bin
??includedir:??$prefix/include
??localstatedir: $prefix/var
??runtimedir:??$localstatedir/logs
??logfiledir:??$localstatedir/logs
??proxycachedir: $localstatedir/proxy
??

4.4 現在進行配置和構造

??non-DSO:

??$ ./configure --with-layout=chroot --enable-module=most --enable-module=so

使得模塊「so」有效,這樣以後你可以運用DSO+APXS機制,通過第三類模塊(3rd party module)來擴充你的Apache安裝。

??DSO:

??$./configure --with-layout=chroot --enable-module=most --enable-shared=max
??$ make
??ROOT# make install ## I am root!

4.5 現在來拷貝在例子Apache要用到的共享庫

??注意對於其他的配置,可能會用到其他的庫(你可以通過ldd來查詢)

??ROOT# cd /www
??ROOT# cp -pi /lib/libm.so.6 /lib/libcrypt.so.1 /lib/libdb.so.3 lib/
??ROOT# cp -pi /lib/libdl.so.2 lib/

4.6 可以進行快速測試來看看結果

??快速測試時,配置文件/www/apache/conf/httpd.conf中需要編輯的主要部分是:

??User www
??Group www
??ServerName yourserver.yourdomain.here
??Port 8088 ## pick your favourite test port

4.7 啟動後台程序(daemon)

??ROOT# chroot /www/apache/bin/apachectl start

4.8 測試URL

??$ lynx -dump http://yourserver/

測試在另一個埠(如:8088)上的URL

??$ lynx -dump http://yourserver:8088/

4.9 這兒有一個小的perl腳本程序,它將大多數的註釋從已生成的配置文件中刪除,形成一個簡化的文件。

4.10 將htdocs目錄樹的所有權交給Web目錄樹的所有者

??ROOT# chown -R 888:888 /www/apache/htdocs

5.編譯和安裝MySQL

??MySQL並不是安裝在虛擬根環境化的目錄樹上的,事實上,它有可能是安裝在其它系統上的。但在我的例子中,它是和Apache安裝在一個web伺服器上的。

??這個例子包括生成用戶和資料庫所在地,以及生成初始的資料庫

5.1 生成用戶,他將是MySQL資料庫的所有者。

例如:在home/mysql/中生成一個用戶777:777

??ROOT# groupadd -g 777 mysqldba
??ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql

5.2 解開原碼,並將原碼目錄樹給mysql的用戶

??ROOT# groupadd -g 777 mysqldba
??ROOT# useradd -c "mysql DBA" -d /home/mysql -u 777 -g 777 -m -n mysql

5.3 現在作為mysql用戶,為mysql資料庫建立目錄,並開始安裝和編譯mysql

??$ mkdir ~/db ## where the DB will reside
??$ cd /usr/local/src/mysql-3.22.27
??$ ./configure --localstatedir=/home/mysql/db --prefix=/usr/local/mysql
??$ make
??$ make install

5.4 生成*MySQL*授權表(只有在安裝*MySQL之前,這才是必須的)

??$ ./scripts/mysql_install_db

5.5 安裝和修改資料庫的啟動腳本,將資料庫的所有者從root變為mysql

??ROOT# cd /usr/local/src/mysql-3.22.27/
??ROOT# cp support-files/mysql.server /etc/rc.d/init.d/
??ROOT# chmod 755 /etc/rc.d/init.d/mysql.server
??ROOT# [ edit /etc/rc.d/init.d/mysql.server: ]
??mysql_daemon_user=mysql ## so we can run mysqld as this user.
??ROOT# chkconfig --add mysql.server ## permanently add server to rc scripts

5.6 在安裝了mysql之後,必須清空共享庫的cache。

??ROOT# /sbin/ldconfig -nv /usr/local/lib

5.7 為mysql的所有者編輯PATH變數,並且設定資料庫的root密碼。

??$ [ Edit shell login script .bash_profile: ]
??PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
??$ . ~/.bash_profile ## source it!
??$ mysqladmin -u root password '2mUch!data' ## pick your own password!

6.編譯和安裝PHP

6.1 先停止Apache後台程序(daemon)的運行

??ROOT#chroot /www /apache/bin/apachectl stop

6.2 你首先要編譯PHP

??如果你使用的是non-DSO安裝,你必須重新編譯Apache。(每次要升級non-DSO包中的任何一個軟體時,你都要再這樣做一遍。)

??$ cd /usr/local/src/chr ## I am NOT root!
??$ tar zxf /path/to/php-4.02.tar.gz
??$ cd php-4.02

??non-DSO:

??$ ./configure --with-mysql=/usr/local/mysql
??--with-apache=../apache_1.3.12 --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp

??DSO:

??$ ./configure --with-mysql=/usr/local/mysql
??--with-apxs=/apache/bin/apxs --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp

??DSO:

??(or add CFLAGS switch when mod_ssl was also configured as a DSO module)
??$ CFLAGS=-DEAPI ./configure --with-mysql=/usr/local/mysql
??--with-apxs=/apache/bin/apxs --enable-track-vars
??--with-config-file-path=/apache/conf --sharedstatedir=/tmp
??$ make

??non-DSO:

??$ make install

??DSO:

??ROOT# make install

??進行DSO的PHP安裝「make install」時,你必須是root。因為模塊是直接進入模塊目錄樹/apache/libexec的,另外,Apache的配置文件也改變了。

6.3 現在只討論non-DSO安裝,先重新編譯Apache,再激活PHP模塊

??$ cd ../apache_1.3.12/
??$ ./configure --with-layout=chroot
??--enable-module=most --enable-module=so
??--activate-module=src/modules/php4/libphp4.a
??$ make
??ROOT# make install ## I am root!

6.4 在實現了虛擬根環境目錄樹中,對PHP需要更多的共享庫,可以用ldd來查看

??For non-DSO: ldd /apache/bin/httpd

??For DSO: ldd /apache/apache/libexec/libphp4.so

??可以使用小的for循環,從/lib和/usr/lib中拷貝所需的文件

??ROOT# cd /www
??ROOT# for i in libresolv.so.2 libnsl.so.1 libpam.so.0 ; do
??> cp -pi /lib/$i /www/lib/ ; done
??ROOT# for i in libgd.so.1 libgdbm.so.2 libz.so.1; do
??> cp -pi /usr/lib/$i /www/usr/lib/ ; done

6.5 如果你需要mysql,你必須從它編譯的地方安裝相應的庫

??ROOT# cp -pi /usr/local/mysql/lib/mysql/libmysqlclient.so.6 /www/usr/lib/

6.6 你必須編輯httpd.conf文件,這樣它才可以識別出.php文件

??ROOT# cd /apache/conf
??ROOT# [ edit /apache/conf/httpd.conf ]
??AddType application/x-httpd-php .php
??AddType application/x-httpd-php-source .phps

6.7 重新啟動後台程序(daemon)

??ROOT# chroot /www /apache/bin/apachectl start

6.8 在non-DSO中,你可以檢查已經編譯過的PHP

??ROOT# chroot /www /apache/bin/httpd -l | grep php
??mod_php4.c

6.9 這兒有一個小的helloworld的腳本程序來測試php,它必須作為hello.php來安裝。如果你想要瀏覽源代碼的話可以拷貝一份或建立到hello.phps的系統連接。測試完,要關閉這個連接。

7.編譯和安裝perl

??你可以簡單的將/usr/lib/perl5拷貝到www/usr/lib,並將usr/bin/perl5.00503(假定是Red Hat6。0版本)拷貝到www/usr/bin中,這樣了事。同時,你需要檢測並安裝任何缺少的共享庫,你也需要建立從usr/bin/perl5.00503到/www中的/usr/bin/perl的硬連接。

??簡單的方法是:

??ROOT# cp -a /usr/lib/perl5 /www/usr/lib/perl
??ROOT# cp -p /usr/bin/perl5.00503 /www/usr/bin/
??ROOT# cd /www/usr/bin
??ROOT# ln perl5.00503 perl

??但是,我還是講一下怎樣安裝和編譯perl,如果你想要安裝mod-perl,你就必須在此編譯perl:

7.1 建立向虛擬根環境化的目錄樹中安裝的必要的連接。

??本例中使用目錄樹中的usr/Local。之所以用他,是有道理的,注意不要將他與usr/local混淆。安全起見,我還是使用softs用戶來安裝

??ROOT# mkdir /www/usr/Local
??ROOT# ln -s /www/usr/Local /usr/local
??ROOT# chown softs:softs /www/usr/Local

7.2 從RedHat中獲取RPM的源代碼

??ROOT# rpm -i /path/to/perl-5.00503-2.src.rpm

7.3 作為源代碼目錄樹的所有者,解開Perl

??$ cd /usr/Local/src/chr
??$ tar zxf /usr/src/redhat/SOURCES/perl5.005_03.tar.gz

7.4 RedHat在SRPM中包含了一些補丁。你可以使用相應版本的補丁。在這個例子中,我用了RedHat6。0的補丁。

??$ cp /usr/src/redhat/SOURCES/perl*.patch .
??$ cd perl5.005_03
??$ patch -p1 <../perl5-installman.patch
??$ patch -p1 <../perl5.005_02-buildsys.patch
??$ patch -p1 <../perl5.005_03-db1.patch

7.5 你需要運行Configure,並接受大多數的卻生設置。你可能也想對man頁的none加以特殊說明。下面是我對確生設置的一些修改:

??$ ./Configure
??architecture name? i386-linux
??Installation prefix to use? /usr/Local
??Directories to use for library searches? /lib /usr/lib /usr/Local/lib
??install perl as /usr/bin/perl? n

7.6 編譯和運行它

??$ make
??$ make test
??$ make install

7.7 建立在usr/bin目錄樹中到perl的連接。

??如果你沒有安裝mod-perl,你需要將perl目錄樹的所有權轉交給root。(不過這也不是必須的,只要Web目錄樹的所有者對perl目錄樹的許可權是只可讀的就行了)

??ROOT# cd /www/usr/bin
??ROOT# ln -s ../Local/bin/perl perl

7.8 檢查共享庫,安裝任何缺的庫(這主要決定於你的配置)

??在這個例子中,我們不缺任何庫:

??ROOT# ldd /www/usr/bin/perl
??libnsl.so.1 => /lib/libnsl.so.1 (0x4001b000)
??libdl.so.2 => /lib/libdl.so.2 (0x40031000)
??libm.so.6 => /lib/libm.so.6 (0x40035000)
??libc.so.6 => /lib/libc.so.6 (0x40052000)
??libcrypt.so.1 => /lib/libcrypt.so.1 (0x40147000)
??/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

7.9 測試你的安裝:

??ROOT# chroot /www /usr/bin/perl -v
??This is perl, version 5.005_03 built for i386-linux
??...

7.10 設置安裝在Apache伺服器上的perl例子的cgi bin 腳本

??ROOT# cd /www/apache/cgi-bin
??ROOT# chmod ugo+x *

7.11 啟動Apache伺服器,測試perl cgi bin腳本的例子

?? ROOT# chroot /www /apache/bin/apachectl start
??$ lynx -dump http://yourserver/cgi-bin/printenv

??同時檢查test-cgi

??$ lynx -dump http://yourserver/cgi-bin/test-cgi

7.12 最後將執行的二進位位從cgi腳本中去除,或完全去除。不要留對外的連接。

??ROOT# chmod ugo-x /www/apache/cgi-bin/*

8.編譯和安裝mod-ssl

??如果你打算使用DSO方式安裝mod-ssl,我希望你已經讀過前面的附加註釋段。

??你必須編譯openssl和mod-ssl,我還選擇編譯了rsaref version 2.0.你應當閱讀一些關於mod-ssl的文檔信息,以便理解mod-ssl的一些發行版本和選項。

??注意,openssl和rsaref提供了包含文件、庫和開發工具,它使得你可以編譯mod-ssl,所以決不能說它是虛擬根環境化的目錄樹的一部分,或者說是安裝在該目錄樹中的。

8.1 抽取openssl、mod-ssl和rsaref20的源代碼

??$ cd /usr/local/src/chr
??$ tar zxf /path/to/mod_ssl-2.6.6-1.3.12.tar.gz
??$ tar zxf /path/to/openssl-0.9.5a.tar.gz
??$ mkdir rsaref-2.0
??$ cd rsaref-2.0
??$ tar zxf /path/to/rsaref20.1996.tar.Z

8.2 配置和建立RSA參考庫。

??注意,在64位結構中你用rsaref必須在mod-ssl包中的INSTALL文件中讀取文檔信息。

??$ cd /usr/local/src/chr/rsaref-2.0
??$ cp -rpi install/unix local
??$ cd local
??$ make
??$ mv rsaref.a librsaref.a

8.3 配置和建立openssl庫

??$ cd /usr/local/src/chr/openssl-0.9.5a
??$ ./config -L/usr/local/src/chr/rsaref-2.0/local -fPIC
??$ make
??$ make test??# inspect output for anomalies

8.4 你可能想要安裝包,當然不是安裝在目錄樹上了。

??在這兒,我假設softs擁有usr/local/tree,因為安裝openssl的預設的前綴/usr/local/ssl 。但是,也不是必須要安裝這個包,因為你可以在src目錄樹外進行操作,來建立mod-ssl。

??$ make install

8.5 配置open-ssl

??$ cd /usr/local/src/chr/mod_ssl-2.6.6-1.3.12
??$ ./configure -with-apache=../apache_1.3.12

8.6 進入Apache目錄樹中,完成建立、配置、運行和構造

??$ cd /usr/local/src/chr/apache_1.3.12

??non-DSO:

??$ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local
??./configure --prefix=/apache --with-layout=chroot
??--enable-module=most --enable-module=so --enable-module=ssl
??--disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM
??--activate-module=src/modules/php4/libphp4.a
??--activate-module=src/modules/perl/libperl.a

??DSO:

??$ cd src/modules
??$ make clean ## seems to be necessary if you previously compiled in the apache tree
??$ cd ../../
??$ SSL_BASE=../openssl-0.9.5a RSA_BASE=../rsaref-2.0/local
??./configure --prefix=/apache --with-layout=chroot
??--enable-module=most --enable-shared=max --enable-shared=ssl
??--disable-rule=SSL_COMPAT --enable-rule=SSL_SDBM
??$ make

8.7 重新安裝Apache。如果他在運行,要停止運行再安裝。

??ROOT# chroot /www /apache/bin/apachectl stop
??ROOT# make install ## I am root!

8.8 對於non-DSO安裝你可以檢測內部編譯模塊。

??ROOT# chroot /www /apache/bin/httpd -l | grep -E '(php|perl|ssl)'
??mod_ssl.c
??mod_php4.c
??mod_perl.c

8.9 在實現了虛擬根環境目錄樹中生成隨機的設備

??ROOT# cd /www/dev
??ROOT# mknod random c 1 8
??ROOT# mknod urandom c 1 9

8.10 將預設配置文件融合到你當前的httpd.conf文件中。

??我在不同於標準埠(80埠)的其他埠上進行了測試,但是對於安全埠(443埠),沒有web服務起跑再它上面,所以我馬上就會用一下這個埠。

??在這個例子中,我對預設的配置文件httpd.conf的一些修改如下:

User www
Group www
ServerName yourserver.yourdomain.here
Port 8088 ## pick a test port
Listen 8088 ## in 'IfDefine SSL' section
Listen 443 ## this is the standard secure port!

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# your Hello.pm script for mod_perl testing:

SetHandler perl-script
PerlHandler Apache::Hello

SSLCertificateFile /apache/conf/server.crt
SSLCertificateKeyFile /apache/conf/server.key
# in this example I generate the key and crt files into /apache/conf
8.11 如果你現在還沒有一個伺服器的關鍵字(keys)和認證(certficate),那麼現在就生成它。

??在這個例子中我假設openssl在你的路徑中,因為你已經安裝了它。如果沒有,你就把它加到路徑中。注意,我已經認定了我的關鍵字,如果你要做非常重要的事,你最好利用授權機制來分發這些關鍵字。

??ROOT# cd /www/apache/conf
??set up a path of random files(為random文件生成路徑)
??ROOT# randfiles='/var/log/messages:/proc/net/unix:/proc/stat:/proc/ksyms'
??generate the server key(產生服務端的密鑰)
??ROOT# openssl genrsa -rand
??$randfiles -out server.key 1024
??產生帶簽名的請求(在認證自己的時候不要加密碼)
??注意你的Common Name必須匹配你完全有權訪問的web server name
??ROOT# openssl req -new -nodes -out request.pem -key server.key
??簽上你自己的密鑰(有效期一年)
??ROOT# openssl x509 -in request.pem -out server.crt -req -signkey server.key -days 365
??保護你的密鑰和證書
??ROOT# chmod 400 server.*
??刪除請求文件
??ROOT# rm request.pem
??可選擇性地加密你的密鑰
??ROOT# mv server.key server.key.unencrypted
??ROOT# openssl rsa -des3 -in server.key.unencrypted -out server.key
??ROOT# chmod 000 server.key.unencrypted ## better yet delete it!
??當你改變注意,你決定從你的密鑰中刪除加密的密碼。
??ROOT# openssl rsa -in server.key -out server.key.un
??ROOT# mv server.key.un server.key
??ROOT# chmod 400 server.key

8.12 不用ssl來啟動Apache,以確保它在工作。

??ROOT# chroot /www /apache/bin/apachectl start
??$ lynx -dump http://yourserver:8088/

8.13 用ssl來重啟Apache,並用netscape來測試它。

??ROOT# chroot /www /apache/bin/apachectl stop
??ROOT# chroot /www /apache/bin/apachectl startssl
??$ netscape https://yourserver/

8.14 現在你可能想要編輯你的server配置文件,並在標準埠(80埠)上設置伺服器。

??如果你測試配置,你不需要在443埠上進行配置。

9.一些安全考慮

??可以從一些在線Apache文檔中獲取幫助。一個需要特別注意的地方是在httpd腳本上進行的授權改變。

??ROOT# chmod ugo-rw /www/apache/bin/*

10.擺脫你自己的虛擬根環境化環境

??當你有意要擺脫自己的虛擬根環境化環境時,一定要十分小心。在Unix世界中完成一項任務總是有不同的方法,你可以嘗試其他的方法。

??我提供了下面一個例子,它可以通過cgi腳本或php來激發。

???? ...
?? /** construct the file name as $f **/
?? $cmd = "/bin/mail "-s Some-subject-line -t webmaster@localhost -f $f"";
?? $op = exec( $cmd, $arr, $retval );
?? ...
?? ?>

文件被稱為wwwmail.c。

11.安裝以後進行清除工作

11.1 去除安裝時一些必要的臨時連接

??ROOT# rm /apache /usr/Local

11.2 通過在etc/rc.d/init.d中安裝稱為httpd的啟動腳本文件來自動啟動Apache。如:

??Standard appache on port 80
??Apache on ports 80 and 443 (startssl)

接著在其上運行chkconfig來建立象徵性的連接

??ROOT# chkconfig --add httpd
??ROOT# chkconfig --list httpd
??httpd?? 0:off 1:off 2:on??3:on??4:on??5:on??6:off

11.3 自動的記錄triming文件。

??在RedHat系統中你可以自己定義要記錄那個文件,及參數,只用在etc/logrotate/conf中說明就行了。

12.基於RPM的收穫文件

??在這兒我沒有時間完全文本化它,你可以從RPMS中獲取它,然後不需要編譯原碼就生成一個虛擬根環境化的Web目錄樹。現在我有兩個腳本,以後我會對他們文檔化的:

Script file based on Red Hat 7.0 that will harvest the RPMs
Script file for creating temporary SSL key and certificate (testing purposes only!!!)





[火星人 via ] Linux和Solaris建立Apache的虛擬根環境已經有292次圍觀

http://www.coctec.com/docs/security/show-post-72688.html