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