Apache一直是世界上使用率排名前三的Web服務(wù)器軟件。企業(yè)使用其構(gòu)建Web應(yīng)用,從很大程度上都需要對(duì)其安全性進(jìn)行綜合考慮,以保證能夠應(yīng)對(duì)拒絕服務(wù)攻擊、流量竊聽、數(shù)據(jù)泄漏等網(wǎng)絡(luò)威脅,從而保證企業(yè)門戶網(wǎng)站的安全。
除了使用業(yè)界流行的防火墻、IDS/IPS(入侵檢測(cè)系統(tǒng)/入侵防御系統(tǒng))、WAF(Web應(yīng)用防火墻)、UTM(統(tǒng)一威脅管理)等外部安全設(shè)備對(duì)Apache服務(wù)進(jìn)行安全防護(hù)外,作為一種優(yōu)秀的開源服務(wù)器軟件,Apache本身就具有很多優(yōu)秀的特性可以為服務(wù)器管理員提供安全配置,以防范各種網(wǎng)絡(luò)攻擊。因此,充分、高效地挖掘Apache服務(wù)器的自身安全能力也是企業(yè)安全工作者一個(gè)必備的技能。基于此,本文將從4個(gè)方面詳細(xì)剖析Apache服務(wù)器的安全防護(hù)要點(diǎn)。
策略一:服務(wù)器端安全設(shè)置
1.限制root用戶運(yùn)行Apache服務(wù)器
一般情況下,在Linux下啟動(dòng)Apache服務(wù)器的進(jìn)程httpd需要root權(quán)限。由于root權(quán)限太大,存在許多潛在的安全威脅。一些管理員為了安全起見,認(rèn)為httpd服務(wù)器不可能沒有安全漏洞,因而更愿意使用普通用戶的權(quán)限來啟動(dòng)服務(wù)器。http.conf主配置文件里面有如下兩個(gè)配置是Apache的安全保證,Apache在啟動(dòng)后,就將其本身設(shè)置為這兩個(gè)選項(xiàng)設(shè)置的用戶和組權(quán)限進(jìn)行運(yùn)行,降低了服務(wù)器的危險(xiǎn)性。
User apache
Group apache
需要特別指出的是:以上兩個(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),因而保證了安全。
2.向客戶端隱藏Apache服務(wù)器的相關(guān)信息
Apache服務(wù)器的版本號(hào)可作為黑客入侵的重要信息被利用,通常他們?cè)讷@得版本號(hào)后,通過網(wǎng)上搜索針對(duì)該版本服務(wù)器的漏洞,從而使用相應(yīng)的技術(shù)和工具有針對(duì)性的入侵,這也是滲透測(cè)試的一個(gè)關(guān)鍵步驟。因此,為了避免一些不必要的麻煩和安全隱患,可以通過主配置文件httpd.conf下的如下兩個(gè)選項(xiàng)進(jìn)行:
(1)ServerTokens:該選項(xiàng)用于控制服務(wù)器是否響應(yīng)來自客戶端的請(qǐ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)于版本號(hào)等相關(guān)信息。安全情況下應(yīng)該將其狀態(tài)設(shè)為off。
圖1和圖2為安全設(shè)定這兩個(gè)選項(xiàng)前后正常情況下和錯(cuò)誤情況下的輸出頁面(通過Rhel5中的Mozilla Firefox瀏覽器訪問Rhel5中的Apache服務(wù)器)的詳細(xì)對(duì)比。可以清楚看到,安全設(shè)定選項(xiàng)后,可以充分地向客戶端用戶隱藏Linux操作系統(tǒng)信息和Apache服務(wù)器版本信息。
圖1 錯(cuò)誤情況下未設(shè)定安全選項(xiàng)前示意
圖2 操作情況下使用安全設(shè)定后的對(duì)比
3.設(shè)置虛擬目錄和目錄權(quán)限
要從主目錄以外的其他目錄中進(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è)虛擬目錄,它們對(duì)應(yīng)的物理路徑分別是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用戶可以看到如下配置語句:
Alias /icons/ "/var/www/icons/"
Alias /manual "/var/www/manual"
在實(shí)際使用過程中,用戶可以自己創(chuàng)建虛擬目錄。比如,創(chuàng)建名為/user的虛擬目錄,它所對(duì)應(yīng)的路徑為上面幾個(gè)例子中常用的/var/www/html/rhel5:
Alias /test "/var/www/html/rhel5"
如果需要對(duì)其進(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)行測(cè)試驗(yàn)證,采用別名對(duì)該目錄中的文件進(jìn)行訪問,瀏覽結(jié)果如圖3所示。
圖3 使用虛擬目錄的測(cè)試結(jié)果
#p#副標(biāo)題#e#
策略二:限制Apache服務(wù)的運(yùn)行環(huán)境
Apache服務(wù)器需要綁定到80端口上來監(jiān)聽請(qǐng)求,而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)行限制在指定目錄中,保證該軟件只能對(duì)該目錄及其子目錄的文件有所動(dòng)作,從而保證整個(gè)服務(wù)器的安全。在這種情況下,即使出現(xiàn)黑客或者不法用戶通過該軟件破壞或侵入系統(tǒng),Linux系統(tǒng)所受的損壞也僅限于該設(shè)定的根目錄,而不會(huì)影響到系統(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è)命令的基本用途如下所示:
•mkjailenv:用于創(chuàng)建chroot“監(jiān)牢”目錄,并且從真實(shí)文件系統(tǒng)中拷貝基本的軟件環(huán)境。
•addjailsw:用于從真實(shí)文件系統(tǒng)中拷貝二進(jìn)制可執(zhí)行文件及其相關(guān)的其它文件(包括庫文件、輔助性文件和設(shè)備文件)到該“監(jiān)牢”中。
•addjailuser:創(chuàng)建新的chroot“監(jiān)牢”用戶。
采用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)閖ail會(huì)調(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
#p#副標(biāo)題#e#
策略三:啟用Apache自帶安全模塊保護(hù)
Apache的一個(gè)優(yōu)勢(shì)便是其靈活的模塊結(jié)構(gòu),其設(shè)計(jì)思想也是圍繞模塊(module)概念而展開的。安全模塊是Apache Server中的極其重要的組成部分。這些安全模塊負(fù)責(zé)提供Apache server的訪問控制和認(rèn)證,授權(quán)等一系列至關(guān)重要的安全服務(wù)。
Apache下有如下幾類與安全相關(guān)的模塊:
•mod_access模塊能夠根據(jù)訪問者的IP地址(或域名,主機(jī)名等)來控制對(duì)Apache服務(wù)器的訪問,稱之為基于主機(jī)的訪問控制。
•mod_auth模塊用來控制用戶和組的認(rèn)證授權(quán)(Authentication)。用戶名和口令存于純文本文件中。
•mod_auth_db和mod_auth_dbm模塊則分別將用戶信息(如名稱、組屬和口令等)存于Berkeley-DB及DBM型的小型數(shù)據(jù)庫中,便于管理及提高應(yīng)用效率。
•mod_auth_digest模塊則采用MD5數(shù)字簽名的方式來進(jìn)行用戶的認(rèn)證,但它相應(yīng)的需要客戶端的支持。
•mod_auth_anon模塊的功能和mod_auth的功能類似,只是它允許匿名登錄,將用戶輸入的E-mail地址作為口令。
•mod_ssl被Apache用于支持安全套接字層協(xié)議,提供Internet上安全交易服務(wù),如電子商務(wù)中的一項(xiàng)安全措施。通過對(duì)通信字節(jié)流加密來防止敏感信息的泄漏。但是,Apache這種支持是建立在對(duì)Apache的API擴(kuò)展來實(shí)現(xiàn)的,相當(dāng)于一個(gè)外部模塊,通過與第三方程序(如openssl)的結(jié)合提供安全的網(wǎng)上交易支持。
為了能夠使用模塊功能,模塊通常以DSO(Dynamic Shared Object)的方式構(gòu)建,用戶應(yīng)該在httpd.conf文件中使用LoadModule指令,使得能夠在使用前獲得模塊的功能。下面是主配置文件中各個(gè)模塊的情況,開啟安全模塊非常簡單,即去掉在各安全模塊所在行前的“#”符號(hào)即可,如下所示:
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)的訪問控制和通信加密功能。
#p#副標(biāo)題#e#
策略四:訪問控制策略設(shè)置
在開啟了相應(yīng)的安全模塊后,還需要對(duì)Apache的訪問控制策略進(jìn)行設(shè)定。
1.認(rèn)證和授權(quán)指令
目前,有兩種常見的認(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è)針對(duì)客戶端的挑戰(zhàn)(challenge)信息,可以有效地避免基本認(rèn)證方式可能遇到的“重放攻擊”。值得注意的是:目前并非所有的瀏覽器都支持摘要認(rèn)證方式。
所有的認(rèn)證配置指令既可以出現(xiàn)在主配置文件httpd.conf中的Directory容器中,也可以出現(xiàn)在單獨(dú)的.htaccess文件中,這個(gè)可以由用戶靈活地選擇使用。在認(rèn)證配置過程中,需要用到如下指令選項(xiàng):
•AuthName:用于定義受保護(hù)區(qū)域的名稱。
•AuthType:用于指定使用的認(rèn)證方式,包括上面所述的Basic和Digest兩種方式。
•AuthGroupFile:用于指定認(rèn)證組文件的位置。
•AuthUserFile:用戶指定認(rèn)證口令文件的位置。
使用上述的認(rèn)證指令配置認(rèn)證后,需要為Apache服務(wù)器的訪問對(duì)象,也就是指定的用戶和組進(jìn)行相應(yīng)的授權(quán),以便于他們對(duì)Apache服務(wù)器提供的目錄和文件進(jìn)行訪問。為用戶和組進(jìn)行授權(quán)需要使用Require指令,主要可以使用以下三種方式進(jìn)行授權(quán):
•授權(quán)給指定的一個(gè)或者多個(gè)用戶:使用Require user 用戶名1 用戶名2 …。
•授權(quán)給指定的一個(gè)或者多個(gè)組:使用Require group 用戶名1 用戶名2 …。
•授權(quán)給指定口令文件中的所有用戶:使用Require valid-user。
2.管理認(rèn)證口令文件和認(rèn)證組文件
要實(shí)現(xiàn)用戶認(rèn)證功能,首先要建立保存用戶名和口令的文件。Apache自帶的htpasswd命令提供了建立和更新存儲(chǔ)用戶名、密碼的文本文件的功能。需要注意的是,這個(gè)文件必須放在不能被網(wǎng)絡(luò)訪問的位置,以避免被下載和信息泄漏。建議將口令文件放在/etc/httpd/目錄或者其子目錄下。
下面的例子在/etc/httpd目錄下創(chuàng)建一個(gè)文件名為passwd_auth的口令文件,并將用戶rhel5添加入認(rèn)證口令文件。使用以下命令建立口令文件(過程中還會(huì)提示輸入該用戶的口令):
# touch passwd_auth
# htpasswd -c /etc/httpd/passwd_auth rhel5
New password:
Re-type new password:
Adding password for user rhel5
命令執(zhí)行的過程中系統(tǒng)會(huì)要求用戶為rhel5用戶輸入密碼。上述命令中的-c選項(xiàng)表示無論口令文件是否已經(jīng)存在,都會(huì)重新寫入文件并刪去原有內(nèi)容。所以在添加第2個(gè)用戶到口令文件時(shí),就不需要使用-c選項(xiàng)了,如下命令所示
# htpasswd /etc/httpd/passwd_auth testuser
3.認(rèn)證和授權(quán)使用實(shí)例
(1)使用主配置文件配置用戶認(rèn)證及授權(quán)
在本例子中,用戶可以在Apache的主配置文件httpd.conf中加入以下語句建立對(duì)目錄/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>
在上述例子中,使用了如下指令:
•AllowOverride:該選項(xiàng)定義了不使用.htaccess文件。
•AuthType Basic:AuthType選項(xiàng)定義了對(duì)用戶實(shí)施認(rèn)證的類型,最常用的是由mod_auth提供的Basic。
•AuthName:定義了Web瀏覽器顯示輸入用戶/密碼對(duì)話框時(shí)的領(lǐng)域內(nèi)容。
•AuthUserFile:定義了口令文件的路徑,即使用htpasswd建立的口令文件。
•Require user:定義了允許哪些用戶訪問,各用戶之間用空格分開。
需要注意的是:在AuthUserFile選項(xiàng)定義中,還需要使用如下語句事先建立認(rèn)證用戶patterson和testuser,該選項(xiàng)中的定義才能生效:
#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_auth testuser
(2)使用.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