觀點

鞏固Apache Server的安全

2005 / 11 / 04
楊佳儒
鞏固Apache Server的安全

Apache 伺服器簡介
Apache 源自於美國國家超級計算業務中心(NCSA)Rob McCool所開發NCSA HTTPd網頁伺服器,在開放原始碼社群的努力下,於1995年釋出Apache 0.6.2版,之後經過不斷改進,目前已發展至1.3.33版。由於其穩定、安全、管理容易及免費的特性,讓Apache逐漸成為網頁伺服器的代表,根據英國網路服務企業Netcraft之研究結果,以Apache作為網頁伺服器網站由2003年1月的兩千兩百萬個增加至2004年11月的三千八百萬個,市場佔有率也由62%成長至67%,同時由於網路頻寬及相關技術的進步,內容豐富的動態網頁逐漸取代了靜態網頁,有些公司也透過新的網頁介面系統取代舊有的內部系統,使網頁服務進一步從網頁伺服器延伸到後端資料庫,隨著線上服務的增加,這些具有豐富資源的網站伺服器,就成為潛伏在暗處的入侵者攻擊之首要目標,而且由於網頁伺服器的特性,其服務對象為網路上任何想要存取網頁的使用者,無法像企業內部伺服器一樣藉由適當存取控制的防護措施,將惡意入侵者阻擋在系統外,就因為網頁伺服器提供匿名服務,入侵者可以如同一般網路使用者透過合法的80 port連上網頁伺服器,防火牆機制在此種情況下無法發揮效用,因此希望透過介紹一些針對Apache網頁伺服器的防護方法,在提供網頁服務給使用者的同時做到Apache伺服器基本安全的防護,避免資訊洩漏。接下來我們針對兩個方面的防護分別加以介紹。

