Apache安全和強化的十三個技巧

jopen 11年前發布 | 25K 次閱讀 Apache Web服務器

Apache是一個很受歡迎的web服務器軟件,其安全性對于網站的安全運營可謂生死攸關。下面介紹一些可幫助管理員在Linux上配置Apache確保其安全的方法和技巧。

本文假設你知道這些基本知識:

  • 文檔的根目錄: /var/www/html or /var/www
  • 主配置文件: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora等系統) 或/etc/apache/apache2.conf (Debian/Ubuntu).
  • 默認HTTP 端口: 80 TCP
  • 默認 HTTPS 端口: 443 TCP
  • 測試配置文件設置及語法: httpd -t
  • 對Web服務器的日志文件的訪問: /var/log/httpd/access_log
  • Web服務器錯誤日志文件: /var/log/httpd/error_log
  • </ul>

    1、避免在錯誤中顯示Apache版本和操作系統的ID

    一般情況下,在用源代碼安裝或用yum等包安裝程序安裝Apache時,Apache服務器的版本號和服務器操作系統的名稱都可以在錯誤消息中顯示,而且還會顯示安裝在服務器上的Apache模塊信息。

    在上圖中,可以看出錯誤頁面顯示了Apache的版本以及服務器所安裝的操作系統版本。這有可能成為Web服務器和Linux系統的一個重要威脅。為防止Apache把這些信息泄露出來,我們需要在Apache的主要配置文件中進行更改:

    用vim編輯器打開配置文件,查找“ServerSignature”,默認情況下它是打開狀態。我們需要關閉服務器簽名。ServerTokens Prod告訴Apache只在每一個請求網頁的服務器響應的頭部,僅返回Apache產品名稱。

    # vim /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora)
    # vim /etc/apache/apache2.conf (Debian/Ubuntu)
    ServerSignature Off
    ServerTokens Prod
    # service httpd restart (RHEL/CentOS/Fedora)
    # service apache2 restart (Debian/Ubuntu)

    2、禁用目錄列表

    默認情況下,在缺少index文件時,Apache會列示root目錄的所有內容。如下圖所示:

    對于某個特定目錄,我們可以在配置文件中用“Options directive”關閉目錄列示。可以在httpd.conf或apache2.conf文件中加入如下項目:

    <Directory /var/www/html>
      Options -Indexes
    </Directory>

    其效果類似于下圖:

    3、經常更新Apache

    Apache的開發社區一直在不斷地改善安全問題,并經常發布帶有新的安全特性的最新版本。所以我們建議你使用最新的Apache作為自己的web服務器。為檢查Apache的版本,我們可以用httpd –v命令來檢查最新的版本。

    # httpd -v
    Server version: Apache/2.2.15 (Unix)
    Server built:   Aug 13 2013 17:29:28

    可以用下面的命令更新Apache版本。

    # yum update httpd
    # apt-get install apache2

    如果你并不是在特定操作系統或內核上運行某個特別的軟件,建議你保持內核和Linux操作系統為最新版本。

    4、禁用不必要的模塊

    為了盡量減少網站遭受Web攻擊的機會,管理員最好禁用目前不用的所有模塊。你可以使用下面的命令,列示Web服務器所有的已編譯模塊。

    # grep LoadModule /etc/httpd/conf/httpd.conf
    # have to place corresponding `LoadModule' lines at this location so the
    # LoadModule foo_module modules/mod_foo.so
    LoadModule auth_basic_module modules/mod_auth_basic.so
    LoadModule auth_digest_module modules/mod_auth_digest.so
    LoadModule authn_file_module modules/mod_authn_file.so
    LoadModule authn_alias_module modules/mod_authn_alias.so
    LoadModule authn_anon_module modules/mod_authn_anon.so
    LoadModule authn_dbm_module modules/mod_authn_dbm.so
    LoadModule authn_default_module modules/mod_authn_default.so
    LoadModule authz_host_module modules/mod_authz_host.so
    LoadModule authz_user_module modules/mod_authz_user.so
    LoadModule authz_owner_module modules/mod_authz_owner.so
    LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
    LoadModule authz_dbm_module modules/mod_authz_dbm.so
    LoadModule authz_default_module modules/mod_authz_default.so
    LoadModule ldap_module modules/mod_ldap.so
    LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
    LoadModule include_module modules/mod_include.so
    LoadModule log_config_module modules/mod_log_config.so
    LoadModule logio_module modules/mod_logio.so
    LoadModule env_module modules/mod_env.so
    LoadModule ext_filter_module modules/mod_ext_filter.so
    ……

    上述模塊在默認情況下都是啟用的,但往往并不需要,特別是mod_imap,mod_include, mod_info, mod_userdir, mod_autoindex。要禁用特定的模塊,可以在該模塊所在行的開頭插入“#”注釋,并重新啟動服務。

    5、用獨立的用戶和組運行Apache

    在默認的安裝方式中,運行Apache進程時的用戶是“nobody”或daemon。為安全起見,我們建議用非特權賬戶運行Apache,例如,我們要使用http-web,就需要創建該Apache 用戶和組:

    # groupadd http-web
    # useradd -d /var/www/ -g http-web -s /bin/nologin http-web

    現在你需要告訴Apache用這個新用戶運行,為此,我們需要在/etc/httpd/conf/httpd.conf中加入一個新條目,并重新啟動服務。
    用vim編輯器打開/etc/httpd/conf/httpd.conf ,查找關鍵字“User” 和 “Group”,然后將后面的用戶名和組名改為http-web:

    User http-web
    Group http-web

    6、對用戶的允許和禁止,限制對目錄的訪問

    我們可以用httpd.conf文件中的“Allow” 和“Deny”限制對目錄的訪問。在本例中,我們要保證root目錄的安全,在httpd.conf文件中進行如下的設置:

    <Directory />
       Options None
       Order deny,allow
       Deny from all
    </Directory>

    其中,Options “None”表示不允許用戶啟用任何可選特性。

    Order deny, allow---在這里處理“Deny” 和 “Allow”指令,首先禁用,然后才是允許。

    Deny from all,禁用所有人對root目錄的請求,任何人都不能訪問根(root)目錄。

    7、使用mod_security和mod_evasive來保障Apache的安全

    “mod_security”和“mod_evasive”是Apache在安全方面非常流行的兩個模塊。mod_security作為防火墻而運行,它 允許我們適時地監視通信,還可以有助于我們保護網站或Web服務器免受暴力破解攻擊。借助默認的包安裝程序,我們可以輕松地把mod_security安 裝在服務器上。下例說明如何在Ubuntu或Debian系統上安裝mod_security:

    $ sudo apt-get install libapache2-mod-security
    $ sudo a2enmod mod-security
    $ sudo /etc/init.d/apache2 force-reload

    下面的命令可以在RHEL/CentOS/Fedora系統上安裝mod_security:

    # yum install mod_security
    # /etc/init.d/httpd restart

    另一個模塊mod_evasive的工作效率很高,它只采用一個請求就可以很好地工作,可以防止DDoS攻擊造成巨大危害。mod_evasive可以應 對http暴力破解攻擊和DoS(或DDoS)攻擊。該模塊可以在三種情況下檢測攻擊:一是在每秒鐘內有太多請求到達同一個頁面時,二是在任何子進程試圖 發出超過50個并發請求時,三是在任何地址已經被臨時列入黑名單時它仍試圖嘗試新的請求。

    8、禁用Apache遵循符號鏈接

    默認情況下,Apache遵循符號鏈接,我們可以用options指令的FollowSymLinks來關閉這個特性。為此,我們需要在主配置文件中加入一條:

    Options –FollowSymLinks

    如果有一個特定的用戶或網站需要遵循符號連接,我們可以在那個網站的.htaccess文件中增加規則:

    # Enable symbolic links
    Options +FollowSymLinks

    注意:為將規則重新寫入到.htaccess文件中,在主配置文件中,應當全局防止“AllowOverride All”

    9、關閉服務器端包含和CGI執行

    如果我們不需要,就可以關閉服務器端包含(mod_include)和CGI執行。為此,我們需要修改主配置文件:

    Options -Includes
    Options –ExecCGI

    我們還可以用Directior標記對特定目錄執行這種操作。在本例中,我們關閉了/var/www/html/web1這個目錄的Includes和Cgi文件執行:

    <Directory "/var/www/html/web1">
     Options -Includes -ExecCGI
    </Directory>

    下面列示的是其它一些可以用Options指令打開或關閉的值:

    Options All:立即啟用所有選項。如果你不想在Apache配置文件或.htaccess中明確地指定任何值,那么它就是默認值。

    Options IncludesNOEXEC:該選項允許服務器端包含文件但不執行命令或CGI。

    Options MultiViews:允許內容協商多重視圖(使用mod_negotiation)

    Options SymLinksIfOwnerMatch:跟FollowSymLinks類似。但是要當符號連接和被連接的原始目錄是同一所有者時才被允許。

    10、限制請求的大小

    Apache在默認情況下對HTTP請求的總大小是沒有限制的。在你允許Web服務器可以接受大量請求時,你就有可能成為DoS攻擊的受害者。我們可以用directiory標簽來限制 LimitRequestBody指令的請求大小。

    你可以用字節來設置這個值(從0到2147483647,0表示無限制)。你可以根據自己的需要限制這個值。假設你要限制user_uploads這個目錄所包含的用戶上傳文件量,并且限制為500K,就應當:

    <Directory "/var/www/myweb1/user_uploads">
       LimitRequestBody 512000
    </Directory>

    11、DDoS攻擊的防御和強化

    你不可能完全阻止企業網站免受DdoS攻擊。下面這些命令便于你進行控制。

    TimeOut指令用于設置在特定事件失效之前,服務器等待事件完成的時間長度。其默認值是300秒。對于容易遭受DDoS攻擊的網站,把這個值降低很有好處。這個值的大小取決于網站上的請求種類。注意,對于某些CGI腳本,這個設置可能會產生問題。

    MaxClients:此指令允許用戶設置服務器可同時服務的連接限制。每一個新連接都要根據這個限制進行排隊。它適用于Prefork和Worker。其默認值為256。

    KeepAliveTimeout:在關閉連接之前,服務器隨后的等待時間長度。默認值是5秒。

    LimitRequestFields:這個設置可以幫助我們限制可以接受的HTTP請求的頭部字段數量。其默認值為100。 有時,由于http的請求頭部過多而導致發生DDoS攻擊,用戶不妨降低這個值。

    LimitRequestFieldSize:幫助我們設置HTTP請求頭部的大小。

    12、啟用Apache日志功能

    Apache允許你獨立記錄操作系統的日志。例如,在用戶與Web服務器進行交互時所輸入的命令信息就非常有用。

    為此,你需要包含mod_log_config模塊。Apache有三個主要的與日志相關的指令:

    TransferLog:創建日志文件
    LogFormat :設置定制格式
    CustomLog :創建并格式化一個日志文件

    我們還可以在虛擬主機部分設置這些命令。例如,下面的例子是啟用了日志功能的一個網站的虛擬主機配置:

    <VirtualHost *:80>
    DocumentRoot /var/www/html/example.com/
    ServerName www.example.com
    DirectoryIndex index.htm index.html index.php
    ServerAlias example.com
    ErrorDocument 404 /story.php
    ErrorLog /var/log/httpd/example.com_error_log
    CustomLog /var/log/httpd/example.com_access_log combined
    </VirtualHost>

    13、用ssl證書保障Apache的安全

    你還可以用SSL證書用加密的方式保障信息傳輸的安全。在電子商務網站中,消費者為了買東西,有時需要提供賬戶或信用卡的細節,默認情況下,Web服務器用明文發送這些信息。配置服務器使其借助于SSL證書就可以為用戶進行加密傳輸。

    企業可以從不同的SSL供應商購買SSL證書。小型企業一般并不愿意購買SSL證書,此時,你仍可以為網站分配一個自簽名證書。Apache使用mod_ssl模塊來支持SSL證書。

    # openssl genrsa -des3 -out example.com.key 1024
    # openssl req -new -key example.com.key -out exmaple.csr
    # openssl x509 -req -days 365 -in example.com.com.csr -signkey example.com.com.key -out example.com.com.crt

    在創建并簽署了證書后,你需要在Apache配置中增加這個證書。用vim編輯器打開主配置文件,并增加下面的內容,然后重啟服務:

    <VirtualHost 172.16.25.125:443>
            SSLEngine on
            SSLCertificateFile /etc/pki/tls/certs/example.com.crt
            SSLCertificateKeyFile /etc/pki/tls/certs/example.com.key
            SSLCertificateChainFile /etc/pki/tls/certs/sf_bundle.crt
            ServerAdmin ravi.saive@example.com
            ServerName example.com
            DocumentRoot /var/www/html/example/
            ErrorLog /var/log/httpd/example.com-error_log
            CustomLog /var/log/httpd/example.com-access_log common
    </VirtualHost>

    此時,打開瀏覽器,并輸入https://example.com,就可以看到自簽名的證書。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!