Apache安全和強(qiáng)化的十三個(gè)技巧
Apache是一個(gè)很受歡迎的web服務(wù)器軟件,其安全性對(duì)于網(wǎng)站的安全運(yùn)營(yíng)可謂生死攸關(guān)。下面介紹一些可幫助管理員在Linux上配置Apache確保其安全的方法和技巧。
本文假設(shè)你知道這些基本知識(shí):
文檔的根目錄: /var/www/html or /var/www
主配置文件: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora等系統(tǒng)) 或/etc/apache/apache2.conf (Debian/Ubuntu).
默認(rèn)HTTP 端口: 80 TCP
默認(rèn) HTTPS 端口: 443 TCP
測(cè)試配置文件設(shè)置及語(yǔ)法: httpd -t
對(duì)Web服務(wù)器的日志文件的訪問(wèn): /var/log/httpd/access_log
Web服務(wù)器錯(cuò)誤日志文件: /var/log/httpd/error_log
1、避免在錯(cuò)誤中顯示Apache版本和操作系統(tǒng)的ID
一般情況下,在用源代碼安裝或用yum等包安裝程序安裝Apache時(shí),Apache服務(wù)器的版本號(hào)和服務(wù)器操作系統(tǒng)的名稱(chēng)都可以在錯(cuò)誤消息中顯示,而且還會(huì)顯示安裝在服務(wù)器上的Apache模塊信息。
在上圖中,可以看出錯(cuò)誤頁(yè)面顯示了Apache的版本以及服務(wù)器所安裝的操作系統(tǒng)版本。這有可能成為Web服務(wù)器和Linux系統(tǒng)的一個(gè)重要威脅。為防止Apache把這些信息泄露出來(lái),我們需要在Apache的主要配置文件中進(jìn)行更改:
用vim編輯器打開(kāi)配置文件,查找“ServerSignature”,默認(rèn)情況下它是打開(kāi)狀態(tài)。我們需要關(guān)閉服務(wù)器簽名。ServerTokens Prod告訴Apache只在每一個(gè)請(qǐng)求網(wǎng)頁(yè)的服務(wù)器響應(yīng)的頭部,僅返回Apache產(chǎn)品名稱(chēng)。
# 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、禁用目錄列表
默認(rèn)情況下,在缺少index文件時(shí),Apache會(huì)列示root目錄的所有內(nèi)容。如下圖所示:
對(duì)于某個(gè)特定目錄,我們可以在配置文件中用“Options directive”關(guān)閉目錄列示。可以在httpd.conf或apache2.conf文件中加入如下項(xiàng)目:
Options -Indexes
其效果類(lèi)似于下圖:
3、經(jīng)常更新Apache
Apache的開(kāi)發(fā)社區(qū)一直在不斷地改善安全問(wèn)題,并經(jīng)常發(fā)布帶有新的安全特性的最新版本。所以我們建議你使用最新的Apache作為自己的web服務(wù)器。為檢查Apache的版本,我們可以用httpd –v命令來(lái)檢查最新的版本。
# 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
如果你并不是在特定操作系統(tǒng)或內(nèi)核上運(yùn)行某個(gè)特別的軟件,建議你保持內(nèi)核和Linux操作系統(tǒng)為最新版本。
4、禁用不必要的模塊
為了盡量減少網(wǎng)站遭受Web攻擊的機(jī)會(huì),管理員最好禁用目前不用的所有模塊。你可以使用下面的命令,列示W(wǎng)eb服務(wù)器所有的已編譯模塊。
# 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 ……
上述模塊在默認(rèn)情況下都是啟用的,但往往并不需要,特別是mod_imap,mod_include, mod_info, mod_userdir, mod_autoindex。要禁用特定的模塊,可以在該模塊所在行的開(kāi)頭插入“#”注釋?zhuān)⒅匦聠?dòng)服務(wù)。
5、用獨(dú)立的用戶(hù)和組運(yùn)行Apache
在默認(rèn)的安裝方式中,運(yùn)行Apache進(jìn)程時(shí)的用戶(hù)是“nobody”或daemon。為安全起見(jiàn),我們建議用非特權(quán)賬戶(hù)運(yùn)行Apache,例如,我們要使用http-web,就需要?jiǎng)?chuàng)建該Apache 用戶(hù)和組:
# groupadd http-web # useradd -d /var/www/ -g http-web -s /bin/nologin http-web
現(xiàn)在你需要告訴Apache用這個(gè)新用戶(hù)運(yùn)行,為此,我們需要在/etc/httpd/conf/httpd.conf中加入一個(gè)新條目,并重新啟動(dòng)服務(wù)。
用vim編輯器打開(kāi)/etc/httpd/conf/httpd.conf ,查找關(guān)鍵字“User” 和 “Group”,然后將后面的用戶(hù)名和組名改為http-web:
User http-web Group http-web
6、對(duì)用戶(hù)的允許和禁止,限制對(duì)目錄的訪問(wèn)
我們可以用httpd.conf文件中的“Allow” 和“Deny”限制對(duì)目錄的訪問(wèn)。在本例中,我們要保證root目錄的安全,在httpd.conf文件中進(jìn)行如下的設(shè)置:
Options None Order deny,allow Deny from all
其中,Options “None”表示不允許用戶(hù)啟用任何可選特性。
Order deny, allow---在這里處理“Deny” 和 “Allow”指令,首先禁用,然后才是允許。
Deny from all,禁用所有人對(duì)root目錄的請(qǐng)求,任何人都不能訪問(wèn)根(root)目錄。
7、使用mod_security和mod_evasive來(lái)保障Apache的安全
“mod_security”和“mod_evasive”是Apache在安全方面非常流行的兩個(gè)模塊。mod_security作為防火墻而運(yùn)行,它允許我們適時(shí)地監(jiān)視通信,還可以有助于我們保護(hù)網(wǎng)站或Web服務(wù)器免受暴力破解攻擊。借助默認(rèn)的包安裝程序,我們可以輕松地把mod_security安裝在服務(wù)器上。下例說(shuō)明如何在Ubuntu或Debian系統(tǒng)上安裝mod_security:
$ sudo apt-get install libapache2-mod-security $ sudo a2enmod mod-security $ sudo /etc/init.d/apache2 force-reload
下面的命令可以在RHEL/CentOS/Fedora系統(tǒng)上安裝mod_security:
# yum install mod_security # /etc/init.d/httpd restart
另一個(gè)模塊mod_evasive的工作效率很高,它只采用一個(gè)請(qǐng)求就可以很好地工作,可以防止DDoS攻擊造成巨大危害。mod_evasive可以應(yīng)對(duì)http暴力破解攻擊和DoS(或DDoS)攻擊。該模塊可以在三種情況下檢測(cè)攻擊:一是在每秒鐘內(nèi)有太多請(qǐng)求到達(dá)同一個(gè)頁(yè)面時(shí),二是在任何子進(jìn)程試圖發(fā)出超過(guò)50個(gè)并發(fā)請(qǐng)求時(shí),三是在任何地址已經(jīng)被臨時(shí)列入黑名單時(shí)它仍試圖嘗試新的請(qǐng)求。
8、禁用Apache遵循符號(hào)鏈接
默認(rèn)情況下,Apache遵循符號(hào)鏈接,我們可以用options指令的FollowSymLinks來(lái)關(guān)閉這個(gè)特性。為此,我們需要在主配置文件中加入一條:
Options –FollowSymLinks
如果有一個(gè)特定的用戶(hù)或網(wǎng)站需要遵循符號(hào)連接,我們可以在那個(gè)網(wǎng)站的.htaccess文件中增加規(guī)則:
# Enable symbolic links Options +FollowSymLinks
注意:為將規(guī)則重新寫(xiě)入到.htaccess文件中,在主配置文件中,應(yīng)當(dāng)全局防止“AllowOverride All”
9、關(guān)閉服務(wù)器端包含和CGI執(zhí)行
如果我們不需要,就可以關(guān)閉服務(wù)器端包含(mod_include)和CGI執(zhí)行。為此,我們需要修改主配置文件:
Options -Includes Options –ExecCGI
我們還可以用Directior標(biāo)記對(duì)特定目錄執(zhí)行這種操作。在本例中,我們關(guān)閉了/var/www/html/web1這個(gè)目錄的Includes和Cgi文件執(zhí)行:
Options -Includes -ExecCGI
下面列示的是其它一些可以用Options指令打開(kāi)或關(guān)閉的值:
Options All:立即啟用所有選項(xiàng)。如果你不想在Apache配置文件或.htaccess中明確地指定任何值,那么它就是默認(rèn)值。 Options IncludesNOEXEC:該選項(xiàng)允許服務(wù)器端包含文件但不執(zhí)行命令或CGI。 Options MultiViews:允許內(nèi)容協(xié)商多重視圖(使用mod_negotiation) Options SymLinksIfOwnerMatch:跟FollowSymLinks類(lèi)似。但是要當(dāng)符號(hào)連接和被連接的原始目錄是同一所有者時(shí)才被允許。
10、限制請(qǐng)求的大小
Apache在默認(rèn)情況下對(duì)HTTP請(qǐng)求的總大小是沒(méi)有限制的。在你允許Web服務(wù)器可以接受大量請(qǐng)求時(shí),你就有可能成為DoS攻擊的受害者。我們可以用directiory標(biāo)簽來(lái)限制 LimitRequestBody指令的請(qǐng)求大小。
你可以用字節(jié)來(lái)設(shè)置這個(gè)值(從0到2147483647,0表示無(wú)限制)。你可以根據(jù)自己的需要限制這個(gè)值。假設(shè)你要限制user_uploads這個(gè)目錄所包含的用戶(hù)上傳文件量,并且限制為500K,就應(yīng)當(dāng):
LimitRequestBody 512000
11、DDoS攻擊的防御和強(qiáng)化
你不可能完全阻止企業(yè)網(wǎng)站免受DdoS攻擊。下面這些命令便于你進(jìn)行控制。
TimeOut指令用于設(shè)置在特定事件失效之前,服務(wù)器等待事件完成的時(shí)間長(zhǎng)度。其默認(rèn)值是300秒。對(duì)于容易遭受DDoS攻擊的網(wǎng)站,把這個(gè)值降低很有好處。這個(gè)值的大小取決于網(wǎng)站上的請(qǐng)求種類(lèi)。注意,對(duì)于某些CGI腳本,這個(gè)設(shè)置可能會(huì)產(chǎn)生問(wèn)題。
MaxClients:此指令允許用戶(hù)設(shè)置服務(wù)器可同時(shí)服務(wù)的連接限制。每一個(gè)新連接都要根據(jù)這個(gè)限制進(jìn)行排隊(duì)。它適用于Prefork和Worker。其默認(rèn)值為256。 KeepAliveTimeout:在關(guān)閉連接之前,服務(wù)器隨后的等待時(shí)間長(zhǎng)度。默認(rèn)值是5秒。 LimitRequestFields:這個(gè)設(shè)置可以幫助我們限制可以接受的HTTP請(qǐng)求的頭部字段數(shù)量。其默認(rèn)值為100。 有時(shí),由于http的請(qǐng)求頭部過(guò)多而導(dǎo)致發(fā)生DDoS攻擊,用戶(hù)不妨降低這個(gè)值。 LimitRequestFieldSize:幫助我們?cè)O(shè)置HTTP請(qǐng)求頭部的大小。
12、啟用Apache日志功能
Apache允許你獨(dú)立記錄操作系統(tǒng)的日志。例如,在用戶(hù)與Web服務(wù)器進(jìn)行交互時(shí)所輸入的命令信息就非常有用。
為此,你需要包含mod_log_config模塊。Apache有三個(gè)主要的與日志相關(guān)的指令:
TransferLog:創(chuàng)建日志文件 LogFormat :設(shè)置定制格式 CustomLog :創(chuàng)建并格式化一個(gè)日志文件
我們還可以在虛擬主機(jī)部分設(shè)置這些命令。例如,下面的例子是啟用了日志功能的一個(gè)網(wǎng)站的虛擬主機(jī)配置:
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
13、用ssl證書(shū)保障Apache的安全
你還可以用SSL證書(shū)用加密的方式保障信息傳輸?shù)陌踩?。在電子商?wù)網(wǎng)站中,消費(fèi)者為了買(mǎi)東西,有時(shí)需要提供賬戶(hù)或信用卡的細(xì)節(jié),默認(rèn)情況下,Web服務(wù)器用明文發(fā)送這些信息。配置服務(wù)器使其借助于SSL證書(shū)就可以為用戶(hù)進(jìn)行加密傳輸。
企業(yè)可以從不同的SSL供應(yīng)商購(gòu)買(mǎi)SSL證書(shū)。小型企業(yè)一般并不愿意購(gòu)買(mǎi)SSL證書(shū),此時(shí),你仍可以為網(wǎng)站分配一個(gè)自簽名證書(shū)。Apache使用mod_ssl模塊來(lái)支持SSL證書(shū)。
# 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
在創(chuàng)建并簽署了證書(shū)后,你需要在Apache配置中增加這個(gè)證書(shū)。用vim編輯器打開(kāi)主配置文件,并增加下面的內(nèi)容,然后重啟服務(wù):
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
此時(shí),打開(kāi)瀏覽器,并輸入https://example.com,就可以看到自簽名的證書(shū)。