一、前言
還記得美國為首的北約轟炸我駐南聯盟使館,大家義憤填膺但又無可奈何,于是有黑客呼吁黑美國佬的網站,很快大家紛紛學習攻擊Web的方法和技巧,并且成功的黑了美國的幾個軍事主頁,有的還掛上了五星紅旗。這令美國政府十分尷尬。要投巨資維護Web站點的安全。另一個最近的例子是,國內最大的綜合性網站新浪在某天上午被黑客成功攻擊,其門戶頁面被換成了黃色頁面。給新浪造成了不小的副作用。這兩個例子說明了Web站點的安全是十分重要的,可以說,隨著Internet的飛速發展,Web的安全其重要性逐漸超過其他應用安全。同時,由于Web必須要有開放性,這就是說,必須讓任何人都能夠有訪問的權利,因此,使得防范更加困難。
Web的安全分為服務器安全和客戶端安全(瀏覽器),前者主要針對Web的構建者,后者針對普通的用戶。本章將就這兩方面展開討論。
二、什么是HTTP
HTTP(Hypertext Transfer Protocol)超文本傳輸協議允許用戶從WWW(World Wide Web)以及其他分布式信息系統請求和接受超文本的內容。它運行在TCP之上并用綁定服務器端口80,然后它還可以使用其他端口和協議來提供一個可靠的數據流。它是一個請求/響應協議。為了獲得信息,一個瀏覽器客戶程序(如netscape)向一個Apache服務器建立一個TCP連接并請求一個資源(“GET”)。服務器檢查請求并根據服務器配置和包含的內容進行響應。服務器也許發送一個超文本標記語言(HTML)文件、文本、圖片、聲音、影像或一個java applet,它們可以在瀏覽器顯示出來。服務器也可以運行一個程序來響應瀏覽器的請求(如通用網關接口或服務器的應用程序接口)。
測試HTTP連接的一個簡易方法(同時也是一個潛在的安全漏洞)是telnet到一個Web服務器主機的端口80??梢暂斎搿癎ET/”來瀏覽站點的基本HTML文檔(如index.html),如下所示(去掉了HTML內容):
$ telnet 80
Trying…
Connected to .
Escape character is ‘^]’
(在此敲入GET /) GET /
下面刷的出來一個html的文件,例如:
<html>
<head>
<title>老虎之家</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<frameset rows="128,327*" frameborder="YES" border="0" framespacing="0" cols="*
<frame name="topFrame" scrolling="NO" noresize src="index-3.html" >
<frame name="mainFrame" src="index-2.html">
</frameset>
<noframes><body bgcolor="#FFFFFF">
</body></noframes>
</html>
Connection closed by foreign host.
三、安全風險的分類
Web安全風險一般可以分為三類:
1.服務器的風險
通常的網絡安全總是設置各種各樣的限制,使得不明身份的人無法獲得非授權的服務但是Web服務器恰恰相反,它希望接受盡可能多的客戶,對客戶幾乎沒有任何限制和要求,好了,這樣,相對于其他網絡服務器,Web是最容易受到攻擊的。最常見的威脅是HTTP服務器軟件中的bug、錯誤的配置、不安全的CGI程序或者缺乏強大的機密功能等等。服務器通常受到的侵害有:修改和替換服務器提供的內容;獲得對服務器訪問控制保護的保密文檔的訪問權;在服務器上執行任意命令并破壞服務器的系統安全;檢查日志文件來危害用戶的隱私;進行服務拒絕攻擊,使服務器或者網絡連接失敗。
2.客戶端風險
瀏覽網頁是一個并不十分安全的活動。Bug、不合適的“活躍內容”和腳本以及服務器管理可以帶給瀏覽者如下危害:應用程序和系統崩潰;包括病毒和特洛一木馬在內的惡意代碼;丟失保密的信息;隱私被侵犯等等。
主要的Web瀏覽器都支持下載嵌在HTML主頁中的腳本并在瀏覽器中執行他們的功能。通常,這些程序用來與用戶交互并在瀏覽器和服務器之間傳輸信息。例如,在Netscape的javascript和微軟的Vbscript中都存在過bug。甚至在沒有bug時,對一個有惡意的Web管理員來說,把能夠突破保密措施或引起嚴重損失的腳本放在HTML主頁中也是挺容易的。一種常見的攻擊方式是創建一個javascript來欺騙性的產生一個錯誤信息或一個提示來要求用戶提供網絡登錄ID和口令。其他的客戶風險來自于隱私的侵犯。許多Web站點為客戶寫了一個驗證cookie,cookie可以跟蹤用戶并暴露他們去了什么站點。按照指定cookie處理的RFC的要求,客戶軟件應提供一種方式來指明cookie應該或不應該被保存的域。
3.傳輸安全
在Web客戶機和Web服務器之間傳輸的信息可能在連接的任一端或中間任何地方被竊聽或截取,包括客戶機的LAN、服務器的LAN、客戶機的ISP、服務器的ISP、兩個ISP之間的任何中介網絡。
幸運的是,目前IPSec(IP協議安全體系結構)的提出,使得網絡通信可以通過在IP層進行認證和加密。但是目前還沒有普及。
四、保護Web服務器的安全
1.選擇安全的服務器軟件
在Linux上有很多的httpd服務器軟件。例如:
* America Online Inc. AOLserver2.x
* Allegro Software RomPager 2.x
* Apache Group Apache1.x
* Hawkeye Project Hawkeye 1.x.x
* Sun Microsystems Java Server 1.x
* Idonex AB Roxen 1.x
* Spyglass Spyglass MicroServer 2.x
* Rapid Logic Inc. WebControl 2.x
* IMatix Xitami 2.x
* Zeus Technology Zeus Web Application Server 3
* VqSoft vqServer 1.x
如果大家有興趣,可以到有關的站點去訪問,了解其性能和特點。在這些軟件中,Apache無疑是最為成功的。在Internet上有超過一半的網站使用Apache。在Apache的最新版本中有以下安全特征:
* 可以通過域名、IP地址、用戶和分組來禁止訪問
* 可以配置用戶分組(而不是單獨一個用戶列表)
* 可以不重啟服務器來修改用戶訪問控制列表
* CGI可執行程序能在擁有者的UID下執行
* 基于目錄文檔的權限是分層的
* 一個文檔的一部分可以根據安全規則被隱藏
* 支持SSL2.0和3.0
* 有一個可用的口令機制
* 可以基于URL制定安全規則
2.服務器配置的一般規則
通常,Web服務器應該把一些好的系統安全路徑、配置和工具結合起來加強安全。例如:
仔細規劃誰能訪問一個安全服務器上的內容目錄是很重要的。多數Web服務器支持各種訪問控制方式。通??梢园言L問權限在指定的IP地址或DNS主機名中,或指定必須提供口令來采訪特定目錄的用戶。如果一個Web服務器中有保密的公司信息,就需要采取措施保證資料在自己的手中。在一個服務器上使用CGI要格外小心。一個CGI程序可能在系統中做出任何事情,從向外部人員提供訪問權限到刪除重要文件。
五、保護Web客戶端的安全
客戶端軟件通常是微軟的IE,或是被微軟擠壓的netscape(還好在x-window下使用率比較高),還有簡單的lynx等等。
1.好的客戶端安全經驗
要認真考慮程序提供的安全設置,如果禁止了java和javascript,就會使瀏覽器更安全。應定期清理cache和cookie文件,避免去聲譽不佳的站點以及使用“save”選項合為不可信的文件使用“open”選項。
2.Mozilla
1998年,netscape公司決定發行navigator的源代碼,并創建一個單獨的機構來監控它的發行與維護:Mozilla.org。我們如果有時間的話,分析它的源代碼相信對我們提高客戶端安全有很大好處。詳見
3.Lynx
沒有圖片,沒有聲音的文本瀏覽器,我喜歡用它(在Linux下),但是注意,在缺省情況下不支持SSL。
4.用戶隱私
有些站點要求用戶在得到訪問權之前必須登記。多數站點維護服務器日志,這有可能泄漏敏感信息,包括IP地址、ISP、前一個訪問的站點等等。其他站點把cookie推到管道中以便在以后關聯用戶訪問的站點。
用戶可以遵循下面的規則:
目前,World Wide Web Consortium已經開始指定稱為Platform for Privacy Preferences的聲明,允許用戶根據自己的意愿來控制身份信息的公布。不過,對我們國家不使用。
六、保護傳輸安全
從用戶的觀點來看,Web瀏覽可能危害隱私。它允許TCP/IP在兩臺機器之間提供一個匿名的數據流,但它不提供保密性、完整性和認證服務。有幾個方案能為TCP/IP添加一個安全層,包括Secure Shell(SSH)和Microsoft的PCT。目前Secure Sockets Layer(SSL)占優勢。
1.SSL
SSL是netscape用來在應用協議(如http、telnet、nntp或者ftp)和更低的TCP/IP層之間提供數據安全的協議。他提供三種基本的安全特征:
另外,SSL提供一個可選的客戶端認證。SSL的其他功能以及特殊的服務器認證被廣泛應用于電子商務。雖然不同的Web瀏覽器以不同的方式指明一個安全的SSL連接,但是以“https://”開始的URL指明在客戶端和服務器之間已經建立了一個安全的連接。
詳見
2.TLS
TLS(Transport Layer Security)是由Transport Layer Security Working Group起草的,產生了一個RFC文檔。
TLS用來建立一個安全的“會話”——它是一個客戶機和一個服務器之間的關聯,用來避免進行昂貴的協商來為每個新的安全參數建立一個額外的連接。該協議分為上層的TLS Handshake協議和下層的TLS Record協議。TLS Handshake協議為一個安全的會話建立加密參數。當使用TLS的客戶端和服務器建立通信時,他們對協議版本達成一致,選擇加密算法,還可以互相進行認證,并使用公開密鑰加密技術來產生共享的秘密。
詳見
3.建立一個TLS/SSL服務器
多數商用Web服務器產品的使用SSL。SSLeay使用了幾個加密算法,某些可能要求商業許可證。SSLeay實現了5個不同的算法:DES、RSA、RC4、IDEA和Blowfish。RSA的專利屬于美國。使用它是需要許可證的。
SSLeay和OpenSSL都可以集成到Apache Web服務器中。程序員Ben Laurie開發了一個Apache-SSL包,為Apache提供一組補丁程序、一些額外的源代碼、一些幫助文件和配置文件實例。補丁程序需要用在Apache源代碼中,其結果與SSLeay或OpenSSL編譯并鏈接。
可以從下面的站點下載:
如果雙方都知道另一方使用TLS/SSL,那么可以使任何運行在任一端口上的基于TCP地協議得到透明的安全。但是由于實際原因,為每個使用TLS/SSL保護安全的協議保留了幾個端口號,這樣允許包過濾防火墻讓這些安全傳輸通過。例如:
名稱 端口號 描述
Nsiiops 261/tcp Iiop名字服務
https 443/tcp http協議
Ddm-ssl 448/tcp DDM-SSL
Smtps 465/tcp Smtp協議
Nntps 563/tcp nntp協議
Sshell 614/tcp SSLshell
Ldaps 636/tcp Ldap協議
ftp-data 989/tcp ftp協議和數據
Ftps 990/tcp ftp控制
Telnets 992/tcp telnet協議
Imaps 993/tcp Imap4協議
Ircs 994/tcp Irc協議
Pop3s 995/tcp Pop3協議
七、其他
大多數Web服務器被設計成是由超級用戶啟動的。服務器必須作為root運行,使他能監視端口80。一旦服務器開始運行,它要改變它的UID中規定在配置文件中的用戶名。不要像root那樣運行你的服務器,雖然你的服務器必須用root啟動,http.conf文件中一定不要包括user root行。如果這樣,你的Web服務器執行的每個腳本都將作為超級用戶運行,產生許多潛在地問題。
要當心把http和匿名ftp混合。許多站點用相同的目錄來存儲通過匿名ftp和通過網站訪問的文檔。例如,你可能有一個名為/netDocs的目錄,他既是你的ftp用戶的主目錄又是你的Web服務器的根目錄。這就允許把文件歸到兩類URLS,例如或者。在ftp上的http的主要優點是速度快、效率高。但是混合出現了各種安全問題:
另外,還有一些注意事項:
如果想知道更多關于HTTP/WWW的安全知識,請訪問