Apache網頁伺服器的漏洞
雖然Apache在1997年1月之後就沒有發現重大漏洞,但如果您主機上執行的Apache並非最新版本,就可能存在漏洞,藉由適當修補Apache漏洞,可避免惡意入侵者透過Apache程式本身的缺陷,來攻陷網頁伺服器。我們以這個兩年前存在的漏洞Apache Web Server Chunk Handling Vulnerability做為例子來加以說明(請參閱:http://www.cert.org.tw/document/advisory/show.php? twcert_sn=TW-CA-2002-151),此弱點存在於Apache處理chunk-encoded的無效要求時,它影響版本1.3 到 1.3.24及2.0 到 2.0.36的Apache網頁伺服器,惡意攻擊者可透過送出變形的要求給Apache伺服器引發緩衝區溢位,利用有弱點的Apache取得執行者權限,一般我們是透過「nobody」帳號來執行Apache,攻擊者在攻陷Apache伺服器後便可使用nobody權限執行命令,雖然攻擊者沒有在此次攻擊中直接獲得root存取權限,但是在大部分的系統上若要進一步獲得root存取權限只是時間的問題了。
此外,除了Apache伺服器本身安全缺陷所造成的問題外,由於Apache伺服器也可以透過使用「模組」(Module),在網頁伺服器上彈性載入適當模組以提供所需功能,例如:mod_cgi、mod_proxy等,但有時模組自己本身的缺陷也會影響Apache伺服器的安全,我們透過Redhat所發出的RHSA-2004:063-01: Updated mod_python packages fix denial of service vulnerability 來加以說明(請參閱:http://www.cert.org.tw/document/ advisory/show.php?twcert_sn=TW-CA-2004-047),mod_python 模組使 Apache 伺服器得以解譯 Python 語言,但在 mod_python 3.0.3中發現一個漏洞,將容易導致伺服器受到阻斷服務攻擊。攻擊者可能利用Apache程式本身或其模組存在的弱點來進行入侵動作,這些弱點通常都是廣為流傳,而且很容易取得現成的攻擊工具,短時間內即可攻陷目標網頁伺服器。因此Apache網頁伺服器的管理員,應該特別注意Apache相關的安全通告,及時進行修補,避免因為疏忽而被攻擊者透過漏洞攻陷網頁伺服器,我們可以透過以下的網站來取得Apache相關的安全訊息:
http://www.cert.org.tw
http://www.apache.org
http://www.apacheweek.com/security
當然我們也可以安裝最新版的Apache,以避免舊版Apache存在的未修補漏洞。

Apache網頁伺服器安全相關設定
Apache本身程式上的漏洞可能成為惡意攻擊者入侵的途徑,但是與Apache有關的安全問題大多來自Apache設定錯誤,導致未經授權的使用者,可以任意存取Apache上的資訊資源,Apache組態設定主要是透過httpd.conf 來設定,此檔案一般會存在/usr/local/apache/conf目錄下,接下來我們針對以下三個主題來介紹設定Apache所應該考慮的面向:
1. 存取權限(Access Rights)
2. 符號連結(Symbolic Links)
3. 索引(Index)
存取權限
由於Apache網頁伺服器本身的運作及存取權限都是依據Apache執行者的存取權限,我們一般都是以「nobody」帳號執行Apache,在設定時則盡可能降低其權限,至少比root低,當然也可以設定不同的帳號,例如:www或apache來負責執行Apache,這樣設定是希望萬一Apache伺服器被入侵,攻擊者只能取得一個低存取權限的帳號,另一方面由於大部分協助Apache運作的檔案都存在於伺服器的根目錄內(也就是ServerRoot所指定的目錄),所以當Apache是藉由non-root的使用者來負責執行,其將沒有足夠權限來修改相關的Apache系統設定檔,因此Apache伺服器本身無法修改自己的相關設定,如果沒有透過這樣的方式來執行Apache,讓伺服器本身可以修改設定檔,攻擊者將可藉由更改相關設定檔的方式讓未經授權的使用者存取伺服器的資源或破壞Apache伺服器,除了在ServerRoot所設定的伺服器根目錄外,還有另一個文件根目錄(也就是DocumentRoot所指定的目錄)也需要限制其存取權限,盡可能將其設定為唯讀,但是在某些情況下,可能需要讓使用者能夠寫入或執行文件根目錄內的檔案,如果遇到這種情況,我們在文件根目錄下另外開一個子目錄,將這些檔案移到這個子目錄中,將這個目錄存取的權限開放出來,透過這樣的方式來維持整體的安全性。因為Apache執行者權限對伺服器的安全相當的重要,所以在控管其權限時我們要格外的小心來維持Apache本身的安全。下面列出Apache一些重要檔案建議設定的權限(資料來源:Building Secure Servers with Linux)
符號連結
符號連結(Symbolic links)是存在於UNIX的一個機制,其概念有點類似微軟視窗的捷徑,管理者可能為了本身方便而使用符號連結,但是這可能形成安全上的威脅,因為管理這些符號連結是很困難的一件事,管理者可能建立了大量的符號連結,但是日子一久可能就會忘記到底存在有那些符號連結,最後要管理這些連結,所以我們需要去確認那些連結到我們文件根目錄(document root directory)是否真的有需要,關閉掉那些不需要的連結,我們可以藉由下面的指令找出連到特定目錄的連結:
find /usr/local/apache/htdocs -type l -print
在Apache伺服器中,可以透過關鍵字Options設定FollowSymLinks,設定這個組態後,Apache伺服器會依照符號連結的設定來連結在伺服器上的其他檔案,但假如您沒有要使用符號連結,請關閉Options以避免相關問題,因為Apache這個選項是預設為開啟,假如您要使用符號連結,那您需仔細的對這些符號連結進行確認,避免未經授權的使用者存取那些不是他權限可以存取的檔案。在Apache伺服器中還有另一個用來設定符號連結設定的指令FollowSymLinksIfOwnerMatch,也是用來允許符號連結的使用,但是它有更嚴格的控管,只有在符號連結的擁有者與符號連結所指到的檔案擁有者相同時,伺服器才會使用符號連結,換句話說,使用者只能使用符號連結去連結其所擁有的檔案,假如伺服器對安全性的要求較為嚴格, FollowSymLinksIfOwnerMatch可對符號連結做更嚴格的安全控管。對符號連結做仔細的控管可以避免攻擊者利用管理者的疏忽,違法存取其不應該存取的檔案或進行破壞的行為。以下就httpd.conf的預設值加以說明 ︰

Options FollowSymLinks ←刪除此設定值
AllowOverride None

...

Options Indexes Includes FollowSymLinks ←刪除此設定值

索引(Index)
當Apache網頁伺服器收到使用者的網頁需求後,會分析使用者需求並將需求轉換成對應伺服器上的檔案,再傳回客戶端瀏覽器。有時候,客戶端送出的網頁需求所轉換出來的不是檔案而是目錄,在此種情況之下,Apache可能會有以下其中一種反應:1.Apache會自動找出目錄中的特定檔案傳回給客戶端,例如index.html使用者不需要明確指定它,但是Apache會自動回傳這個檔案。2.Apache會顯示出目錄中完整的檔案名單。3.Apache會顯示出錯誤的訊息,告訴使用者無法存取其所要求的資源。 以上這些情況是一連串的動作,當Apache所得到轉換出來的結果是目錄時,它會先去確認該目錄內有沒有目錄索引(DirectoryIndex),如果有列在目錄索引內的檔案存在,Apache網頁伺服器會取出第一個出現在目錄索引內的檔案,處理然後傳給客戶端。但是如果找不到列在目錄索引的檔案,Apache 伺服器會去確認httpd.conf內的Indexes的設定狀況,有被開啟則傳回在這目錄中檔案完整的清單,若沒有開啟Apache則會回應錯誤訊息,表示存取目標資源被拒,如果設定上的疏忽,攻擊者送出要求目錄的需求,而這個目錄又預設開啟indexes,那Apache傳回目錄內檔案的完整清單,則可能會導致網頁伺服器上機密資訊的洩漏,雖然攻擊者可能無法存取所列出的檔案,但是透過檔案的名稱攻擊者還是可以獲得伺服器的相關資訊,因此為了避免伺服器機密資訊的洩漏,我們可以在httpd.conf或.htaccess目錄的設定檔內加入options –Indexes,就可以關閉指定目錄的索引功能。下面以httpd.conf的預設值作說明 ︰

Options FollowSymLinks
AllowOverride None

...

Options Indexes Includes FollowSymLinks ←修改成-Indexes
...


結論
除了上述兩部分之外還有一些安全相關事項需要注意,分別說明如下:
對設定檔進行定期備份
在進行每次修改前,都將相關設定檔預先保留下來,避免在更改設定檔後發生錯誤,尤其當Apache伺服器服務的使用者眾多時,使用者可能沒有耐性等您重新設定相關設定檔。
千萬不要洩漏機密資訊
管理者必須對某些關鍵資訊保密,像管理者密碼千萬不能與其他人共用,另外像伺服器上相關的安全措施,也不能輕易洩漏。
定期確認系統log
隨時監控存取網站的使用者,瞭解伺服器曾經做過什麼事,是管理員相當重要的例行工作,例如記錄錯誤訊息的error_log,其負責記錄網頁瀏覽器存取網頁時發生的錯誤訊息,及referer_log記載使用者是透過那個網頁連到您的伺服器,可以藉此分析哪些網頁參考到本機上的網頁,這些log都會提供相關有用的資訊,另外隨著時間增加,log檔也會逐漸累積佔據磁碟空間,可以透過rotatelog或logrotate對log檔進行管理。
透過上述措施可以維持Apache伺服器基本的安全,我們還可以透過像Nkito (http://www.cirt.net/code/nikto.shtml)等網頁伺服器掃描器來偵測Apache網頁伺服器的弱點,再設法修補,以維持網頁伺服器的安全。