Nginx服務安全之道

加固常見服務的安全

1.優化Nginx服務的安全配置

方法:

1.Nginx安全優化包括:刪除不要的模塊、修改版本信息、限制併發、拒絕非法請求、防止buffer溢出。

步驟一:優化Nginx服務的安全配置

1) 刪除不需要的模塊
Nignx是模塊化設計的軟件,需要什麼功能與模塊以及不需要哪些模塊,都可以在編譯安裝軟件時自定義,使用–with參數可以開啓某些模塊,使用–without可以禁用某些模塊。最小化安裝永遠都是對的方案!
下面是禁用某些模塊的案例:

[root@proxy ~]# tar -xf nginx-1.12.tar.gz
[root@proxy ~]# cd nginx-1.12
[root@proxy nginx-1.12]# ./configure \
>--without-http_autoindex_module \            //禁用自動索引文件目錄模塊
>--without-http_ssi_module
[root@proxy nginx-1.12]# make
[root@proxy nginx-1.12]# make install

2) 修改版本信息,並隱藏具體的版本號
默認Nginx會顯示版本信息以及具體的版本號,這些信息給攻擊者帶來了便利性,便於他們找到具體版本的漏洞。
如果需要屏蔽版本號信息,執行如下操作,可以隱藏版本號。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
http{
     server_tokens off;                            //在http下面手動添加這麼一行
     … …
}
[root@proxy ~]# nginx -s reload
[root@proxy ~]# curl -I http://192.168.4.5          //查看服務器響應的頭部信息

但服務器還是顯示了使用的軟件爲nginx,通過如下方法可以修改該信息。

[root@proxy nginx-1.12]# vim +48 src/http/ngx_http_header_filter_module.c
//注意:vim這條命令必須在nginx-1.12源碼包目錄下執行!!!!!!
//該文件修改前效果如下:
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
//下面是我們修改後的效果:
static u_char ngx_http_server_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_full_string[] = "Server: Jacob" CRLF;
static u_char ngx_http_server_build_string[] = "Server: Jacob" CRLF;
//修改完成後,再去編譯安裝Nignx,版本信息將不再顯示爲Nginx,而是Jacob
[root@proxy nginx-1.12]# ./configure
[root@proxy nginx-1.12]# make && make install
[root@proxy nginx-1.12]# killall nginx
[root@proxy nginx-1.12]# /usr/local/nginx/sbin/nginx            //啓動服務
[root@proxy nginx-1.12]# curl -I http://192.168.4.5            //查看版本信息驗證

3) 限制併發量
DDOS攻擊者會發送大量的併發連接,佔用服務器資源(包括連接數、帶寬等),這樣會導致正常用戶處於等待或無法訪問服務器的狀態。
Nginx提供了一個ngx_http_limit_req_module模塊,可以有效降低DDOS攻擊的風險,操作方法如下:

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
http{
… …
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        listen 80;
        server_name localhost;
        limit_req zone=one burst=5;
            }
}
//備註說明:
//limit_req_zone語法格式如下:
//limit_req_zone key zone=name:size rate=rate;
//上面案例中是將客戶端IP信息存儲名稱爲one的共享內存,內存空間爲10M
//1M可以存儲8千個IP信息,10M可以存儲8萬個主機連接的狀態,容量可以根據需要任意調整
//每秒中僅接受1個請求,多餘的放入漏斗
//漏斗超過5個則報錯
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

客戶端使用ab測試軟件測試效果:

[root@client ~]# ab -c 100 -n 100  http://192.168.4.5/

4) 拒絕非法的請求
網站使用的是HTTP協議,該協議中定義了很多方法,可以讓用戶連接服務器,獲得需要的資源。但實際應用中一般僅需要get和post。
具體HTTP請求方法的含義如表-1所示。

在這裏插入圖片描述
未修改服務器配置前,客戶端使用不同請求方法測試:

[root@client ~]# curl -i -X GET  http://192.168.4.5            //正常
[root@client ~]# curl -i -X HEAD http://192.168.4.5            //正常
//curl命令選項說明:
//-i選項:訪問服務器頁面時,顯示HTTP的頭部信息
//-X選項:指定請求服務器的方法

通過如下設置可以讓Nginx拒絕非法的請求方法:

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http{
       server {
                 listen 80;
#這裏,!符號表示對正則取反,~符號是正則匹配符號
#如果用戶使用非GET或POST方法訪問網站,則retrun返回444的錯誤信息
              if ($request_method !~ ^(GET|POST)$ ) {
                     return 444;
               }    
        }
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

修改服務器配置後,客戶端使用不同請求方法測試:

[root@client ~]# curl -i -X GET  http://192.168.4.5            //正常
[root@client ~]# curl -i -X HEAD http://192.168.4.5            //報錯

4) 防止buffer溢出
當客戶端連接服務器時,服務器會啓用各種緩存,用來存放連接的狀態信息。
如果攻擊者發送大量的連接請求,而服務器不對緩存做限制的話,內存數據就有可能溢出(空間不足)。
修改Nginx配置文件,調整各種buffer參數,可以有效降低溢出風險。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
http{
client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
 … …
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章