Apache 一直是世界上使用率排名前三的 Web 服務器軟件。企業使用其構建 Web 應用,從很大程度上都需要對其安全性進行綜合考慮,以保證能夠應對拒絕服務攻擊、流量竊聽、數據洩漏等網絡威脅,從而保證企業門戶網站的安全。除了使用業界流行的防火牆、IDS/IPS(入侵檢測系統 / 入侵防御系統)、WAF(Web 應用防火牆)、UTM(統一威脅管理)等外部安全設備對 Apache 服務進行安全防護外,作為一種優秀的開源服務器軟件,Apache 本身就具有很多優秀的特性可以為服務器管理員提供安全配置,以防范各種網絡攻擊。因此,充分、高效地挖掘 Apache 服務器的自身安全能力也是企業安全工作者一個必備的技能。基於此,本文將通過大量的實例,從服務器安全設置、運行環境安全保障、安全模塊保護、日志管理等 6 個方面詳細剖析 Apache 服務器的安全防護要點。
Web 服務器也稱為 WWW 服務器或 HTTP 服務器 (HTTP Server),它是 Internet 上最常見也是使用最頻繁的服務器之一,Web 服務器能夠為用戶提供網頁浏覽、論壇訪問等等服務。
由於用戶在通過 Web 浏覽器訪問信息資源的過程中,無須再關心一些技術性的細節,而且界面非常友好,因而 Web 在 Internet 上一推出就得到了爆炸性的發展。現在 Web 服務器已經成為 Internet 上最大的計算機群,Web 文檔之多、鏈接的網絡之廣,也令人難以想像。因此,Web 服務器軟件的數量也開始增加,Web 服務器軟件市場的競爭也越來越激烈。本文所討論的就是一款最常用的 Web 服務器軟件—— Apache。
Apache 是一個免費的軟件,用戶可以免費從 Apache 的官方網站下載。任何人都可以參加其組成部分的開發。Apache 允許世界各地的人對其提供新特性。當新代碼提交到 Apache Group 後,Apache Group 對其具體內容進行審查並測試和質量檢查。如果他們滿意,該代碼就會被集成到 Apache 的主要發行版本中。
Apache 的其他主要特征有:
一般說來,Apache 服務器主要面臨如下幾種網絡威脅:
要應對上述這些安全威脅,要從 Apache 服務器端配置、運行環境、通信鏈路安全保障、安全模塊使用、日志管理等各方面、全方位的進行保障,下面將進行分門別類的詳細介紹。
一般情況下,在 Linux 下啟動 Apache 服務器的進程 httpd 需要 root 權限。由於 root 權限太大,存在許多潛在的對系統的安全威脅。一些管理員為了安全的原因,認為 httpd 服務器不可能沒有安全漏洞,因而更願意使用普通用戶的權限來啟動服務器。http.conf 主配置文件裡面有如下 2 個配置是 Apache 的安全保證,Apache 在啟動之後,就將其本身設置為這兩個選項設置的用戶和組權限進行運行,這樣就降低了服務器的危險性。
User apache
Group apache
需要特別指出的是:以上 2 個配置在主配置文件裡面是默認選項,當采用 root 用戶身份運行 httpd 進程後,系統將自動將該進程的用戶組和權限改為 apache,這樣,httpd 進程的權限就被限制在 apache 用戶和組范圍內,因而保證了安全。
Apache 服務器的版本號可以作為黑客入侵的重要信息進行利用,他們通常在獲得版本號後,通過網上搜索針對該版本服務器的漏洞,從而使用相應的技術和工具有針對性的入侵,這也是滲透測試的一個關鍵步驟。因此,為了避免一些不必要的麻煩和安全隱患,可以通過主配置文件 httpd.conf 下的如下兩個選項進行:
(1)ServerTokens:該選項用於控制服務器是否響應來自客戶端的請求,向客戶端輸出服務器系統類型或者相應的內置模塊等重要信息。Red Hat Enterprise Linux 5 操作系統在主配置文件中提供全局默認控制阈值為 OS,即 ServerTokens OS。它們將向客戶端公開操作系統信息和相關敏感信息,所以保證安全情況下需要在該選項後使用“ProductOnly”,即 ServerTokens ProductOnly。
(2)ServerSignature:該選項控制由系統生成的頁面(錯誤信息等)。默認情況下為 off,即 ServerSignature off,該情況下不輸出任何頁面信息。另一情況為 on,即 ServerSignature on,該情況下輸出一行關於版本號等相關信息。安全情況下應該將其狀態設為 off。
圖 1 和圖 2 為安全設定這兩個選項前後正常情況下和錯誤情況下的輸出頁面(通過 Rhel5 中的 Mozilla Firefox 浏覽器訪問 Rhel5 中的 Apache 服務器)的詳細對比。可以清楚看到,安全設定選項後,可以充分地向客戶端用戶隱藏 Linux 操作系統信息和 Apache 服務器版本信息。
圖 1. 錯誤情況下未設定安全選項前示意
圖 2. 操作情況下使用安全設定後的對比
要從主目錄以外的其他目錄中進行發布,就必須創建虛擬目錄。虛擬目錄是一個位於 Apache 的主目錄外的目錄,它不包含在 Apache 的主目錄中,但在訪問 Web 站點的用戶看來,它與位於主目錄中的子目錄是一樣的。每個虛擬目錄都有一個別名,用戶 Web 浏覽器中可以通過此別名來訪問虛擬目錄,如 http:// 服務器 IP 地址 / 別名 / 文件名,就可以訪問虛擬目錄下面的任何文件了。
使用 Alias 選項可以創建虛擬目錄。在主配置文件中,Apache 默認已經創建了兩個虛擬目錄。這兩條語句分別建立了“/icons/”和“/manual”兩個虛擬目錄,它們對應的物理路徑分別是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用戶可以看到如下配置語句:
1 2 3Alias
/icons/
“
/var/www/icons/
”
Alias
/manual
“
/var/www/manual
”
在實際使用過程中,用戶可以自己創建虛擬目錄。比如,創建名為 /user 的虛擬目錄,它所對應的路徑為上面幾個例子中常用的 /var/www/html/rhel5:
1Alias
/test
“
/var/www/html/rhel5
″
如果需要對其進行權限設置,可以加入如下語句:
1 2 3 4 5 6<
Directory
“/var/www/html/rhel5”>
AllowOverride None
Options Indexes
Order allow,deny
Allow from all
Directory
>
設置該虛擬目錄和目錄權限後,可以使用客戶端浏覽器進行測試驗證,采用別名對該目錄中的文件進行訪問,浏覽結果如圖 3 所示。
Apache 服務器需要綁定到 80 端口上來監聽請求,而 root 是唯一有這種權限的用戶,隨著攻擊手段和強度的增加,這樣會使服務器受到相當大的威脅,一但被利用緩沖區溢出漏洞,就可以控制整個系統。為了進一步提高系統安全性,Linux 內核引入 chroot 機制,chroot 是內核中的一個系統調用,軟件可以通過調用函數庫的 chroot 函數,來更改某個進程所能見到的根目錄。
chroot 機制即將某軟件運行限制在指定目錄中,保證該軟件只能對該目錄及其子目錄的文件有所動作,從而保證整個服務器的安全。在這種情況下,即使出現黑客或者不法用戶通過該軟件破壞或被侵入系統,Linux 系統所受的損壞也僅限於該設定的根目錄,而不會影響到整個系統的其他部分。
將軟件 chroot 化的一個問題是該軟件運行時需要的所有程序、配置文件和庫文件都必須事先安裝到 chroot 目錄中,通常稱這個目錄為 chroot“監牢”。如果在“監牢”中運行 httpd,那麼用戶根本看不到 Linux 文件系統中那個真正的目錄,從而保證了 Linux 系統的安全。
在使用該技術的時候,一般情況下需要事先創建目錄,並將守護進程的可執行文件 httpd 復制到其中。同時,由於 httpd 需要幾個庫文件,所以需要把 httpd 程序依賴的幾個 lib 文件同時也拷貝到同一個目錄下,因此手工完成這一工作是非常麻煩的。幸運的是,用戶可以通過使用開源的 jail 軟件包來幫助簡化 chroot“監牢”建立的過程,具體步驟如下所示:Jail 官方網站是:http://www.jmcresearch.com/projects/。
首先將其下載,然後執行如下命令進行源代碼包的編譯和安裝:
1 2 3#tar xzvf jail_1.9a.tar.gz
#cd jail/src
#make
jail 軟件包提供了幾個 Perl 腳本作為其核心命令,包括 mkjailenv、addjailuser 和 addjailsw,他們位於解壓後的目錄 jail/bin 中。這幾個命令的基本用途如下所示:
采用 jail 創建監牢的步驟如下所示;
(1)首先需要停止目前運行的 httpd 服務,然後建立 chroot 目錄,命令如下所示。該命令將 chroot 目錄建立在路徑 /root/chroot/httpd 下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15# 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 <[email protected]>
Making chrooted environment into
/root/chroot/httpd
Doing preinstall()
Doing special_devices()
Doing gen_template_password()
Doing postinstall()
Done.
(2)為“監牢”添加 httpd 程序,命令如下:
1 2 3 4 5 6 7 8 9 10 11 12 13# ./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 <[email protected]>
Guessing
/usr/sbin/httpd
args(0)
Warning: can't create
/proc/mounts
from the
/proc
filesystem
Done.
在上述過程中,用戶不需要在意那些警告信息,因為 jail 會調用 ldd 檢查 httpd 用到的庫文件。而幾乎所有基於共享庫的二進制可執行文件都需要上述的幾個庫文件。
(3)然後,將 httpd 的相關文件拷貝到“監牢”的相關目錄中,命令如下所示:
1 2 3# mkdir -p /root/chroot/httpd/etc
# cp – a /etc/httpd /root/chroot/httpd/etc/
。。。。。。
添加後的目錄結構如下所示:
1 2 3 4 5 6 7 8 9# ll
總計 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)重新啟動 httpd,並使用 ps 命令檢查 httpd 進程,發現該進程已經運行在監牢中,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14# 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 的一個優勢便是其靈活的模塊結構,其設計思想也是圍繞模塊(module)概念而展開的。安全模塊是 Apache Server 中的極其重要的組成部分。這些安全模塊負責提供 Apache server 的訪問控制和認證,授權等一系列至關重要的安全服務。
Apache 下有如下幾類與安全相關的模塊:
為了能夠使用模塊功能,模塊通常以 DSO(Dynamic Shared Object)的方式構建,用戶應該在 httpd.conf 文件中使用 LoadModule 指令,使得能夠在使用前獲得模塊的功能。如下為主配置文件中各個模塊的情況,開啟安全模塊非常簡單,即去掉在各安全模塊所在行前的“#”符號即可,如下所示:
1 2 3 4 5LoadModule 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
。。。。。。
只有將上述安全模塊進行開啟後 ,Apache 才能實現相應的訪問控制和通信加密功能。
在開啟了相應的安全模塊後,還需要對 Apache 的訪問控制策略進行設定。
目前,有兩種常見的認證類型,基本認證和摘要認證:
(1)基本認證(Basic):使用最基本的用戶名和密碼方式進行用戶認證。
(2)摘要認證(Digest):該認證方式比基本認證要安全得多,在認證過程中額外使用了一個針對客戶端的挑戰(challenge)信息,可以有效地避免基本認證方式可能遇到的“重放攻擊”。值得注意的是:目前並非所有的浏覽器都支持摘要認證方式。
所有的認證配置指令既可以出現在主配置文件 httpd.conf 中的 Directory 容器中,也可以出現在單獨的 .htaccess 文件中,這個可以由用戶靈活地選擇使用。在認證配置過程中,需要用到如下指令選項:
使用上述的認證指令配置認證之後,需要為 Apache 服務器的訪問對象,也就是指定的用戶和組進行相應的授權,以便於他們對 Apache 服務器提供的目錄和文件進行訪問。為用戶和組進行授權需要使用 Require 指令,它主要可以使用如下三種方式進行授權:
要實現用戶認證功能,首先要建立保存用戶名和口令的文件。Apache 自帶的 htpasswd 命令提供了建立和更新存儲用戶名、密碼的文本文件的功能。需要注意的是,這個文件必須放在不能被網絡訪問的位置,以避免被下載和信息洩漏。建議將口令文件放在 /etc/httpd/ 目錄或者其子目錄下。
下面的例子在 /etc/httpd 目錄下創建一個文件名為 passwd_auth 的口令文件,並將用戶 rhel5 添加入認證口令文件。使用以下命令建立口令文件(過程中還會提示輸入該用戶的口令):
1 2 3 4 5# touch passwd_auth
# htpasswd -c /etc/httpd/passwd_auth rhel5
New password:
Re-
type
new password:
Adding password
for
user rhel5
命令執行的過程中系統會要求用戶為 rhel5 用戶輸入密碼。上述命令中的 -c 選項表示無論口令文件是否已經存在,都會重新寫入文件並刪去原有內容。所以在添加第 2 個用戶到口令文件時,就不需要使用 -c 選項了,如下命令所示
1# htpasswd /etc/httpd/passwd_auth testuser
配置指令
Apache 實現訪問控制的配置指令包括如下三種:
(1)order 指令:用於指定執行允許訪問控制規則或者拒絕訪問控制規則的順序。order 只能設置為 Order allow,deny 或 Order deny,allow,分別用來表明用戶先設置允許的訪問地址還是先設置禁止訪問的地址。Order 選項用於定義缺省的訪問權限與 Allow 和 Deny 語句的處理順序。Allow 和 Deny 語句可以針對客戶機的域名或 IP 地址進行設置,以決定哪些客戶機能夠訪問服務器。Order 語句設置的兩種值的具體含義如下:
(2)allow 指令:指明允許訪問的地址或地址序列。如 allow from all 指令表明允許所有 IP 來的訪問請求。
(3)deny 指令:指明禁止訪問的地址或地址序列。如 deny from all 指令表明禁止所有 IP 來的訪問請求。
應用實例
下面舉幾個簡單的例子對上述 order、allow 和 deny 命令的使用進行示范。
(1)在下面的例子中,admin.org 域中所有主機都允許訪問網站,而其他非該域中的任何主機訪問都被拒絕,因為 Deny 在前,Allow 在後,Allow 語句覆蓋了 Deny 語句:
1 2 3Order Deny,Allow
Deny from all
Allow from admin.org
(2)下面例子中,admin.org 域中所有主機,除了 db.admin.org 子域包含的主機被拒絕訪問以外,都允許訪問。而所有不在 admin.org 域中的主機都不允許訪問,因為缺省狀態是拒絕對服務器的訪問(Allow 在前,Deny 在後,Deny 語句覆蓋了 Allow 語句):
1 2 3Order Allow,Deny
Allow from admin.org
Deny from db.admin.org
使用主配置文件配置用戶認證及授權
在本例子中,用戶可以在 Apache 的主配置文件 httpd.conf 中加入以下語句建立對目錄 /var/www/html/rhel5 訪問的用戶認證和授權機制:
1 2 3 4 5 6 7<
Directory
"/var/www/html/rhel5">
AllowOverride None
AuthType Basic
AuthName "rhel5"
AuthUserFile /etc/httpd/passwd_auth
Require user rhel5 testuser
Directory
>
在上述例子中,使用了如下指令:
需要注意的是:在 AuthUserFile 選項定義中,還需要使用如下語句事先建立認證用戶 patterson 和 testuser,該選項中的定義才能生效:
1 2#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_auth testuser
使用 .htaccess 文件配置用戶認證和授權
在本例子中,為了完成如上述例子同樣的功能,需要先在主配置文件中加入如下語句:
1 2 3<
Directory
“/var/www/html/rhel5”>
AllowOverride AuthConfig
Directory
>
上述語句中的 AllowOverride 選項允許在 .htaccess 文件中使用認證和授權指令。、、然後,在 .htaccess 文件中添加如下語句即可:
1 2 3 4AuthType Basic
AuthName
"Please Login:"
AuthUserFile
/etc/httpd/passwd_auth
Require user rhel5 testuser
同理,在 AuthUserFile 選項定義中,還需要使用如下語句事先建立認證用戶 patterson 和 testuser,該選項中的定義才能生效:
1 2 3#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_auth testuser
在 SSL 通信中,首先采用非對稱加密交換信息,使得服務器獲得浏覽器端提供的對稱加密的密鑰,然後利用該密鑰進行通信過程中信息的加密和解密。為了保證消息在傳遞過程中沒有被篡改,可以加密 Hash 編碼來確保信息的完整性。服務器數字證書主要頒發給 Web 站點或其他需要安全鑒別的服務器,證明服務器的身份信息,同樣客戶端數字證書用於證明客戶端的身份。
使用公用密鑰的方式可以保證數據傳輸沒有問題,但如果浏覽器客戶訪問的站點被假冒,這也是一個嚴重的安全問題。這個問題不屬於加密本身,而是要保證密鑰本身的正確性問題。要保證所獲得的其他站點公用密鑰為其正確的密鑰,而非假冒站點的密鑰,就必須通過一個認證機制,能對站點的密鑰進行認證。當然即使沒有經過認證,仍然可以保證信息傳輸安全,只是客戶不能確信訪問的服務器沒有被假冒。如果不是為了提供電子商務等方面對安全性要求很高的服務,一般不需要如此嚴格的考慮
。
下面給出使用 SSL 進行通信的過程(參見圖 4):
(1)客戶端向服務器端發起對話,協商傳送加密算法。例如:對稱加密算法有 DES、RC5,密鑰交換算法有 RSA 和 DH,摘要算法有 MD5 和 SHA。
(2)服務器向客戶端發送服務器數字證書。比如:使用 DES-RSA-MD5 這對組合進行通信。客戶端可以驗證服務器的身份,決定是否需要建立通信。
(3)客戶端向服務器傳送本次對話的密鑰。在檢查服務器的數字證書是否正確,通過 CA 機構頒發的證書驗證了服務器證書的真實有效性之後,客戶端生成利用服務器的公鑰加密的本次對話的密鑰發送給服務器。
(4)服務器用自己的私鑰解密獲取本次通信的密鑰。
(5)雙方的通信正式開始。
在一般情況下,當客戶端是保密信息的傳遞者時,他不需要數字證書驗證自己身份的真實性,如用戶通常使用的網上銀行交易活動,客戶需要將自己的隱秘信息——賬號和密碼發送給銀行,因此銀行的服務器需要安裝數字證書來表明自己身份的有效性,否則將會使得信息洩露。當然,在某些安全性要求極高的 B2B(Business to Business)應用,服務器端也需要對客戶端的身份進行驗證,這時客戶端也需要安裝數字證書以保證通信時服務器可以辨別出客戶端的身份,驗證過程類似於服務器身份的驗證過程。另外,在一些電子商務的應用中,可能還會使用到電子簽名,或者為了信息交換的更加安全,會增加電子簽名和消息校驗碼(MAC)。而在通常情況下,浏覽器都會通過交互的方式來完成上述的通信過程,下面在 Linux 中對 Apache 采用 SSL 也會作詳細地介紹。
安裝 SSL
雖然 Apache 服務器不支持 SSL,但 Apache 服務器有兩個可以自由使用的支持 SSL 的相關計劃,一個為 Apache-SSL,它集成了 Apache 服務器和 SSL,另一個為 Apache+mod_ssl,它是通過可動態加載的模塊 mod_ssl 來支持 SSL,其中後一個是由前一個分化出的,並由於使用模塊,易用性很好,因此使用范圍更為廣泛。還有一些基於 Apache 並集成了 SSL 能力的商業 Web 服務器,然而使用這些商業 Web 服務器主要是北美,這是因為在那裡 SSL 使用的公開密鑰的算法具備專利權,不能用於商業目的,其他的國家不必考慮這個專利問題,而可以自由使用 SSL。
Apache+mod_ssl 依賴於另外一個軟件:OpenSSL,它是一個可以自由使用的 SSL 實現,首先需要安裝這個軟件。用戶可以從網站 http://www.openssl.org/source/ 上下載 Linux 下 OpenSSL 的最新穩定版本:openssl-1.0.1c.tar.gz。
下載源代碼安裝包後,使用如下的步驟安裝即可:
(1)用 openssl-1.0.1c.tar.gz 軟件包安裝 OpenSSL 之前,首先須要對該軟件包進行解壓縮和解包。用以下命令完成軟件包的解壓縮和解包:
1#tar xvfz openssl-1.0.1c.tar.gz
(2)解壓縮後,進入源碼的目錄 openssl-1.0.1c ,並使用配置腳本進行環境的設置。相應的命令為:
1 2 3 4 5//
改變當前目錄為 openssl-1.0.1c 目錄
#cd openssl-1.0.1c
//
執行該目錄下配置腳本程序
#./configure
(3)在執行 ./configure 之後,配置腳本會自動生成 Makefile。如果在設置的過程中沒有任何的錯誤,就可以開始編譯源碼了。相應的命令及其顯示結果如下:
1#make & make install
安裝好 OpenSSL 之後,就可以安裝使用 Apache+mod_ssl 了。然而為了安裝完全正確,需要清除原先安裝的 Apache 服務器的其他版本,並且還要清除所有的設置文件及其缺省設置文件,以避免出現安裝問題。最好也刪除 /usr/local/www 目錄(或更名),以便安裝程序能建立正確的初始文檔目錄。如果是一台沒有安裝過 Apache 服務器的新系統,就可以忽略這個步驟,而直接安裝 Apache+mod_ssl 了。
啟動和關閉 SSL
啟動和關閉該服務器的命令如下所示:
此時使用 start 參數為僅僅啟動普通 Apache 的 httpd 守護進程,而不啟動其 SSL 能力,而 startssl 才能啟動 Apache 的 SSL 能力。如果之前 Apache 的守護進程正在運行,便需要使用 stop 參數先停止服務器運行。
在采用 OpenSSL 進行 Apache 通信加密前,需要先產生與加密相關的認證憑證(也就是證書),如下步驟所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31# 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 []:[email protected]
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
[email protected]
Getting Private key
經過上述步驟後,將會產生三個文件 apache.csr, apache.key 和 apache.crt,然後把這三個文件拷貝到 /etc/httpd/conf/ca 目錄下即可。
然後,就可以啟動 Mozilla、IE 或其他支持 SSL 的浏覽器,輸入 URL 為:https://ssl_server/來查看服務器是否有相應,https 使用的缺省端口為 443,如果一切正常,服務器將會返回給客戶端證書,由客戶端進行驗證並且判斷,是否接受該證書並進行下一步的通信過程。
下面以 Linux 下的 Mozilla Firefox 浏覽器為例,來簡要說明使用 Apache+SSL 服務器的過程。首先,圖 5 給出了查看和驗證該證書的相關提示;最後,圖 6 則給出了證書驗證成功後,采用 SSL 進行保密傳輸的具體界面示意:
日志文件是用戶管理和監控 Apache 安全的非常好的第一手資料,它清晰地記錄了客戶端訪問 Apache 服務器資源的每一條記錄,以及在訪問中出現的錯誤信息,可以這樣說,Apache 可以記錄 Web 訪問中感興趣的幾乎所有信息。
當運行 Apache 服務器時生成 4 個標准的日志文件:
其中比較常見的是訪問日志(access_log)和錯誤日志(error_log),其中傳輸日志和 cookie 日志被 Apache 2.0 以上的版本丟棄,所以本文不討論這兩種日志。當然,如果使用 SSL 服務的話,還可能存在 ssl_access_log、ssl_error_log 和 ssl_request_log 三種日志文件。
另外,值得注意的是:上述幾種日志文件如果長度過大,還可能生成注入 access_log.1,error_log.2 等的額外文件,其格式與含義與上述幾種文件相同,只不過系統自動為其進行命名而已。
Apache 中提供如下 4 條與日志相關的配置指令:
在上述幾個文件當中,除了 error_log 和 ssl_error_log 之外,所有日志文件以由 CustomLog 和 LogFormat 指令指定的格式生成。這些指令在 httpd.conf 文件中出現。使用 LogFormat 指令可以定義新的日志文件格式:
1LogFormat “%h %l %u %t \ “%> %s %b “common
假定使用的是 common 日志格式或者 combined 日志格式,這兩種格式都在默認的配置文件中定義。表 1 列出了 LogFormat 語句可以使用的變量:
表 1. LogFormat 語句的變量
在每個變量中,可以在前面設置一個條件,決定是否顯示該變量。如果不顯示,則顯示 -。這些條件是數值返回值列表的形式。另外,還可以使用 CustomLog 指令指定日志文件的位置和格式。如果沒有指定日志文件的絕對路徑,則日志文件的位置假定為相對於 ServerRoot。下面是 httpd.conf 文件中指定日志文件的語句: 1 2 3 4 5 6 7 8 9 10//
//
The location and
format
of the access logfile(Common Logfile Format).
//
If you
do
not define any access logfiles within a
//
container, they will be logged here. Contrariwise,
if
you *
do
*
//
define per- access logfiles, transactions will be
//
logged therein and *not*
in
this
file
.
//
CustomLog logs
/access_log
common
ErrorLog logs
/error_log
一般說來,Apache 中的錯誤日志記錄等級有如表 2 所示的八類:
表 2. 錯誤日志記錄的等級
另外,在 Apache 中,將訪問日志分為如下 4 類:
在實際的使用過程中,由於綜合日志格式有效地結合了其他 3 種日志格式和信息,所以在配制訪問日志時,可以有兩種方式:
(1)分別使用 3 個文件進行分別記錄,相應配置示例如下:
1 2 3 4 5 6LogFormat “%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)使用一個綜合文件進行記錄,相應配置示例如下:
1 2 3LogFormat “%h %l %u %t \ “%r\” %>s %b \”%{Referer}i\” \
“%{Apache User-Agent}i\””combined
CustomLog logs
/access_log
combined