如果你是一個系統管理員,你應該按照以下的10點建議來保證Apache web服務器的安全。
1、禁用不必要的模塊
如果你打算源碼編譯安裝apache,你應該禁用以下的模塊。如果你運行./configure -help,你將會看到所有可用的你可以禁用/開啓的模塊。
- userdir –用戶特定用戶的請求映射。例如:帶用戶名的URL會轉化成服務器的一個目錄。
- autoindex – 當沒有默認首頁(如index.html)時顯示目錄列表。
- status –顯示服務器統計
- env – 清除或修改環境變量
- setenvif –根據客戶端請求頭字段設置環境變量
- cgi –CGI腳本
- actions – 根據特定的媒體類型或請求方法,激活特定的CGI腳本
- negotiation –提供內容協商支持
- alias – 提供從文件系統的不同部分到文檔樹的映射和URL重定向
- include –實現服務端包含文檔(SSI)處理
- filter –根據上下文實際情況對輸出過濾器進行動態配置
- version –提供基於版本的配置段支持
- asis – 發送自己包含HTTP頭內容的文件
當你執行./configure按照下面禁用以上的所有模塊。
- ./configure \
- --enable-ssl \
- --enable-so \
- --disable-userdir \
- --disable-autoindex \
- --disable-status \
- --disable-env \
- --disable-setenvif \
- --disable-cgi \
- --disable-actions \
- --disable-negotiation \
- --disable-alias \
- --disable-include \
- --disable-filter \
- --disable-version \
- --disable-asis
如果激活ssl且禁用mod_setenv,你將會得到以下錯誤。
錯誤: Syntax error on line 223 of /usr/local/apache2/conf/extra/httpd-ssl.conf: Invalid command ‘BrowserMatch’, perhaps misspelled or defined by a module not included in the server configuration
解決方案:如果你使用ssl,不要禁用setenvif模塊。或者你禁用setenvif模塊,可以在httpd-ssl.conf註釋BrowserMatch。
安裝完成全,執行httpd -l,會列出所有已安裝的模塊。
- # /usr/local/apache2/bin/httpd -l
- Compiled in modules:
- core.c
- mod_authn_file.c
- mod_authn_default.c
- mod_authz_host.c
- mod_authz_groupfile.c
- mod_authz_user.c
- mod_authz_default.c
- mod_auth_basic.c
- mod_log_config.c
- mod_ssl.c
- prefork.c
- http_core.c
- mod_mime.c
- mod_dir.c
- mod_so.c
在這個例子裏,我們安裝瞭如下apache模塊:
- core.c –Apache核心模塊
- mod_auth* –各種身份驗證模塊
- mod_log_config.c –允許記錄日誌和定製日誌文件格式
- mod_ssl.c – SSL
- prefork.c – 一個非線程型的、預派生的MPM
- httpd_core.c – Apache核心模塊
- mod_mime.c – 根據文件擴展名決定應答的行爲(處理器/過濾器)和內容(MIME類型/語言/字符集/編碼)
- mod_dir.c – 指定目錄索引文件以及爲目錄提供”尾斜槓”重定向
- mod_so.c – 允許運行時加載DSO模塊
2、以單獨的用戶和用戶組運行Apache
Apache可能默認地以nobody或daemon運行。讓Apache運行在自己沒有特權的帳戶比較好。例如:用戶apache。
創建apache用戶組和用戶。
- groupadd apache
- useradd -d /usr/local/apache2/htdocs -g apache -s /bin/false apache
更改httpd.conf,正確地設置User和Group。
- # vi httpd.conf
- User apache
- Group apache
之後重啓apache,執行ps -ef命令你會看到apache以“apache”用戶運行(除了第一個都是以root運行之外)。
- # ps -ef | grep -i http | awk '{print $1}'
- root
- apache
- apache
- apache
- apache
- apache
3、限制訪問根目錄(使用Allow和Deny)
在httpd.conf文件按如下設置來增強根目錄的安全。
- <Directory />
- Options None
- Order deny,allow
- Deny from all
- </Directory>
在上面的:
- Options None –設置這個爲None,是指不激活其它可有可無的功能。
- Order deny,allow – 這個是指定處理Deny和Allow的順序。
- Deny from all –阻止所有請求。Deny的後面沒有Allow指令,所以沒人能允許訪問。
4、爲conf和bin目錄設置適當的權限
bin和conf目錄應該只允許授權用戶查看。創建一個組和把所有允許查看/修改apache配置文件的用戶增加到這個組是一個不錯的授權方法。
下面我們設置這個組爲:apacheadmin
創建組:
- groupadd apacheadmin
允許這個組訪問bin目錄。
- chown -R root:apacheadmin /usr/local/apache2/bin
- chmod -R 770 /usr/local/apache2/bin
允許這個組訪問conf目錄。
- chown -R root:apacheadmin /usr/local/apache2/conf
- chmod -R 770 /usr/local/apache2/conf
增加合適的用戶到這個組。
- # vi /etc/group
- apacheadmin:x:1121:user1,user2
5、禁止目錄瀏覽
如果你不關閉目錄瀏覽,用戶就能看到你的根目錄(或任何子目錄)所有的文件(目錄)。
比如,當他們瀏覽http://{your-ip}/images/而images下沒有默認首頁,那麼他們就會在瀏覽器中看到所有的images文件(就像ls -l輸出)。從這裏他們通過點擊就能看到私人的圖片文件,或點點擊子目錄看到裏面的內容。
爲了禁止目錄瀏覽,你可以設置Opitons指令爲“None“或者是“-Indexes”。在選項名前加“-”會強制性地在該目錄刪除這個特性。
Indexes選項會在瀏覽器顯示可用文件的列表和子目錄(當沒有默認首頁在這個目錄)。所以Indexes應該禁用。
- <Directory />
- Options None
- Order allow,deny
- Allow from all
- </Directory>
- (or)
- <Directory />
- Options -Indexes
- Order allow,deny
- Allow from all
- </Directory>
6、禁用.htaccess
在htdocs目錄下的特定子目錄下使用.htaccess文件,用戶能覆蓋默認apache指令。在一些情況下,這樣不好,應該禁用這個功能。
我們可以在配置文件中按如下設置禁用.htaccess文件來不允許覆蓋apache默認配置。
- <Directory />
- Options None
- AllowOverride None
- Order allow,deny
- Allow from all
- </Directory>
7、禁用其它選項
下面是一些Options指令的可用值。
- Options All –所有的選項被激活(除了MultiViews)。如果你不指定Options指令,這個是默認值。
- Options ExecCGI –執行CGI腳本(使用mod_cgi)。
- Options FollowSymLinks –如果在當前目錄有符號鏈接,它將會被跟隨。
- Options Includes –允許服務器端包含文件(使用mod_include)。
- Options IncludesNOEXEC –允許服務器端包含文件但不執行命令或cgi。
- Options Indexes –允許目錄列表。
- Options MultiViews -允許內容協商多重視圖(使用mod_negotiation)
- Options SymLinksIfOwnerMatch – 跟FollowSymLinks類似。但是要當符號連接和被連接的原始目錄是同一所有者是才被允許。
絕不要指定“Options All”,通常指定上面的一個或多個的選項。你可以按下面代碼把多個選項連接。
Options Includes FollowSymLinks
當你要嵌入多個Directory指令時,“+”和“-”是有用處的。也有可能會覆蓋上面的Directory指令。
如下面,/site目錄,允許Includes和Indexes。
- <Directory /site>
- Options Includes Indexes
- AllowOverride None
- Order allow,deny
- Allow from all
- </Directory>
對於/site/en目錄,如果你需要繼承/site目錄的Indexes(不允許Includes),而且只在這個目錄允許FollowSymLinks,如下:
- <Directory /site/en>
- Options -Includes +FollowSymLink
- AllowOverride None
- Order allow,deny
- Allow from all
- </Directory>
8、刪除不需要的DSO模塊
如果你加載了動態共享對象模塊到apache,他們應該在httpd.conf文件在“LoadModule”指令下。
請注意靜態編譯的Apache模塊是不在“LoadModule”指令裏的。
在httpd.conf註釋任何不需要的“LoadModules”指令。
- grep LoadModule /usr/local/apache2/conf/httpd.conf
9、限制訪問特定網絡(或IP地址)
如果你需要只允許特定IP地址或網絡訪問你的網站,按如下操作:
只允許特定網絡訪問你的網站,在Allow指令下給出網絡地址。
- <Directory /site>
- Options None
- AllowOverride None
- Order deny,allow
- Deny from all
- Allow from 10.10.0.0/24
- </Directory>
只允許特定IP地址訪問你的網站,在Allow指令下給出IP地址。
- <Directory /site>
- Options None
- AllowOverride None
- Order deny,allow
- Deny from all
- Allow from 10.10.10.21
- </Directory>
10、禁止顯示或發送Apache版本號(設置ServerTokens)
默認地,服務器HTTP響應頭會包含apache和php版本號。像下面的,這是有危害的,因爲這會讓***通過知道詳細的版本號而發起已知該版本的漏洞***。
- Server: Apache/2.2.17 (Unix) PHP/5.3.5
爲了阻止這個,需要在httpd.conf設置ServerTokens爲Prod,這會在響應頭中顯示“Server:Apache”而不包含任何的版本信息。
- # vi httpd.conf
- ServerTokens Prod
下面是ServerTokens的一些可能的賦值:
- ServerTokens Prod 顯示“Server: Apache”
- ServerTokens Major 顯示 “Server: Apache/2″
- ServerTokens Minor 顯示“Server: Apache/2.2″
- ServerTokens Min 顯示“Server: Apache/2.2.17″
- ServerTokens OS 顯示 “Server: Apache/2.2.17 (Unix)”
- ServerTokens Full 顯示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″ (如果你這指定任何的值,這個是默認的返回信息)
除了上面10個apache的安全建議,你還必要確保你的UNIX/Linux操作系統的安全。如果你的操作系統不安全,那麼只是確保apache的安全就沒有任何意義了。通常的我們要保持apache版本的更新,最新的apahce版本會修復所有已知的安全問題。還有就是要確保時常查看apache日誌文件。