如何加強Apache Web服務器的安全防范?
譯文【51CTO.com 獨家譯稿】在Linux上安裝安全的Web服務器并加以維護并非易事。這需要深入了解Linux、Apache和PHP服務器端的選項。主要問題之一是,如何在安全性、生產力和易用性三者之間求得平衡。最好的解決辦法取決于項目的具體需求,但是安裝的所有服務器都有某些共同的特點。下面是為LAMP服務器保駕護航的一些最佳實踐,涵蓋服務器配置到PHP設置微調的諸多方面。
為Web服務器保駕護航的任務應從加固Linux操作系統(tǒng)入手。加固Linux這個話題本身就可以寫整整一篇文章,但是某些概念在提供Web內容方面顯得特別重要:
◆Linux內核加固。內核是最經常被攻擊者盯上的目標。要提升用戶的權限,對內核獲得訪問權是最容易的方法。視操作系統(tǒng)而定,Apache在默認情況下以有限用戶nobody(在CentOS等基于紅帽的發(fā)行版上)或www-data用戶(在基于Debian的發(fā)行版上,包括Ubuntu)來運行。每個攻擊者企圖突破有限用戶的身份,利用內核存在的某個漏洞來獲得訪問root的權限。用grsecurity(http://olex.openlogic.com/packages/grsecurity)給內核打上補丁可以確保,你處于被保護狀態(tài),甚至可以防范零日漏洞。此外,Ksplice(http://www.ksplice.com/)可以確保你及時打上了所有的內核更新版,最大限度地減小安全風險。
◆強制性訪問控制(MAC)。在正常的Web服務器部署環(huán)境下,普通用戶不需要訪問編譯器(gcc)、系統(tǒng)配置文件或者像find這樣的實用工具。基于紅帽的發(fā)行版可以使用名為SELinux(http://olex.openlogic.com/packages/selinux)的MAC策略軟件;Ubuntu管理員可以使用類似的AppArmor(http://olex.openlogic.com/packages/apparmor)。盡管這些MAC工具的功能特性各不一樣,但它們都能幫你限制攻擊者的破壞行動。說到不利因素,配置不當?shù)腗AC工具會削弱Web服務器的功能。這就是為什么所有MAC工具都有非執(zhí)行模式,那樣你就可以跟蹤誤報,并且針對你的特定環(huán)境來重新配置工具。不過,要是你覺得MAC工具太過復雜,只要將一些可執(zhí)行文件的權限改成700,只允許root可以使用它們。
◆防火墻。你必須限制入站流量和出站流量,那樣才能防止惡意連接進出服務器。對于各種類型的服務器來說,保護入站流量的安全是一種常見做法。然而對于Web服務器來說,限制出站連接以便限制惡意腳本在本地執(zhí)行所帶來的影響,這一點特別重要。為此,最可靠的辦法就是將默認iptables鏈的策略設置成DROP。此外,你明確允許所需的入站連接和出站連接。不過在限制出站流量時一定要小心,因為許多Web腳本需要外部資源(RSS和外部應用編程接口)。如果你覺得iptables防火墻工具用起來不習慣,可以使用腳本來幫助生成和維護必要的規(guī)則,比如Shorewall和Firestarter。
Apache最佳安全實踐
一旦你確保了Linux操作系統(tǒng)的安全,就可以開始處理Apache Web服務器的安全問題了。下列指示專門針對Apache,但可能也適用于其他Web服務器,比如LiteSpeed和nginx。它們之間的差異常常就體現(xiàn)在模塊名稱或者配置指令上。
要加固Apache,就要完成這些步驟:
◆安裝mod_security,這個Apache模塊起到了應用防火墻的作用。它可以過濾Web請求的所有部分,并終結惡意代碼。它在Web服務器進行任何實際處理之前發(fā)揮作用,因而與Web應用程序無關。Mod_security適用于過濾從SQL注入到XSS攻擊的任何惡意流量。它也是保護易受攻擊的Web應用程序的最快速、最容易的方法。該軟件有眾多隨時可以使用的規(guī)則,但你也很容易自行編寫規(guī)則。比如設想一下:你有一個過時的Joomla版本,擔心會遭到SQL注入攻擊。這個簡單規(guī)則可以過濾含有jos_ (Joomla表的默認前綴): SecFilter "jos_"的任何POST和GET內容。
◆安裝mod_evasive,這是另一個重要的Apache模塊,可以保護Web應用程序遠離拒絕服務(DOS)請求。它的效果受制于這個現(xiàn)實:它是在應用程序層面工作的,這意味著Apache無論如何都接受連接,因而耗用帶寬和系統(tǒng)資源。不過,如果是源自少量遠程主機的比較弱的DOS攻擊,該模塊能有所幫助。一旦mod_evasive裝入,你需要這樣來配置它:
- DOSPageCount 2
- DOSSiteCount 30
- DOSBlockingPeriod 120
這指示服務器阻止(默認情況下返回HTTP error 403 Forbidden)兩次訪問同一頁面,或者在一秒內(默認的時間間隔)共有30次請求的任何主機。入侵者會在外面被阻擋120秒。
◆過濾訪客的IP地址。這可能被認為是很極端的措施,但結果很好。首先,考慮安裝mod_httpbl,這是用Apache實現(xiàn)的Project Honeypot。一旦該模塊安裝并被啟用,它可以阻止有惡意活動"前科"的IP地址。另一個辦法是使用mod_geoip,它可以用來允許只有來自某些國家的訪客才可以訪問接受留言、注冊和登錄信息等輸入內容的頁面。它甚至可以阻止和允許來自某些國家的服務器端訪客。
其他推薦的Apache選項包括將Timeout(超時)選項設置得低些,比如15秒。這縮短了Web服務器等待某些事件的時間,從而限制了DOS攻擊的影響。值得進一步閱讀的是官方的Apache說明文檔及安全提示(http://httpd.apache.org/docs/2.3/misc/security_tips.html)。#p#
PHP是開源領域最流行的服務器端語言。PHP是服務器端,這意味著你需要通過某些指令,比如memory_limit、execution_timeout和disable_functions,對它訪問服務器資源設置明確的規(guī)則和限制。然而,PHP配置指令可以在各個地方來定義和重新定義,這里作了解釋(http://www.php.net/manual/en/ini.list.php)。你在全局范圍執(zhí)行這些規(guī)則時,確保已清楚它們的范圍。
如果你安裝了最新版本的PHP,又使用默認設置,你的環(huán)境已經符合還算可以的安全標準。危險的選項在默認情況下已被禁用,比如register_globals和allow_url_include。不過,光這還不夠。要考慮調整的最重要的選項之一是disable_functions;顧名思義,它的作用就是禁用PHP函數(shù)。下面這個示例演示了如何防止危險的外殼代碼執(zhí)行:
- disable_functions=exec,passthru,shell_exec,system,proc_open,popen
之前為PHP引入額外的安全機制方面有過許多嘗試,無論從開發(fā)小組里面還是從外面來進行嘗試。一個不成功的嘗試就是PHP的安全模式(Safe Mode),其主要想法是根據(jù)文件的所有者來限制文件的訪問權。結果證明,這項功能設計不正確,自PHP 5.3以后就被廢棄了。不過,一個名為Suhosin的外部安全項目證明了其價值。它與PHP一起捆綁在基于Debian的流行發(fā)行版中。
Suhosin有兩種安裝方法。一種是在PHP實際編譯之前給原始的PHP源代碼打上補丁。建議采用這種方法,因為它使得Suhosin成為PHP的一個必要組成部分,讓Suhosin可以通過其引擎保護功能來保護PHP核心。第二種方法比較容易,就是把它作為普通的PHP擴展來添加。Suhosin的豐富功能適用于許多安全方面,比如會議安全數(shù)據(jù)加密、請求有效載荷限制,甚至還有SQL注入預防這項試驗性功能。
默認情況下,PHP作為Apache模塊在Apache用戶下運行,這確保了性能最佳、最符合應用程序的需求。然而,如果網站有不止一個虛擬主機(vhost),它可能會帶來嚴重的安全問題,如果虛擬主機屬于不同的用戶,那就更危險了。在這種情況下,來自一個虛擬主機的腳本也許能讀取、寫入和執(zhí)行來自其他虛擬主機的腳本,這危及了安全,更不用說危及隱私了。
為了緩解這個問題,你可以使用另一個Apache模塊:mod_suphp,該模塊允許PHP腳本在預先定義的用戶下運行。這種模塊對于共享的主機托管服務器來說必不可少。如果使用mod_suphp,來自某個虛擬主機的腳本甚至無法讀取來自其他虛擬主機的文件,更不用說寫入了。禁止讀取外來虛擬主機的文件對于配置文件來說極其重要,這就是為什么這類文件必須要有600個文件的許可權。要是不這么設置,你的數(shù)據(jù)庫詳細資料很容易被發(fā)現(xiàn),而這是你最不想遇到的麻煩。
在mod_suphp的配置文件(默認情況下是/etc/suphp.conf)中,你可以使用allow_file_group_writeable、 allow_file_others_writeable、allow_directory_group_writeable和allow_directory_others_writeable等選項,執(zhí)行全局安全文件的許可策略。在正常情況下,它們都應該被定義為false。執(zhí)行不遵守這些限制的腳本會得出HTTP Error 500 Internal server error(HTTP錯誤:500,服務器內部錯誤)。
一般建議
為Web服務器保駕護航時,還要考慮下列措施:
◆把同一臺服務器上的不同Web應用程序分隔到不同的虛擬主機上,讓它們在不同的用戶下運行。
◆傳輸密碼或信用卡信息等敏感信息時,安裝SSL。你可以用免費、自己生成的非商業(yè)證書來保護管理面板。
◆不要單單依賴一種方法來限制管理員訪問。數(shù)量眾多的互聯(lián)網漏洞避開了管理員登錄要求。只要限制遠程IP地址對管理員區(qū)域的訪問,并且更改默認的管理員URL或端口,就可以限制這類威脅。
◆定期對服務器執(zhí)行安全審查工作。
◆訂閱關于你已部署的Web服務和應用程序的安全新聞組。
所以上述信息充當了確保Web服務器安全的路線圖。做好這項工作需要投入大量的時間和精力。如果你沒有準備好投入這樣的時間,最好還是使用共享的主機托管服務器或完全托管的服務器。
【51CTO.com獨家譯稿,非經授權謝絕轉載!合作媒體轉載請注明原文出處及出處!】