不同版本的Nginx都可能存在這樣或者那樣的漏洞,一旦被黑客發現并加以利用,無疑會對其安全造成一定的威脅。因此,將Nginx名稱以及版本信息盡可能的隱藏起來,讓黑客在掃描探測時無法顯示這些敏感信息,就可以很好的將Nginx服務器保護起來。
例如,在默認情況下,黑客會執行諸如“curl -I xxx..xxx.xxx.xxx”之類的命令,對目標服務器進行探測,在返回信息中如果顯示“Server:nginx/1.x.x” 內容,就說明該服務器使用的1.x.x版本的Nginx,這里的“xxx..xxx.xxx.xxx”為目標Web服務器地址,“x.x”為具體的版本號。
實際上,在Windows中如果故意訪問不存在的目標頁面,也會暴漏Nginx的名稱和版本信息。為此,可以進入Nginx安裝路徑中的“conf”目 錄,執 行“vi nginx.conf”命令,在其配置文件中的“http { }”段中添 加“server_tokens off”行,關閉Nginx名稱以及版本號信息顯示功能。
這樣,當黑客對其進行探測時,在HTTP回應信息的頭部就會顯示Nginx版本信息了。
當然,僅僅隱藏了版本號是不夠的,最好將Nginx名稱也隱藏起來。處理方法是修改Nginx的源代碼。也就是先對“nginx-1.x.x/src/core/nginx.h”進行修改,將“define NGINX_VERSION”行后面的版本號修改為其他值,將“define NGINX_VER”行后面的“"nginx/" NGINX_VERSION”修改為其他具有迷惑性的名稱,例如“IIS 6.0”等。將“define NGINX_VAR”行后面的“"NGINX"”也修改為別的名稱,例如“IIS 6.0 Update”等。
之 后 再 對“nginx-1.x.x/src/http/ngx_http_header_filter_module.c”的文件進行修改,可以將其中的“static char ngx_http_server_string[]="Server:nginx"”行中的“nginx”修改為其他的名稱,例如“IIS6.0”等。
最 后 對“nginx-1.x.x/src/http/ngx_http_special_response.c” 文件進行修改,將其中的“
方法是依次執行“cd nginx-1.x.x”、“./configure --user=nginx--g r o u p=n g i n x--prefix=/software/nginx-1.x.x/ --withhttp_stub_module --withhttp_ssl_module”、“make”、“make install”、“ln -s /software/nginx-1.x.x /application/nginx” 等 命令來實現,編譯完成后,執行“/ software/nginx/sbin/nginx”命令,重啟Nginx服務。
這樣,就可以將與Nginx相關的所有敏感信息全部進行隱藏,當黑客對目標服務器進行探測時,只能得到讓其迷惑的信息,這樣就可以有效保護Nginx服務器的安全。
在很多情況下是使用nobody用戶啟動Nginx的。為了防止黑客對其進行惡意利用,最好將其設置為其他的用戶。例如,執行“useradd nguser -s /sbin/nologin -M”命令,創建名為“nguser”的用戶,禁止其擁有登錄權限。打開Nginx配置文件,將“#user nobody”修 改 為“user nguser nguser”。也可以在編譯時使用該用戶,例如在上述編譯語句中將“--user=nginx--group=nginx” 修 改為“--u s e r=n g u s e r--group=nguser”。
執 行“/application/nginx/sbin/nginx -s reload”命令,重現加載配置文件。執行“ps -ef|grep nginx|grep -v grep”命令,可以看到和Nginx進程對應的賬戶名。
注意,對于Nginx主進程來說,使用的依然是Root賬戶,這對系統安全帶來了一定的隱患,如果黑客利用各種漏洞侵入了網站,很容易獲得管理權限。因此,最好將Nginx的主進程以普通賬戶身份運行。
例 如 執 行“useradd nguser1”、“su -nguser1”命令,創建名為“nguser1”的賬戶,之后在其Home目錄中創建“conf”等目錄,將Nginx安裝路徑中的配置文件等內容復制進來。在該用戶的Home下打開Nginx的配置文件,對其內容進行修改,凡是路徑均以“/home/nguser1”開頭,即將原始的路徑信息全部指向“nguser1”的Home目錄,將監聽端口修改為其他值,例如“listen 8000” 等。 將“#user nobody” 修 改 為“user nguser1 nguser1”,之后執行“/application/nginx/sbin/nginx -c /home/nguser1/conf/nginx.conf &>/dev/null & ”命令,來啟動Nginx。執行“lsof-i :8000 ”命令,會發現Nginx進程均以“nguser1”賬戶身份啟動。
當用戶訪問Web網站時,Nginx就會記錄相關的日志信息。不過Nginx的日志并沒有自動分段存儲功能,導致眾多的日志堆積在一起,對于日志的管理和分析不利。為此可以先創建一個名為“srvautolog”的目錄,在其中創建名為“zlnginxlog.sh”的腳本文件,在該文件中輸入“cd /software /nginx/logs&& /bin/mv www_access.log www_access_$(date+%F -d -1day).log”,“/application/nginx/sbin/nginx -s reload”行。 執行“crontab -e”命令,在定時任務中添加“00 00 * ** /bin/sh / srvautolog/zlnginxlog.sh >/dev/null”行。這樣,就可以每天定時對Nginx的日志文件進行單獨保存。
當然,日志也不是事無巨細全部記錄,對于無關的文件(如圖片等)信息其實是不需要記錄的,這樣可以避免不必要的磁盤I/O消耗,提高Nginx服務器的效能。
例如,在Nginx配置文件中寫入“location ~ .*.(js|jpg|bmp|gif|css|swf)${access_log off;}”之類的內容,就可以將指定的文件排出在記錄范圍外。正是日志對于Nginx極為重要,所以才不允許別人對其隨意訪問。例如執行“chown -R root.root /nginx/logs”和“chmod -R /nginx/logs”命令,這樣直郵Root賬戶才可以讀寫Nginx日志的權限,這里假設“/nginx/logs”文件日志文件目錄。
對于黑客來說,很常用的入侵手段就是利用網站的上傳漏洞,來上傳ASP、PHP等木馬程序,進而獲取WebShell接口,再通過各種非法提權手段獲得服務器控制權。
因此,禁止訪問者非法上傳各種文件,可以有效保護Nginx的安全。例如在Nginx配置文件中添加“location ~ ^/dirname/.*(php|php5|sh|pl|py|asp)${deny all;}”和“location~ .*.(php|php5)?${f a s t c g i_p a s s 127.0.0.1:9000;fastcgi_index index.php;include fcgi.conf;}” 等 語 句,就可以解析網站目錄中“dirname”下指定的文件類型,當然也可以針對更多的目錄,分別使用上述第一行的格式來對其進行訪問限制。
這樣即使黑客向這些目錄上傳了不法文件,也無法進行訪問和解析。注意,這里雖然針對特定的文件進行了限制,但是百密必有一疏,不可能將所有的文件類型都添加進來。為此可以采取限制使用HTTP請求的Get方法,禁止非法的上傳操作,為此可以在配置文件中添加“if ($request_method ~*^(GET)$) {return 501}”行,來實現該功能。對于網站中指定類型的文件,有時也需要禁止訪問者隨意操作。例如可以在配置文件中添加“location ~* .(xls|ppt)${ if (-f $request_filename) {root /data/ziliao/wd;rewrite http://w w w.x x x.c o m/e r r o r.php;break}}”和“location~* .( xls|ppt)${root /data/ziliao/wd;deny all;}”行。
這樣,當來訪者試圖訪問指定目錄下的“xls”和“ppt”格式的文件時,都會被導入到顯示錯誤信息的頁面,讓其無法訪問成功。
對于重要的網站目錄,是禁止來訪者隨意訪問的。為此可以在配置文件中 添 加“location ~ ^/(admin|datas) {deny all;}”行,可以禁止訪問“admin”和“datas”目錄,當然可以添加更多的目錄。如果僅僅是限制針對單個目錄的訪問,則輸入單個目錄名稱即可。
或者可以在配置文件針對特定的虛擬服務器,來單獨的指定禁止訪問的目錄。例如在“Server”段中的特定的“server_name”標簽開始的行中寫入“location /adminedit/ {return 404};”行,這樣當試圖訪問該虛擬主機下的“adminedit”目錄時,就會返回HTTP 404錯誤信息。對于來歷不明的IP,可以禁止其訪問Web網站。
例如在配置文件中寫入“location / {deny xxx.xxx.100.150;allow xxx.xxx.1.0/24;allow xxx.xxx.xxx.0/16;deny all;}”行,則只允許“xxx.xxx.1.0/24”和“xxx.xxx.xxx.0/16”網段進行訪問,其余的IP是禁止訪問的。當Nginx作為反向代理使用時,也可以對客戶端的IP進行限制。例如在配置文件中添加“location/ {root html/blog;index index.php index.html index.htm;allow xxx.xxx.xxx.0/16;deny all;}”行,則只允許指定的IP地址段進行訪問,其余的則禁止。如果將其改為“location/ {root html/blog;index index.php index.html index.htm;deny xxx.xxx.xxx.0/16;allow all;}”行,那么情況則恰好相反,只禁止指定的IP段訪問,其余的則可以訪問。當然可以根據實際需要添加更多的允許/禁用地址段。
對于一些可疑用戶來說,為了防止其惡意解析域名,最好禁止其訪問Web服務器。為此可以在Nginx配置文件的“Server”段中的特定的“server_name”標簽開始的行中添加“if ($host !~^www/ .xxx/.com) {rewrite^(.*) http://www.yyy.com$1 permanent};”行,這樣當用戶或搜索引擎向網站服務器發出瀏覽請求時,服務器返回的HTTP數據流中頭信息header中的狀態碼的Host欄中包含不是“www.xxx.com”時,將其永久性轉移到“www.yyy.com”地址上。也可以在“Server”段中的特定的“server_name”標簽處添加“ listen 80 default_s e r v e r;s e r v e r_n a m e_;rewrite ^(.*) http://xxx.com/$1 permanent;”行,讓惡意解析域名的用戶得到HTTP 501錯誤信息。
對于Web服務器來說,常用的HTTP請求方法包括 Get、Post和 Head,對 于其他的特殊的請求方式,最好將其禁用,這樣可以有效的提高服務器的安全性。例如在配置文件中添加“f ($request_method!~ ^(GET|HEAD|POST)$){return 501}”行實現。