Apache服務器的安全性及實現

作者:谷和啟  來源:yesky  加入時間:2004-2-6  閱讀次數:
閱讀選項: 文字 背景 字號 字型  自動滾屏[左鍵停止]


【摘要】作為網管人員最擔心Web服務器遭到攻擊,一旦遭到攻擊,網站的所有信息可能面目全非,直到整個Web系統(tǒng)全面癱瘓。因此,選擇安全性能好的Web服務器軟件尤其重要。作為Internet 上最流行的Web服務器軟件,Apache的安全性經受了時間和市場的雙重檢驗。取得了驚人的成功。了解Apache Server的特性,并進行合理的配置將是每一個站點管理維護或開發(fā)人員必須關注的問題。

  一、Apache 服務器的功能
  
  Apache Serve的前身是NCSA的httpd,曾經在1995年成為最為流行的萬維網的服務器。因為強大的功能和靈活的設置及平臺移植性,Apache Server取得了廣泛的信賴。Apache Server的主要功能有:

  1、支持最新的HTTP1.1協(xié)議(RFC2616)。
  2、極強的可配置和可擴展性,充分利用第三方模快的功能。
  3、提供全部的源代碼和不受限制的使用許可(License)。
  4、廣泛應用于Windows 2000/NT/9x、Netware 5.x,OS/2 和UNIX家族極其他操作系統(tǒng),所支持的平臺多達17余種。
  5、強大的功能,涵蓋了用戶的需求,包括:認證中的DBM數據庫支持;錯誤和問題的可定制響應的目錄導向功能;不受限的靈活的URL別名機制和重定向功能;虛擬主機(多宿主主機)支持多個域主頁共存一臺主機;超強的日志文件功能;利用站點的分析;拓展于維護等等。

  正因為這些強大的優(yōu)勢,使Apache Server與其他的Web服務器相比,充分展示了高效、穩(wěn)定及功能豐富的特點。Apache Server 已用于超過600萬個Internet站點。

  二、Apache 服務器的安全特性

  作為最流行的Web服務器,Apache Server提供了較好的安全特性,使其能夠應對可能的安全威脅和信息泄漏。

1、采用選擇性訪問控制和強制性訪問控制的安全策略

  從Apache 或Web的角度來講,選擇性訪問控制DAC(Discretionary Access Control)仍是基于用戶名和密碼的,強制性訪問控制MAC(Mandatory Access Control)則是依據發(fā)出請求的客戶端的IP地址或所在的域號來進行界定的。對于DAC方式,如輸入錯誤,那么用戶還有機會更正,從新輸入正確的的密碼;如果用戶通過不了MAC關卡,那么用戶將被禁止做進一步的操作,除非服務器作出安全策略調整,否則用戶的任何努力都將無濟于事。

  2、Apache 的安全模塊

  Apache 的一個優(yōu)勢便是其靈活的模塊結構,其設計思想也是圍繞模塊(Modules)概念而展開的。安全模塊是Apache Server中的極其重要的組成部分。這些安全模塊負責提供Apache Server的訪問控制和認證、授權等一系列至關重要的安全服務。

  mod_access模塊能夠根據訪問者的IP地址(或域名,主機名等)來控制對Apache服務器的訪問,稱之為基于主機的訪問控制。

  mod_auth模塊用來控制用戶和組的認證授權(Authentication)。用戶名和口令存于純文本文件中。mod_auth_db和mod_auth_dbm模塊則分別將用戶信息(如名稱、組屬和口令等)存于Berkeley-DB及DBM型的小型數據庫中,便于管理及提高應用效率。

  mod_auth_digest模塊則采用MD5數字簽名的方式來進行用戶的認證,但它相應的需要客戶端的支持。

  mod_auth_anon模塊的功能和mod_auth的功能類似,只是它允許匿名登錄,將用戶輸入的E-mail地址作為口令。

  SSL(Secure Socket Lager),被Apache所支持的安全套接字層協(xié)議,提供Internet上安全交易服務,如電子商務中的一項安全措施。通過對通訊字節(jié)流的加密來防止敏感信息的泄漏。但是,Apache的這種支持是建立在對Apache的API擴展來實現的,相當于一個外部模塊,通過與第三方程序的結合提供安全的網上交易支持。

