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