Apache服務器的簡單配置與安全策略

  在以前講的關於weevely後門分析中,有說到利用Apache的配置文件.htaccess來隱藏php後門.關於.htaccess文件的用途,在此結合Apache服務器的具體配置做一詳解,也算是本身的學習筆記了...php

  一  Apache服務器的搭建html

    詳見以前的博文:CentOS 6.0下phpvod搭建教程(LAMP+phpvod)linux

  二  httpd.conf文件的全局配置web

    1. ServerRoot  設置服務器目錄的絕對路徑,即Apache服務器的安裝及配置文件.通常在/etc/httpd目錄下,也有在/usr/local/apache下(具體看安裝的方式)shell

    2. Listen   指定要綁定的IP和端口,通常爲80端口:Listen 192.168.1.100::80,也能夠同時監聽多個IP和端口數據庫

    3. User和Group 設置用戶ID和組ID,服務器將使用他們來處理請求,一般默認爲:daemon,daemon,(也有叫www-data或者apache的),這些都是系統賬號,具體能夠在/etc/passwd文件裏查看,能夠發現這些賬號都是不可登陸的,並且權限都相對較低,之因此這樣設置,也是處於安全的考慮,這也正體現Linux系統權限限制的嚴格.雖然,啓動Apache須要root權限(固然,這個也不必定,能夠配置/etc/sudoers文件修改),可是當Apache服務器啓動後,會將其進程轉移到這個指定的通常用戶權限下運行,這樣就下降了服務器的危險性.apache

    4. ServerAdmin 設置服務器管理員的地址,通常爲email或者別名.有時候在訪問頁面出錯時,會看到一段英文的說明,仔細看就有這個地址,這是便於聯繫網站管理員的.瀏覽器

    5. ServerName 即主機名,應該是一個徹底限制的域名.在一個域名網絡系統(DNS)中,能夠經過這種添加別名的方式方便管理本身的服務器.安全

    6. DocumentRoot 設置網站的虛擬目錄(即網站的根目錄),通常在/var/www/html/下.當訪問http://127.0.0.1/index.php時,實際上訪問的是/var/www/html/下的index.php文件.服務器

    7. UserDir  定義用戶目錄

    8. DirectoryIndex 指定目錄索引的文件名,這個很重要,不少網站設置不當,就會出現爆目錄的問題,緣由就是由於沒有設置(或者設置不當)該索引.具體意思就是:當請求的URL是目錄類型(例如:http://www.server.com/includes/)時,服務器默認會返回的一個文件,通常爲index.php,index.html,index.jsp等等索引文件.一個設置樣例是:DirectoryIndex index index.html index.cgi

    9. TimeOut 設置網絡超時時間,單位爲秒.

    10.KeepAlive和KeepAliveTimeout 設置每次會話的持續時間,這樣可使不少請求經過同一個TCP鏈接來發送,節省網絡資源,例:

      KeepAlive on

                      KeepAliveTimeout  5

    11.MaxKeepAliveRequests 每一個鏈接的最大請求數,當同時請求的數目達到設定值時,就再也不響應新的請求,即"拒絕服務請求".從整個服務器的角度來分析,服務器的響應鏈接的數目也是有限的,當請求過多時,就會再也不響應新的請求,而強悍的DDOS攻擊就是這一基本原理實現的,經過僞造大量的虛假請求,使服務器拒絕正常的客戶請求,使服務器癱瘓.

    12. StartServers 設置Apache啓動後等待接受請求的空閒子進程數.

    13. MaxSpareServers 設置Apache的最大空閒的進程數,當超過指定數目時,Apache就會殺掉多餘的進程已節省系統資源

    14. MaxClients 設置Apache的最大鏈接數

    15. include 文件包含,Apache服務器的一大亮點是其簡單而強大的配置.在httpd.conf文件裏,還能夠經過這個簡單的文件包含來擴展其相關的配置選項.這樣也便於管理.

  三  訪問限制策略

    1.Apache服務器的配置指令

    order指令:用於指定執行容許訪問控制規則或者拒絕訪問控制規則的順序.由Allow或者Deny的前後排序來設置針對客戶機的域名或者IP地址的訪問權限,後者對前者有覆蓋效果.下面舉例說明:

Example1:
//ppp.org域中的全部主機都容許訪問本網站,後面的Allow語句覆蓋了Deny語句
Order Deny,Allow 
Deny from all
Allow from ppp.org

Example2:
Order Deny,Allow
Deny from all
Allow from 192.168.1.
Allow from 127.
Allow from ppp.org 

    2.使用.htaccess文件進行訪問控制

    關於.htaccess文件:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html

    任何在http.conf配置文件中的配置指令均可能應用到.htaccess文件中.該文件用於針對單一目錄進行訪問控制.能夠在httpd.conf文件中的AccessFileName指令設置.AccessFileName .htaccess

<Files ~ "^\.htaccess">
  Order allow,deny
  Deny from all
</Files>

  要限制.htaccess文件能覆蓋的內容,須要使用AllowOverride指令.該指令能夠進行全局設置或者對單個文件進行配置.要配置默認的選項,可使用Options指令.如下是對/var/www/icons目錄的訪問控制:

<Directory "/var/www/icons">
    Options Indexs MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

  AllowOverride指令能夠指定.htaccess文件覆蓋的選項.能夠對每個目錄進行設置.其設置選項能夠是:All,None,Option,FileInfo,AuthConfig,Indexes以及Limit選項,具體功能:

Option  //文件能夠爲該目錄沒有在Option指令中列出的選項
FileInfo  //.htaccess文件包含修改文檔類型信息的指令
AuthConfig  //.htaccess文件可能包含的驗證指令
Limit //.htaccess文件可能包含的Allow,Deny,Order指令
Indexes  //控制目錄列表方式
None  //禁止處理.htaccess文件
All //表示讀取以上全部指令內容

    .htaccess文件是用於對單一目錄進行的配置,放在web網頁目錄下,用於控制該目錄及其子目錄的訪問控制策略.啓動該控制策略須要將Apache的主配置文件裏的AllowOverride設置爲All.最後說一句,雖然.htaccess文件增強了Apache服務器的安全性,可是.htaccess文件也是不安全的,在前面的博文(http://www.cnblogs.com/lingerhk/p/4009073.html)中講了針對.htaccess文件的木馬後門.因此,沒有絕對的安全!

  四  使用認證和受權訪問

    用戶認證在網絡安全是很是重要的手段.在啓用用戶認證後,用戶第一次訪問時瀏覽器會彈出一個用戶認證框,只有正確的用戶名和密碼時,才能進入.

    常見的認證類型有兩種:基本認證(Basic,使用用戶名和密碼認證)和摘要認證(Digest,使用了一個針對客戶端的challenge信息認證).這個設置能夠寫在httpd.conf文件中,也能夠可是寫在單獨的.htaccess文件裏,其相關指令有:

AuthName 用於定義受保護區域的名稱

AuthType 用戶指定使用的認證方式,包括上面講的兩種模式

AuthGroupFiles 用於指定認證組文件的位置

AuthUserFiles 用戶指定認證口令文件的位置 

  對於用戶的受權也有三種方式:

  (1)受權給指定的一個或多個用戶

  (2)受權給指定的一個或多個用戶

  (3)受權給指定口令文件中的全部用戶

       建立認證文件(注意:建立的口令文件必須放到web目錄以外,以免泄漏):例如/etc/httpd/passwd_auth

~# htpassswd -c /etc/httpd/passwd_auth linger //-c表示,刪除原有文件的內容並從新寫入,若是是添加,則能夠不用該選項

  使用主配置文件配置用戶認證及受權,形式以下:

<Directory "/var/www/html/test">
  AllowOverride None  //禁用.htaccess文件
  AuthType Basic  //使用Basic認證模式
  AuthName "test"  //顯示領域內容
   AuthUserFile /etc/httpd/passwd_auth  //讀取口令文件的地址
   Require user linger  //容許訪問的用戶名,多個用戶使用空格分開
</Directory>

   固然,除了使用主配置文件來進行用戶認證以外,還可使用.htaccess文件:

         (1)開啓用戶認證支持:

<Directory "/var/www/html/test">
    AllowOverride AuthCOnfig
<Directory>

  (2)在.htaccess文件中加入以下語句: 

AuthType Basic
AuthName "Please Login:"
AuthUserFiles /etc/httpd/passwd_auth
Require user linger

    五  虛擬目錄的設置

    虛擬目錄是相對於Apache主目錄的相對路徑或絕對路徑的別名.虛擬目錄的設置在必定程度上增長了Web服務器的安全性,在經過數據庫備份的方法產生webshell時,是須要知道web目錄的絕對路徑的,這樣才能正常訪問到產生的webshell,可是在某些時候,因爲配置錯誤,或者是網頁源碼錯誤,致使暴露出web服務器的絕對路徑,這就須要時常對本身的網站進行測試.這裏還要說一點,通常在linux下web服務器,都有默認的web目錄地址,這樣無疑會留下安全隱患,因此建議更改其絕對路徑,即更改httpd.conf配置文件的DocumentRoot項.如下是一個簡單的虛擬目錄的相關配置:

//httpd.conf
<IfMode alias_module>
  Alias /phpmyadmin "/home/linger/phpmyadmindir"
  ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
</IfModule>
<Directory "/usr/local/apache /cgi-bin/"> //設置cgi-bin目錄屬性
  AllowOverride NOne
  Options  ExecCGI
  Reguire all granted
</Directory>

  六 設置虛擬主機

  Apache服務器是最先實現虛擬主機的web服務器,設置虛擬主機的好處是可使一臺物理服務器能夠同時運行多個web服務,如今多數虛擬主機租用商就是通個這個功能來實現多域名訪問的.虛擬主機能夠分爲兩種,基於IP的和基於域名的虛擬主:基於IP的就是一臺物理服務器上有多個網卡(能夠是硬件的,也能夠是經過軟件實現的),當訪問這些不一樣的IP時,雖然數據包到達同一臺物理服務器,可是跟據客戶請求的IP不一樣,Apache服務器會返回客戶不一樣的數據.基於域名的虛擬主機,就是Apache服務器根據客戶端不一樣的域名請求(這些在http-headers裏有的),查找不一樣的web目錄,再返回給客戶端.因爲當前IPv4短缺,並且域名比較好記,因此基於域名的虛擬主機比較流行,如下是一個基於域名的虛擬主機的配置:

//設置第一個虛擬主機
<VirtualHost *:80>
  ServerAdmin webmaster@linger.com
  DocumentRoot "/usr/local/apache/server1"
  ServerName server1.com
  ServerAlias www.server1.com
  ErrorLog "logs/server1_error_log"
  CustomLog "logs/server1_access_log" common
</VirtualHost>
//設置第二個虛擬主機
<VirtualHost *:80>
  ServerAdmin webmaster@linger.com
  DocumentRoot "/usr/local/apache/server2"
  ServerName server2.com
  ServerAlias www.server2.com
  ErrorLog "logs/server2_error_log"
  CustomLog "logs/server2_access_log" common  //common表示使用普通日誌格式
</VirtualHost>

  七  設置Apache服務器的日誌管理

  日誌文件是用戶管理和監控Apache服務器安全運行的很是好的材料.無疑,大數據時代,基於web日誌的用戶上網習慣分析以及各類數據挖掘與分析,使得相關服務慢慢流行.另外,在安全管理方面的,日誌的做用是很重要的,尤爲是排查Apache服務錯誤以及查找入侵源.Apache服務器運行時會產生2個標準日誌文件:錯誤日誌(access_log),訪問日誌(error_log).另外,須要補充的是,Apache服務器運行時,會產生大量(以GB計算)的日誌文件,若是不須要保存的話,能夠適當刪除,以節省硬盤空間,若是服務器的硬盤比較小的話,這一點顯得比較重要了.

  Apache中有幾條與日誌相關的配置指令:

  1. ErrorLog 指定錯誤日誌的存放路徑 例: ErrorLog "logs/error_log"

  2. LogLevel 指定錯誤日誌的錯誤登記 例: LogLevel warn

  3. LogFormat 日誌記錄格式的命名,其使用不少變量,便於個性化定製 例: LogFormat "%h %l %u %t \"%r\" %>s %b" common

  4. CustomLog 指定訪問日誌存放的路徑和記錄格式 例: CustomLog "logs/access_log" common   

變 量 含 義
%b 發送字節,不包括 HTTP 標題
%f 文件名
%{VARIABLE}e 環境變量 VARIABLE 的內容
%h 遠程主機
%a 遠程 IP 地址
%{HEADER}i HEADER 內容;發送到服務器的請求的標題行
%l 遠程登陸名(若是提供該值,則從 identd 得到)
%{NOTE}n 來自另外一個模塊的 NOTE 通知的內容
%{HEADER}o HEADER 的內容,回覆中的標題行
%p 服務器服務於請求的規範端口
%P 服務於請求的子進程的 ID
%r 請求的第一行
%s 狀態。對於內部重定向的請求,該狀態爲初始請求—最後是 %>s
%t 時間,格式爲 common 日誌格式中的時間格式
%{format}t 時間,格式由 format 給出。能夠是 strftime(3)格式
%T 服務請求花費的時間,以秒計
%u 來自 auth 的遠程用戶;若是返回的狀態(%s)爲 401 則多是假的
%U 請求的 URL 路徑
%v

服務於該請求的服務器的規範 ServerName

在每一個變量中,能夠在前面設置一個條件,決定是否顯示該變量。若是不顯示,則顯示 -。這些條件是數值返回值列表的形式。另外,還可使用 CustomLog 指令指定日誌文件的位置和格式。若是沒有指定日誌文件的絕對路徑,則日誌文件的位置假定爲相對於 ServerRoot。下面是 httpd.conf 文件中指定日誌文件的語句:

 CustomLog logs/access_log common 
 ErrorLog logs/error_log
Apache 中的錯誤日誌記錄等級: 
緊急性 等級 說明
1 Emerg 出現緊急情況使得系統不可用
2 Alert 須要當即引發注意的情況
3 Crit 危險狀況的警告
4 Error 除上述 3 種狀況以外的其餘錯誤
5 Warn 警告信息
6 Notice 須要引發注意的狀況,不如第 4 和第 5 類重要
7 Info 須要報告的通常消息
8 Debug 運行於 debug 模式的程序產生的消息


Apache服務器中的訪問日誌分爲4類:
  • 普通日誌格式(common log format,CLF):大多很多天志分析軟件都支持這種格式,其在 LogFormat 指定中定義的暱稱爲 common;
  • 參考日誌格式(referer log format):記錄客戶訪問站點的用戶身份,其在 LogFormat 指定中定義的暱稱爲 referer;
  • 代理日誌格式(agent log format):記錄請求的用戶代理,其在 LogFormat 指定中定義的暱稱爲 agent;
  • 綜合日誌格式(combined log format):即結合上述三種格式的日誌信息,其在 LogFormat 指定中定義的暱稱爲 combined。

因爲綜合日誌格式有效地結合了其餘 3 種日誌格式和信息,因此在在實際的使用過程當中,配製訪問日誌可使用 3 個文件進行分別記錄,配置以下:

LogFormat 「%h %l %u %t \ 「%r\」 %>s %b」 common 
 LogFormat 「%{Referer}i->%U」 referer 
 LogFormat 「%{Apache User-agent}i」 agent 
 CustomLog logs/access_log common 
 CustomLog logs/referer_log referer 
 CustomLog logs/agent_log agent

 也可使用一個綜合文件進行記錄,相應配置示例以下:

LogFormat 「%h %l %u %t \ 「%r\」 %>s %b \」%{Referer}i\」 \ 「%{Apache User-Agent}i\」」combined
CustomLog logs/access_log combined

如下是在httpd.conf文件裏的配置: 

//httpd.conf文件
ErrorLog "Logs/error_log"
logLevel warn
<IfMode log_config_module>
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  LogFormat "%h %l %u %t \"%r\" %>s %b" common
  
  <IfModule login_module>
  LogFormat "%h %l %u %t \"%r" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  </IfModule>
  
  CustomLog "logs/access_log" common
  CustomLog "logs/access_log" combined
</IfModule>  
相關文章
相關標籤/搜索