Web 服務(wù)器也稱為 WWW 服務(wù)器或 HTTP 服務(wù)器 (HTTP Server),它是 Internet 上最常見也是使用最頻繁的服務(wù)器之一,Web 服務(wù)器能夠?yàn)橛脩籼峁┚W(wǎng)頁瀏覽、論壇訪問等等服務(wù)。
由于用戶在通過 Web 瀏覽器訪問信息資源的過程中,無須再關(guān)心一些技術(shù)性的細(xì)節(jié),而且界面非常友好,因而 Web 在 Internet 上一推出就得到了爆炸性的發(fā)展?,F(xiàn)在 Web 服務(wù)器已經(jīng)成為 Internet 上最大的計(jì)算機(jī)群,Web 文檔之多、鏈接的網(wǎng)絡(luò)之廣,也令人難以想像。因此,Web 服務(wù)器軟件的數(shù)量也開始增加,Web 服務(wù)器軟件市場的競爭也越來越激烈。本文所討論的就是一款最常用的 Web 服務(wù)器軟件—— Apache。
Apache 是一個(gè)免費(fèi)的軟件,用戶可以免費(fèi)從 Apache 的官方網(wǎng)站下載。任何人都可以參加其組成部分的開發(fā)。Apache 允許世界各地的人對其提供新特性。當(dāng)新代碼提交到 Apache Group 后,Apache Group 對其具體內(nèi)容進(jìn)行審查并測試和質(zhì)量檢查。如果他們滿意,該代碼就會被集成到 Apache 的主要發(fā)行版本中。
Apache 的其他主要特征有:
一般說來,Apache 服務(wù)器主要面臨如下幾種網(wǎng)絡(luò)威脅:
要應(yīng)對上述這些安全威脅,要從 Apache 服務(wù)器端配置、運(yùn)行環(huán)境、通信鏈路安全保障、安全模塊使用、日志管理等各方面、全方位的進(jìn)行保障,下面將進(jìn)行分門別類的詳細(xì)介紹。
一般情況下,在 Linux 下啟動(dòng) Apache 服務(wù)器的進(jìn)程 httpd 需要 root 權(quán)限。由于 root 權(quán)限太大,存在許多潛在的對系統(tǒng)的安全威脅。一些管理員為了安全的原因,認(rèn)為 httpd 服務(wù)器不可能沒有安全漏洞,因而更愿意使用普通用戶的權(quán)限來啟動(dòng)服務(wù)器。http.conf 主配置文件里面有如下 2 個(gè)配置是 Apache 的安全保證,Apache 在啟動(dòng)之后,就將其本身設(shè)置為這兩個(gè)選項(xiàng)設(shè)置的用戶和組權(quán)限進(jìn)行運(yùn)行,這樣就降低了服務(wù)器的危險(xiǎn)性。
User apache
Group apache
需要特別指出的是:以上 2 個(gè)配置在主配置文件里面是默認(rèn)選項(xiàng),當(dāng)采用 root 用戶身份運(yùn)行 httpd 進(jìn)程后,系統(tǒng)將自動(dòng)將該進(jìn)程的用戶組和權(quán)限改為 apache,這樣,httpd 進(jìn)程的權(quán)限就被限制在 apache 用戶和組范圍內(nèi),因而保證了安全。
Apache 服務(wù)器的版本號可以作為黑客入侵的重要信息進(jìn)行利用,他們通常在獲得版本號后,通過網(wǎng)上搜索針對該版本服務(wù)器的漏洞,從而使用相應(yīng)的技術(shù)和工具有針對性的入侵,這也是滲透測試的一個(gè)關(guān)鍵步驟。因此,為了避免一些不必要的麻煩和安全隱患,可以通過主配置文件 httpd.conf 下的如下兩個(gè)選項(xiàng)進(jìn)行:
(1)ServerTokens:該選項(xiàng)用于控制服務(wù)器是否響應(yīng)來自客戶端的請求,向客戶端輸出服務(wù)器系統(tǒng)類型或者相應(yīng)的內(nèi)置模塊等重要信息。Red Hat Enterprise Linux 5 操作系統(tǒng)在主配置文件中提供全局默認(rèn)控制閾值為 OS,即 ServerTokens OS。它們將向客戶端公開操作系統(tǒng)信息和相關(guān)敏感信息,所以保證安全情況下需要在該選項(xiàng)后使用“ProductOnly”,即 ServerTokens ProductOnly。
(2)ServerSignature:該選項(xiàng)控制由系統(tǒng)生成的頁面(錯(cuò)誤信息等)。默認(rèn)情況下為 off,即 ServerSignature off,該情況下不輸出任何頁面信息。另一情況為 on,即 ServerSignature on,該情況下輸出一行關(guān)于版本號等相關(guān)信息。安全情況下應(yīng)該將其狀態(tài)設(shè)為 off。
圖 1 和圖 2 為安全設(shè)定這兩個(gè)選項(xiàng)前后正常情況下和錯(cuò)誤情況下的輸出頁面(通過 Rhel5 中的 Mozilla Firefox 瀏覽器訪問 Rhel5 中的 Apache 服務(wù)器)的詳細(xì)對比??梢郧宄吹?,安全設(shè)定選項(xiàng)后,可以充分地向客戶端用戶隱藏 Linux 操作系統(tǒng)信息和 Apache 服務(wù)器版本信息。
要從主目錄以外的其他目錄中進(jìn)行發(fā)布,就必須創(chuàng)建虛擬目錄。虛擬目錄是一個(gè)位于 Apache 的主目錄外的目錄,它不包含在 Apache 的主目錄中,但在訪問 Web 站點(diǎn)的用戶看來,它與位于主目錄中的子目錄是一樣的。每個(gè)虛擬目錄都有一個(gè)別名,用戶 Web 瀏覽器中可以通過此別名來訪問虛擬目錄,如 http:// 服務(wù)器 IP 地址 / 別名 / 文件名,就可以訪問虛擬目錄下面的任何文件了。
使用 Alias 選項(xiàng)可以創(chuàng)建虛擬目錄。在主配置文件中,Apache 默認(rèn)已經(jīng)創(chuàng)建了兩個(gè)虛擬目錄。這兩條語句分別建立了“/icons/”和“/manual”兩個(gè)虛擬目錄,它們對應(yīng)的物理路徑分別是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用戶可以看到如下配置語句:
Alias /icons/ "/var/www/icons/"
Alias /manual "/var/www/manual"
在實(shí)際使用過程中,用戶可以自己創(chuàng)建虛擬目錄。比如,創(chuàng)建名為 /user 的虛擬目錄,它所對應(yīng)的路徑為上面幾個(gè)例子中常用的 /var/www/html/rhel5:
Alias /test "/var/www/html/rhel5"
如果需要對其進(jìn)行權(quán)限設(shè)置,可以加入如下語句:
<Directory “/var/www/html/rhel5”> AllowOverride None Options Indexes Order allow,deny Allow from all </Directory>
設(shè)置該虛擬目錄和目錄權(quán)限后,可以使用客戶端瀏覽器進(jìn)行測試驗(yàn)證,采用別名對該目錄中的文件進(jìn)行訪問,瀏覽結(jié)果如圖 3 所示。
Apache 服務(wù)器需要綁定到 80 端口上來監(jiān)聽請求,而 root 是唯一有這種權(quán)限的用戶,隨著攻擊手段和強(qiáng)度的增加,這樣會使服務(wù)器受到相當(dāng)大的威脅,一但被利用緩沖區(qū)溢出漏洞,就可以控制整個(gè)系統(tǒng)。為了進(jìn)一步提高系統(tǒng)安全性,Linux 內(nèi)核引入 chroot 機(jī)制,chroot 是內(nèi)核中的一個(gè)系統(tǒng)調(diào)用,軟件可以通過調(diào)用函數(shù)庫的 chroot 函數(shù),來更改某個(gè)進(jìn)程所能見到的根目錄。
chroot 機(jī)制即將某軟件運(yùn)行限制在指定目錄中,保證該軟件只能對該目錄及其子目錄的文件有所動(dòng)作,從而保證整個(gè)服務(wù)器的安全。在這種情況下,即使出現(xiàn)黑客或者不法用戶通過該軟件破壞或被侵入系統(tǒng),Linux 系統(tǒng)所受的損壞也僅限于該設(shè)定的根目錄,而不會影響到整個(gè)系統(tǒng)的其他部分。
將軟件 chroot 化的一個(gè)問題是該軟件運(yùn)行時(shí)需要的所有程序、配置文件和庫文件都必須事先安裝到 chroot 目錄中,通常稱這個(gè)目錄為 chroot“監(jiān)牢”。如果在“監(jiān)牢”中運(yùn)行 httpd,那么用戶根本看不到 Linux 文件系統(tǒng)中那個(gè)真正的目錄,從而保證了 Linux 系統(tǒng)的安全。
在使用該技術(shù)的時(shí)候,一般情況下需要事先創(chuàng)建目錄,并將守護(hù)進(jìn)程的可執(zhí)行文件 httpd 復(fù)制到其中。同時(shí),由于 httpd 需要幾個(gè)庫文件,所以需要把 httpd 程序依賴的幾個(gè) lib 文件同時(shí)也拷貝到同一個(gè)目錄下,因此手工完成這一工作是非常麻煩的。幸運(yùn)的是,用戶可以通過使用開源的 jail 軟件包來幫助簡化 chroot“監(jiān)牢”建立的過程,具體步驟如下所示:Jail 官方網(wǎng)站是:http://www.jmcresearch.com/projects/。
首先將其下載,然后執(zhí)行如下命令進(jìn)行源代碼包的編譯和安裝:
#tar xzvf jail_1.9a.tar.gz #cd jail/src #make
jail 軟件包提供了幾個(gè) Perl 腳本作為其核心命令,包括 mkjailenv、addjailuser 和 addjailsw,他們位于解壓后的目錄 jail/bin 中。這幾個(gè)命令的基本用途如下所示:
采用 jail 創(chuàng)建監(jiān)牢的步驟如下所示;
(1)首先需要停止目前運(yùn)行的 httpd 服務(wù),然后建立 chroot 目錄,命令如下所示。該命令將 chroot 目錄建立在路徑 /root/chroot/httpd 下:
# service httpd stop # mkjailenv /root/chroot/httpd kjailenv A component of Jail (version 1.9 for linux) http://www.gsyc.inf.uc3m.es/~assman/jail/ Juan M. Casillas <assman@gsyc.inf.uc3m.es> Making chrooted environment into /root/chroot/httpd Doing preinstall() Doing special_devices() Doing gen_template_password() Doing postinstall() Done.
(2)為“監(jiān)牢”添加 httpd 程序,命令如下:
# ./addjailsw /root/chroot/httpd/ -P /usr/sbin/httpd addjailsw A component of Jail (version 1.9 for linux) http://www.gsyc.inf.uc3m.es/~assman/jail/ Juan M. Casillas <assman@gsyc.inf.uc3m.es> Guessing /usr/sbin/httpd args(0) Warning: can't create /proc/mounts from the /proc filesystem Done.
在上述過程中,用戶不需要在意那些警告信息,因?yàn)?jail 會調(diào)用 ldd 檢查 httpd 用到的庫文件。而幾乎所有基于共享庫的二進(jìn)制可執(zhí)行文件都需要上述的幾個(gè)庫文件。
(3)然后,將 httpd 的相關(guān)文件拷貝到“監(jiān)牢”的相關(guān)目錄中,命令如下所示:
# mkdir -p /root/chroot/httpd/etc # cp – a /etc/httpd /root/chroot/httpd/etc/ 。。。。。。
添加后的目錄結(jié)構(gòu)如下所示:
# ll 總計(jì) 56 drwxr-xr-x 2 root root 4096 03-23 13:44 dev drwxr-xr-x 3 root root 4096 03-23 13:46 etc drwxr-xr-x 2 root root 4096 03-23 13:46 lib drwxr-xr-x 2 root root 4096 03-23 13:46 selinux drwsrwxrwx 2 root root 4096 03-23 13:46 tmp drwxr-xr-x 4 root root 4096 03-23 13:46 usr drwxr-xr-x 3 root root 4096 03-23 13:46 var
(4)重新啟動(dòng) httpd,并使用 ps 命令檢查 httpd 進(jìn)程,發(fā)現(xiàn)該進(jìn)程已經(jīng)運(yùn)行在監(jiān)牢中,如下所示:
# ps -aux | grep httpd Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ root 3546 0.6 0.3 3828 1712 pts/2 S 13:57 0:00 /usr/sbin/nss_pcache off /etc/httpd/alias root 3550 14.2 3.6 49388 17788 ? Rsl 13:57 0:00 /root/chroot/httpd/httpd apache 3559 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3560 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3561 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3562 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3563 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3564 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3565 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd apache 3566 0.2 1.4 49388 6888 ? S 13:57 0:00 /root/chroot/httpd/httpd root 3568 0.0 0.1 4124 668 pts/2 R+ 13:57 0:00 grep httpd
Apache 的一個(gè)優(yōu)勢便是其靈活的模塊結(jié)構(gòu),其設(shè)計(jì)思想也是圍繞模塊(module)概念而展開的。安全模塊是 Apache Server 中的極其重要的組成部分。這些安全模塊負(fù)責(zé)提供 Apache server 的訪問控制和認(rèn)證,授權(quán)等一系列至關(guān)重要的安全服務(wù)。
Apache 下有如下幾類與安全相關(guān)的模塊:
為了能夠使用模塊功能,模塊通常以 DSO(Dynamic Shared Object)的方式構(gòu)建,用戶應(yīng)該在 httpd.conf 文件中使用 LoadModule 指令,使得能夠在使用前獲得模塊的功能。如下為主配置文件中各個(gè)模塊的情況,開啟安全模塊非常簡單,即去掉在各安全模塊所在行前的“#”符號即可,如下所示:
LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_alias_module modules/mod_authn_alias.so 。。。。。。
只有將上述安全模塊進(jìn)行開啟后 ,Apache 才能實(shí)現(xiàn)相應(yīng)的訪問控制和通信加密功能。
在開啟了相應(yīng)的安全模塊后,還需要對 Apache 的訪問控制策略進(jìn)行設(shè)定。
目前,有兩種常見的認(rèn)證類型,基本認(rèn)證和摘要認(rèn)證:
(1)基本認(rèn)證(Basic):使用最基本的用戶名和密碼方式進(jìn)行用戶認(rèn)證。
(2)摘要認(rèn)證(Digest):該認(rèn)證方式比基本認(rèn)證要安全得多,在認(rèn)證過程中額外使用了一個(gè)針對客戶端的挑戰(zhàn)(challenge)信息,可以有效地避免基本認(rèn)證方式可能遇到的“重放攻擊”。值得注意的是:目前并非所有的瀏覽器都支持摘要認(rèn)證方式。
所有的認(rèn)證配置指令既可以出現(xiàn)在主配置文件 httpd.conf 中的 Directory 容器中,也可以出現(xiàn)在單獨(dú)的 .htaccess 文件中,這個(gè)可以由用戶靈活地選擇使用。在認(rèn)證配置過程中,需要用到如下指令選項(xiàng):
使用上述的認(rèn)證指令配置認(rèn)證之后,需要為 Apache 服務(wù)器的訪問對象,也就是指定的用戶和組進(jìn)行相應(yīng)的授權(quán),以便于他們對 Apache 服務(wù)器提供的目錄和文件進(jìn)行訪問。為用戶和組進(jìn)行授權(quán)需要使用 Require 指令,它主要可以使用如下三種方式進(jìn)行授權(quán):
要實(shí)現(xiàn)用戶認(rèn)證功能,首先要建立保存用戶名和口令的文件。Apache 自帶的 htpasswd 命令提供了建立和更新存儲用戶名、密碼的文本文件的功能。需要注意的是,這個(gè)文件必須放在不能被網(wǎng)絡(luò)訪問的位置,以避免被下載和信息泄漏。建議將口令文件放在 /etc/httpd/ 目錄或者其子目錄下。
下面的例子在 /etc/httpd 目錄下創(chuàng)建一個(gè)文件名為 passwd_auth 的口令文件,并將用戶 rhel5 添加入認(rèn)證口令文件。使用以下命令建立口令文件(過程中還會提示輸入該用戶的口令):
# touch passwd_auth # htpasswd -c /etc/httpd/passwd_auth rhel5 New password: Re-type new password: Adding password for user rhel5
命令執(zhí)行的過程中系統(tǒng)會要求用戶為 rhel5 用戶輸入密碼。上述命令中的 -c 選項(xiàng)表示無論口令文件是否已經(jīng)存在,都會重新寫入文件并刪去原有內(nèi)容。所以在添加第 2 個(gè)用戶到口令文件時(shí),就不需要使用 -c 選項(xiàng)了,如下命令所示
# htpasswd /etc/httpd/passwd_auth testuser
配置指令
Apache 實(shí)現(xiàn)訪問控制的配置指令包括如下三種:
(1)order 指令:用于指定執(zhí)行允許訪問控制規(guī)則或者拒絕訪問控制規(guī)則的順序。order 只能設(shè)置為 Order allow,deny 或 Order deny,allow,分別用來表明用戶先設(shè)置允許的訪問地址還是先設(shè)置禁止訪問的地址。Order 選項(xiàng)用于定義缺省的訪問權(quán)限與 Allow 和 Deny 語句的處理順序。Allow 和 Deny 語句可以針對客戶機(jī)的域名或 IP 地址進(jìn)行設(shè)置,以決定哪些客戶機(jī)能夠訪問服務(wù)器。Order 語句設(shè)置的兩種值的具體含義如下:
(2)allow 指令:指明允許訪問的地址或地址序列。如 allow from all 指令表明允許所有 IP 來的訪問請求。
(3)deny 指令:指明禁止訪問的地址或地址序列。如 deny from all 指令表明禁止所有 IP 來的訪問請求。
應(yīng)用實(shí)例
下面舉幾個(gè)簡單的例子對上述 order、allow 和 deny 命令的使用進(jìn)行示范。
(1)在下面的例子中,admin.org 域中所有主機(jī)都允許訪問網(wǎng)站,而其他非該域中的任何主機(jī)訪問都被拒絕,因?yàn)?Deny 在前,Allow 在后,Allow 語句覆蓋了 Deny 語句:
Order Deny,Allow Deny from all Allow from admin.org
(2)下面例子中,admin.org 域中所有主機(jī),除了 db.admin.org 子域包含的主機(jī)被拒絕訪問以外,都允許訪問。而所有不在 admin.org 域中的主機(jī)都不允許訪問,因?yàn)槿笔顟B(tài)是拒絕對服務(wù)器的訪問(Allow 在前,Deny 在后,Deny 語句覆蓋了 Allow 語句):
Order Allow,Deny Allow from admin.org Deny from db.admin.org
使用主配置文件配置用戶認(rèn)證及授權(quán)
在本例子中,用戶可以在 Apache 的主配置文件 httpd.conf 中加入以下語句建立對目錄 /var/www/html/rhel5 訪問的用戶認(rèn)證和授權(quán)機(jī)制:
<Directory "/var/www/html/rhel5"> AllowOverride None AuthType Basic AuthName "rhel5" AuthUserFile /etc/httpd/passwd_auth Require user rhel5 testuser </Directory>
在上述例子中,使用了如下指令:
需要注意的是:在 AuthUserFile 選項(xiàng)定義中,還需要使用如下語句事先建立認(rèn)證用戶 patterson 和 testuser,該選項(xiàng)中的定義才能生效:
#htpasswd -c /etc/httpd/passwd_auth rhel5 #htpasswd /etc/httpd/passwd_auth testuser
使用 .htaccess 文件配置用戶認(rèn)證和授權(quán)
在本例子中,為了完成如上述例子同樣的功能,需要先在主配置文件中加入如下語句:
<Directory “/var/www/html/rhel5”> AllowOverride AuthConfig </Directory>
上述語句中的 AllowOverride 選項(xiàng)允許在 .htaccess 文件中使用認(rèn)證和授權(quán)指令。、、然后,在 .htaccess 文件中添加如下語句即可:
AuthType Basic AuthName "Please Login:" AuthUserFile /etc/httpd/passwd_auth Require user rhel5 testuser、
同理,在 AuthUserFile 選項(xiàng)定義中,還需要使用如下語句事先建立認(rèn)證用戶 patterson 和 testuser,該選項(xiàng)中的定義才能生效:
#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_auth testuser
在 SSL 通信中,首先采用非對稱加密交換信息,使得服務(wù)器獲得瀏覽器端提供的對稱加密的密鑰,然后利用該密鑰進(jìn)行通信過程中信息的加密和解密。為了保證消息在傳遞過程中沒有被篡改,可以加密 Hash 編碼來確保信息的完整性。服務(wù)器數(shù)字證書主要頒發(fā)給 Web 站點(diǎn)或其他需要安全鑒別的服務(wù)器,證明服務(wù)器的身份信息,同樣客戶端數(shù)字證書用于證明客戶端的身份。
使用公用密鑰的方式可以保證數(shù)據(jù)傳輸沒有問題,但如果瀏覽器客戶訪問的站點(diǎn)被假冒,這也是一個(gè)嚴(yán)重的安全問題。這個(gè)問題不屬于加密本身,而是要保證密鑰本身的正確性問題。要保證所獲得的其他站點(diǎn)公用密鑰為其正確的密鑰,而非假冒站點(diǎn)的密鑰,就必須通過一個(gè)認(rèn)證機(jī)制,能對站點(diǎn)的密鑰進(jìn)行認(rèn)證。當(dāng)然即使沒有經(jīng)過認(rèn)證,仍然可以保證信息傳輸安全,只是客戶不能確信訪問的服務(wù)器沒有被假冒。如果不是為了提供電子商務(wù)等方面對安全性要求很高的服務(wù),一般不需要如此嚴(yán)格的考慮
。
下面給出使用 SSL 進(jìn)行通信的過程(參見圖 4):
(1)客戶端向服務(wù)器端發(fā)起對話,協(xié)商傳送加密算法。例如:對稱加密算法有 DES、RC5,密鑰交換算法有 RSA 和 DH,摘要算法有 MD5 和 SHA。
(2)服務(wù)器向客戶端發(fā)送服務(wù)器數(shù)字證書。比如:使用 DES-RSA-MD5 這對組合進(jìn)行通信??蛻舳丝梢则?yàn)證服務(wù)器的身份,決定是否需要建立通信。
(3)客戶端向服務(wù)器傳送本次對話的密鑰。在檢查服務(wù)器的數(shù)字證書是否正確,通過 CA 機(jī)構(gòu)頒發(fā)的證書驗(yàn)證了服務(wù)器證書的真實(shí)有效性之后,客戶端生成利用服務(wù)器的公鑰加密的本次對話的密鑰發(fā)送給服務(wù)器。
(4)服務(wù)器用自己的私鑰解密獲取本次通信的密鑰。
(5)雙方的通信正式開始。
在一般情況下,當(dāng)客戶端是保密信息的傳遞者時(shí),他不需要數(shù)字證書驗(yàn)證自己身份的真實(shí)性,如用戶通常使用的網(wǎng)上銀行交易活動(dòng),客戶需要將自己的隱秘信息——賬號和密碼發(fā)送給銀行,因此銀行的服務(wù)器需要安裝數(shù)字證書來表明自己身份的有效性,否則將會使得信息泄露。當(dāng)然,在某些安全性要求極高的 B2B(Business to Business)應(yīng)用,服務(wù)器端也需要對客戶端的身份進(jìn)行驗(yàn)證,這時(shí)客戶端也需要安裝數(shù)字證書以保證通信時(shí)服務(wù)器可以辨別出客戶端的身份,驗(yàn)證過程類似于服務(wù)器身份的驗(yàn)證過程。另外,在一些電子商務(wù)的應(yīng)用中,可能還會使用到電子簽名,或者為了信息交換的更加安全,會增加電子簽名和消息校驗(yàn)碼(MAC)。而在通常情況下,瀏覽器都會通過交互的方式來完成上述的通信過程,下面在 Linux 中對 Apache 采用 SSL 也會作詳細(xì)地介紹。
安裝 SSL
雖然 Apache 服務(wù)器不支持 SSL,但 Apache 服務(wù)器有兩個(gè)可以自由使用的支持 SSL 的相關(guān)計(jì)劃,一個(gè)為 Apache-SSL,它集成了 Apache 服務(wù)器和 SSL,另一個(gè)為 Apache+mod_ssl,它是通過可動(dòng)態(tài)加載的模塊 mod_ssl 來支持 SSL,其中后一個(gè)是由前一個(gè)分化出的,并由于使用模塊,易用性很好,因此使用范圍更為廣泛。還有一些基于 Apache 并集成了 SSL 能力的商業(yè) Web 服務(wù)器,然而使用這些商業(yè) Web 服務(wù)器主要是北美,這是因?yàn)樵谀抢?SSL 使用的公開密鑰的算法具備專利權(quán),不能用于商業(yè)目的,其他的國家不必考慮這個(gè)專利問題,而可以自由使用 SSL。
Apache+mod_ssl 依賴于另外一個(gè)軟件:OpenSSL,它是一個(gè)可以自由使用的 SSL 實(shí)現(xiàn),首先需要安裝這個(gè)軟件。用戶可以從網(wǎng)站 http://www.openssl.org/source/ 上下載 Linux 下 OpenSSL 的最新穩(wěn)定版本:openssl-1.0.1c.tar.gz。
下載源代碼安裝包后,使用如下的步驟安裝即可:
(1)用 openssl-1.0.1c.tar.gz 軟件包安裝 OpenSSL 之前,首先須要對該軟件包進(jìn)行解壓縮和解包。用以下命令完成軟件包的解壓縮和解包:
#tar xvfz openssl-1.0.1c.tar.gz
(2)解壓縮后,進(jìn)入源碼的目錄 openssl-1.0.1c ,并使用配置腳本進(jìn)行環(huán)境的設(shè)置。相應(yīng)的命令為:
// 改變當(dāng)前目錄為 openssl-1.0.1c 目錄 #cd openssl-1.0.1c // 執(zhí)行該目錄下配置腳本程序 #./configure
(3)在執(zhí)行 ./configure 之后,配置腳本會自動(dòng)生成 Makefile。如果在設(shè)置的過程中沒有任何的錯(cuò)誤,就可以開始編譯源碼了。相應(yīng)的命令及其顯示結(jié)果如下:
#make & make install
安裝好 OpenSSL 之后,就可以安裝使用 Apache+mod_ssl 了。然而為了安裝完全正確,需要清除原先安裝的 Apache 服務(wù)器的其他版本,并且還要清除所有的設(shè)置文件及其缺省設(shè)置文件,以避免出現(xiàn)安裝問題。最好也刪除 /usr/local/www 目錄(或更名),以便安裝程序能建立正確的初始文檔目錄。如果是一臺沒有安裝過 Apache 服務(wù)器的新系統(tǒng),就可以忽略這個(gè)步驟,而直接安裝 Apache+mod_ssl 了。
啟動(dòng)和關(guān)閉 SSL
啟動(dòng)和關(guān)閉該服務(wù)器的命令如下所示:
此時(shí)使用 start 參數(shù)為僅僅啟動(dòng)普通 Apache 的 httpd 守護(hù)進(jìn)程,而不啟動(dòng)其 SSL 能力,而 startssl 才能啟動(dòng) Apache 的 SSL 能力。如果之前 Apache 的守護(hù)進(jìn)程正在運(yùn)行,便需要使用 stop 參數(shù)先停止服務(wù)器運(yùn)行。
在采用 OpenSSL 進(jìn)行 Apache 通信加密前,需要先產(chǎn)生與加密相關(guān)的認(rèn)證憑證(也就是證書),如下步驟所示:
# openssl genrsa -out apache.key 1024 Generating RSA private key, 1024 bit long modulus ..........................................++++++ .....................++++++ e is 65537 (0x10001) # openssl req -new -key apache.key -out apache.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:CN State or Province Name (full name) [Berkshire]:China Locality Name (eg, city) [Newbury]:Beijing Organization Name (eg, company) [My Company Ltd]:CSO Organizational Unit Name (eg, section) []:CSO Common Name (eg, your name or your server's hostname) []:localhost Email Address []:CSO@ittf.org.cn Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:apacheserver An optional company name []:apacheserver # openssl x509 -req -days 365 -in apache.csr -signkey apache.key -out apache.crt Signature ok subject=/C=CN/ST=China/L=Beijing/O=CSO/OU=CSO/CN=localhost/emailAddress=CSO@ittf.org.cn Getting Private key
經(jīng)過上述步驟后,將會產(chǎn)生三個(gè)文件 apache.csr, apache.key 和 apache.crt,然后把這三個(gè)文件拷貝到 /etc/httpd/conf/ca 目錄下即可。
然后,就可以啟動(dòng) Mozilla、IE 或其他支持 SSL 的瀏覽器,輸入 URL 為:https://ssl_server/來查看服務(wù)器是否有相應(yīng),https 使用的缺省端口為 443,如果一切正常,服務(wù)器將會返回給客戶端證書,由客戶端進(jìn)行驗(yàn)證并且判斷,是否接受該證書并進(jìn)行下一步的通信過程。
下面以 Linux 下的 Mozilla Firefox 瀏覽器為例,來簡要說明使用 Apache+SSL 服務(wù)器的過程。首先,圖 5 給出了查看和驗(yàn)證該證書的相關(guān)提示;最后,圖 6 則給出了證書驗(yàn)證成功后,采用 SSL 進(jìn)行保密傳輸?shù)木唧w界面示意:
日志文件是用戶管理和監(jiān)控 Apache 安全的非常好的第一手資料,它清晰地記錄了客戶端訪問 Apache 服務(wù)器資源的每一條記錄,以及在訪問中出現(xiàn)的錯(cuò)誤信息,可以這樣說,Apache 可以記錄 Web 訪問中感興趣的幾乎所有信息。
當(dāng)運(yùn)行 Apache 服務(wù)器時(shí)生成 4 個(gè)標(biāo)準(zhǔn)的日志文件:
其中比較常見的是訪問日志(access_log)和錯(cuò)誤日志(error_log),其中傳輸日志和 cookie 日志被 Apache 2.0 以上的版本丟棄,所以本文不討論這兩種日志。當(dāng)然,如果使用 SSL 服務(wù)的話,還可能存在 ssl_access_log、ssl_error_log 和 ssl_request_log 三種日志文件。
另外,值得注意的是:上述幾種日志文件如果長度過大,還可能生成注入 access_log.1,error_log.2 等的額外文件,其格式與含義與上述幾種文件相同,只不過系統(tǒng)自動(dòng)為其進(jìn)行命名而已。
Apache 中提供如下 4 條與日志相關(guān)的配置指令:
在上述幾個(gè)文件當(dāng)中,除了 error_log 和 ssl_error_log 之外,所有日志文件以由 CustomLog 和 LogFormat 指令指定的格式生成。這些指令在 httpd.conf 文件中出現(xiàn)。使用 LogFormat 指令可以定義新的日志文件格式:
LogFormat “%h %l %u %t \ “%> %s %b “common
假定使用的是 common 日志格式或者 combined 日志格式,這兩種格式都在默認(rèn)的配置文件中定義。表 1 列出了 LogFormat 語句可以使用的變量:
表 1. LogFormat 語句的變量
變 量 | 含 義 |
---|---|
%b | 發(fā)送字節(jié),不包括 HTTP 標(biāo)題 |
%f | 文件名 |
%{VARIABLE}e | 環(huán)境變量 VARIABLE 的內(nèi)容 |
%h | 遠(yuǎn)程主機(jī) |
%a | 遠(yuǎn)程 IP 地址 |
%{HEADER}i | HEADER 內(nèi)容;發(fā)送到服務(wù)器的請求的標(biāo)題行 |
%l | 遠(yuǎn)程登錄名(如果提供該值,則從 identd 獲得) |
%{NOTE}n | 來自另一個(gè)模塊的 NOTE 通知的內(nèi)容 |
%{HEADER}o | HEADER 的內(nèi)容,回復(fù)中的標(biāo)題行 |
%p | 服務(wù)器服務(wù)于請求的規(guī)范端口 |
%P | 服務(wù)于請求的子進(jìn)程的 ID |
%r | 請求的第一行 |
%s | 狀態(tài)。對于內(nèi)部重定向的請求,該狀態(tài)為初始請求—最后是 %>s |
%t | 時(shí)間,格式為 common 日志格式中的時(shí)間格式 |
%{format}t | 時(shí)間,格式由 format 給出??梢允?strftime(3)格式 |
%T | 服務(wù)請求花費(fèi)的時(shí)間,以秒計(jì) |
%u | 來自 auth 的遠(yuǎn)程用戶;如果返回的狀態(tài)(%s)為 401 則可能是假的 |
%U | 請求的 URL 路徑 |
%v | 服務(wù)于該請求的服務(wù)器的規(guī)范 ServerName |
在每個(gè)變量中,可以在前面設(shè)置一個(gè)條件,決定是否顯示該變量。如果不顯示,則顯示 -。這些條件是數(shù)值返回值列表的形式。另外,還可以使用 CustomLog 指令指定日志文件的位置和格式。如果沒有指定日志文件的絕對路徑,則日志文件的位置假定為相對于 ServerRoot。下面是 httpd.conf 文件中指定日志文件的語句:
// // The location and format of the access logfile(Common Logfile Format). // If you do not define any access logfiles within a <VirtualHost> // container, they will be logged here. Contrariwise, if you *do* // define per-<VirtualHost> access logfiles, transactions will be // logged therein and *not* in this file. // CustomLog logs/access_log common ErrorLog logs/error_log
一般說來,Apache 中的錯(cuò)誤日志記錄等級有如表 2 所示的八類:
表 2. 錯(cuò)誤日志記錄的等級
緊急性 | 等級 | 解釋 |
---|---|---|
1 | Emerg | 出現(xiàn)緊急狀況使得系統(tǒng)不可用 |
2 | Alert | 需要立即引起注意的狀況 |
3 | Crit | 危險(xiǎn)情況的警告 |
4 | Error | 除上述 3 種情況之外的其他錯(cuò)誤 |
5 | Warn | 警告信息 |
6 | Notice | 需要引起注意的情況,不如第 4 和第 5 類重要 |
7 | Info | 需要報(bào)告的一般消息 |
8 | Debug | 運(yùn)行于 debug 模式的程序產(chǎn)生的消息 |
另外,在 Apache 中,將訪問日志分為如下 4 類:
在實(shí)際的使用過程中,由于綜合日志格式有效地結(jié)合了其他 3 種日志格式和信息,所以在配制訪問日志時(shí),可以有兩種方式:
(1)分別使用 3 個(gè)文件進(jìn)行分別記錄,相應(yīng)配置示例如下:
LogFormat “%h %l %u %t \ “%r\” %>s %b” common LogFormat “%{Referer}i->%U” referer LogFormat “%{Apache User-agent}i” agent CustomLog logs/access_log common CustomLog logs/referer_log referer CustomLog logs/agent_log agent
(2)使用一個(gè)綜合文件進(jìn)行記錄,相應(yīng)配置示例如下:
LogFormat “%h %l %u %t \ “%r\” %>s %b \”%{Referer}i\” \ “%{Apache User-Agent}i\””combinedCustomLog logs/access_log combined