三、Apache服務器的安全配置

  在前面的內容中提到過,Apache具有靈活的設置。所有Apache的安全特性都要經過周密的設計與規(guī)劃,進行認真地配置才能夠實現。Apache服務器的安全配置包括很多層面,有運行環(huán)境、認證與授權設置及建立安全的電子交易鏈接等。

  1、Apache的安裝配置和運行

 ?。?)以Nobody用戶運行一般情況下,Apache是由Root 來安裝和運行的。如果Apache Server進程具有Root用戶特權,那么它將給系統(tǒng)的安全構成很大的威脅,應確保Apache Server進程以最可能低的權限用戶來運行。通過修改httpd.conf文件中的下列選項,以Nobody用戶運行Apache 達到相對安全的目的。

  User nobody
  Group# -1

  (2) ServerRoot目錄的權限

  為了確保所有的配置是適當的和安全的,需要嚴格控制Apache 主目錄的訪問權限,使非超級用戶不能修改該目錄中的內容。Apache 的主目錄對應于Apache Server配置文件httpd.conf的Server Root控制項中,應為:

  Server Root /usr/local/apache

 ?。?)SSI的配置

  在配置文件access.conf 或httpd.conf中的確Options指令處加入IncludesNOEXEC選項,用以禁用Apache Server 中的執(zhí)行功能。避免用戶直接執(zhí)行Apache 服務器中的執(zhí)行程序,而造成服務器系統(tǒng)的公開化。

  <Directory /home/*/public_html>
  Options Includes Noexec
  </Directory>

 ?。?)阻止用戶修改系統(tǒng)設置

  在Apache 服務器的配置文件中進行以下的設置,阻止用戶建立、修改 .htaccess文件,防止用戶超越能定義的系統(tǒng)安全特性。

  <Directory />
  AllowOveride None
  Options None
  Allow from all
  </Directory>

  然后再分別對特定的目錄進行適當的配置。

 ?。?)Apache 服務器的確省訪問特性

  Apache 的默認設置只能保障一定程度的安全,如果服務器能夠通過正常的映射規(guī)則找到文件,那么客戶端便會獲取該文件,如http://local host/~ root/ 將允許用戶訪問整個文件系統(tǒng)。在服務器文件中加入如下內容:

  <Directory />
  order deny,ellow
  Deny from all
  </Directory>

  將禁止對文件系統(tǒng)的缺省訪問。

 ?。?)CGI腳本的安全考慮

  CGI腳本是一系列可以通過Web服務器來運行的程序。為了保證系統(tǒng)的安全性,應確保CGI的作者是可信的。對CGI而言,最好將其限制在一個特定的目錄下,如cgi-bin之下,便于管理;另外應該保證CGI目錄下的文件是不可寫的,避免一些欺騙性的程序駐留或混跡其中;如果能夠給用戶提供一個安全性良好的CGI程序的模塊作為參考,也許會減少許多不必要的麻煩和安全隱患;除去CGI目錄下的所有非業(yè)務應用的腳本,以防異常的信息泄漏。

  以上這些常用的舉措可以給Apache Server 一個基本的安全運行環(huán)境,顯然在具體實施上還要做進一步的細化分解,制定出符合實際應用的安全配置方案。

四、Apache Server基于主機的訪問控制

  Apache Server默認情況下的安全配置是拒絕一切訪問。假定Apache Server內容存放在/usr/local/apache/share 目錄下,下面的指令將實現這種設置:

  <Directory /usr/local/apache/share>
  Deny from all
  AllowOverride None
  </Directory>

  則禁止在任一目錄下改變認證和訪問控制方法。

  同樣,可以用特有的命令Deny、Allow指定某些用戶可以訪問,哪些用戶不能訪問,提供一定的靈活性。當Deny、Allow一起用時,用命令Order決定Deny和Allow合用的順序。

  1、拒絕某類地址的用戶對服務器的訪問權(Deny)

  如:Deny from all
  Deny from test.cnn.com
  Deny from 204.168.190.13
  Deny from 10.10.10.0/255.255.0.0

  2、允許某類地址的用戶對服務器的訪問權(Allow)

  如:Allow from all
  Allow from test.cnn.com
  Allow from 204.168.190.13
  Allow from 10.10.10.0/255.255.0.0
  Deny和Allow指令后可以輸入多個變量。

  3、實例:

  Order Allow, Deny
  Allow from all
  Deny from www.***.com

  則,想讓所有的人訪問Apache服務器,但不希望來自www.***.com的任何訪問。

  Order Deny, Allow
  Deny from all
  Allow from test.cnn.com

  則,不想讓所有人訪問,但希望給test.cnn.com網站的來訪。

  有關訪問控制的高級設置請閱讀UNIX系統(tǒng)管理書籍。

  五、Apache Sever的用戶認證與授權

  概括的講,用戶認證就是驗證用戶的身份的真實性,如用戶帳號是否在數據庫中,及用戶帳號所對應的密碼是否正確;用戶授權表示檢驗有效用戶是否被許可訪問特定的資源。在Apache中,幾乎所有的安全模塊實際上兼顧這兩個方面。從安全的角度來看,用戶的認證和授權相當于選擇性訪問控制。

  建立用戶的認證授權需要三個步驟:

 ?。?)建立用戶庫

  用戶名和口令列表需要存在于文件(mod_auth模塊)或數據庫(mod_auth_dbm模塊)中。基于安全的原因,該文件不能存放在文擋的根目錄下。如,存放在/usr/local/etc/httpd下的users文件,其格式與UNIX口令文件格式相似,但口令是以加密的形式存放的。應用程序htpasswd可以用來添加或更改程序:

  htpasswd –c /usr/local/etc/httpd/users martin

  -c表明添加新用戶,martin為新添加的用戶名,在程序執(zhí)行過程中,兩次輸入口令回答。用戶名和口令添加到users文件中。產生的用戶文件有如下的形式:

  martin:WrU808BHQai36
  jane:iABCQFQs40E8M
  art:FadHN3W753sSU

  第一域是用戶名,第二個域是用戶密碼。

(2)配置服務器的保護域

  為了使Apache服務器能夠利用用戶文件中的用戶名和口令信息,需要設置保護域(Realm)。一個域實際上是站點的一部分(如一個目錄、文檔等)或整個站點只供部分用戶訪問。在相關目錄下的.htaccess文件或httpd.conf(acces.conf)中的<Directory>段中,由AuthName來指定被保護層的域。在.htaccess文件中對用戶文件有效用戶的授權訪問及指定域保護有如下指定:

  AuthName “restricted stuff”
  Authtype Basic
  AuthUserFile /usr/local/etc/httpd/users
  Require valid-user

  其中,AuthName指出了保護域的域名(Realm Name)。valid-user參數意味著user文件中的所有用戶都是可用的。一旦用戶輸入了一個有效的用戶/口令時,同一個域內的其他資源都可以利用同樣的用戶/口令來進行訪問,同樣可以使兩個不同的區(qū)域共用同樣的用戶/口令。

 ?。?)告訴服務器哪些用戶擁有資源的訪問權限

  如果想將一資源的訪問權限授予一組客戶,可以將他們的名字都列在Require之后。最好的辦法是利用組(group)文件。組的操作和標準的UNIX的組的概念類似,任一個用戶可以屬于一個和數個組。這樣就可以在配置文件中利用Require對組賦予某些權限。如:

  Require group staff
  Require group staff admin
  Require user adminuser

  指定了一個組、幾個組或一個用戶的訪問權限。

  需要指出的是,當需要建立大批用戶帳號時,那么Apache服務器利用用戶文件數據庫將會極大地降低效率。這種情況下,最好采用數據庫格式的帳號文件,譬如 DBM數據庫格式的文件。還可以根據需要利用db格式(mod_auth_db)的數據文件,或者直接利用數據庫,如:mSQL(mod_auth_msql)或DBI兼容的數據庫(mod_auth_dbi)。

  六、在Apache中使用DBM用戶認證

  DBM 文件是一種簡單而標準的用于加快讀取效率的保存信息的方法。文件中存放的每一個記錄由兩個部分組成部分:鍵和值。由于DBM的格式,使得與鍵相關的信息非常有效。在Web用戶認證中,這里的鍵將是用戶名,而與該鍵相關的值將是該用戶經過加密的口令信息。從DBM文件中查找用戶名和口令,要比從一個純文本文件中查找有效得多。對于有很多用戶的站點,這種方法將大大提高用戶認證的效率。

 ?。?) 在Apache服務器中增加DBM模塊

  在默認的條件下,Apache不使用DBM文件來完成用戶認證,因此編譯時一定要加入可選的DBM認證模塊。重新配置Apache服務器文件,去掉其中的注釋行

  #Module dbm_auth_module mod_auth_dbm.o

  前的“#”,并重新編譯。但是,在編譯之前,需要指出Apache DBM函數的位置。

 ?。?) 創(chuàng)建DBM用戶文件(假設文件名為users)

  Apache提供了一個“dbmmanage”的程序,用于創(chuàng)建和管理DBM文件。其中:

  Dbmmanage /usr/local/etc/httpd/usersdbm     創(chuàng)建DBM文件
  Dbmmanage /usr/local/etc/httpd/users adduser martin hamster 新增用戶
  Dbmmanage /usr/local/etc/httpd/usersdbm delete martin   刪除用戶
  Dbmmanage /usr/local/etc/httpd/usersdbm view 顯示DBM中所有用戶

  有了DBM數據庫文件,還要替換目錄訪問控制,即將Apache配置文件(access.conf)中的AuthUserFile部分替換成:AuthUserFile /usr/local/etc/usersdbm 告訴Apache現在的用戶文件是DBM的格式。

  以上內容,是作者在長期的網站管理工作中的一點積累。由于篇幅的關系,只能作粗略的描述,遠不能表達清楚Apache服務器的安全使用。安全是相對的,嚴防是絕對的。只有及時了解最新的安全信息,掌握最新的安全技術、工具,根據實際情況,制定安全策略,才能及時有效地抵御各種各樣的網上“侵略者”。