1. 程式人生 > >Linux運維Nginx軟體優化之安全優化

Linux運維Nginx軟體優化之安全優化

一、Nginx優化分類

安全優化(提升網站安全性配置)

效能優化(提升使用者訪問網站效率)

二、Nginx安全優化

2.1 隱藏nginx版本資訊優化

官方引數:

1

2

3

Syntax:  server_tokens on | off | build | string;

Default: server_tokens on;

Context: http, server, location

配置舉例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

[[email protected] ~]# cat /application/nginx/conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    

include       mime.types;

    default_type  application/octet-stream;

    sendfile        off;

    keepalive_timeout  65;

    

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {

        listen       80;

        server_name  www.oldboyedu.com;

        server_tokens off;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

        access_log  logs/access_www.log  main;

    }

}

測試結果:

1

2

3

4

5

6

7

8

9

10

[[email protected] ~]# curl -I 10.0.0.8

HTTP/1.1 200 OK

Server: nginx

Date: Wed, 01 Nov 2017 18:32:40 GMT

Content-Type: text/html

Content-Length: 10

Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT

Connection: keep-alive

ETag: "59efe6f8-a"

Accept-Ranges: bytes

2.2 修改nginx版本資訊

修改版本資訊需要修改程式原始檔資訊

修改核心資訊

1

2

3

4

5

6

[[email protected] nginx-1.10.2]# vim  src/core/nginx.h

# ···

 13 #define NGINX_VERSION      "1.0"

 14 #define NGINX_VER          "oldboy/" NGINX_VERSION

 22 #define NGINX_VAR          "oldboy"

# ···

修改頭部資訊

1

2

3

4

[[email protected] nginx-1.10.2]# vim  src/http/ngx_http_header_filter_module.c 

# ···

 49 static char ngx_http_server_string[] = "Server: oldboy" CRLF;

# ···

修改錯誤頁顯示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

[[email protected] nginx-1.10.2]# vim src/http/ngx_http_special_response.c 

# ···

# 此處可以不修改

 21 static u_char ngx_http_error_full_tail[] =

 22 "<hr><center>" NGINX_VER "</center>" CRLF

 23 "</body>" CRLF

 24 "</html>" CRLF

 25 ;

# ···

 28 static u_char ngx_http_error_tail[] =

 29 "<hr><center>oldboy</center>" CRLF

 30 "</body>" CRLF

 31 "</html>" CRLF

 32 ;

# ···

修改完成後重新編譯

1

[[email protected] nginx-1.10.2]# ./configure  --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

重啟服務

1

[[email protected] nginx-1.10.2]# /etc/init.d/nginx restart

訪問測試是否修改成功

1

2

3

4

5

6

7

8

9

10

[[email protected] ~]# curl -I 127.0.0.1 

HTTP/1.1 200 OK

Server: oldboy

Date: Wed, 01 Nov 2017 19:05:43 GMT

Content-Type: text/html

Content-Length: 10

Last-Modified: Wed, 25 Oct 2017 01:20:56 GMT

Connection: keep-alive

ETag: "59efe6f8-a"

Accept-Ranges: bytes

2.3 修改worker程序的使用者

第一種方法:利用編譯安裝配置引數,設定nginx預設worker程序使用者

1

2

useradd -s /sbin/nologin -M www

./configure --user=www --group=www

第二種方式:編寫nginx服務配置檔案,設定nginx預設worker程序使用者

1

2

3

Syntax:user user [group];

Default: user nobody nobody;

Context: main

配置舉例:

1

2

3

4

5

6

[[email protected] conf]# cat nginx.conf

user  www www;          # 主區塊新增user引數

worker_processes  1;

events {

    worker_connections  1024;

}

檢視是否生效

1

2

3

4

[[email protected] nginx-1.10.2]# ps -ef|grep nginx

root      16987      1  0 15:14 ?        00:00:00 nginx: master process nginx

oldboy    18484  16987  0 15:22 ?        00:00:00 nginx: worker process

root      18486   9593  0 15:22 pts/0    00:00:00 grep --color=auto nginx

2.4 上傳檔案大小的限制(動態應用)

預設語法說明:

1

2

3

syntax:client_max_body_size size;    #<==引數語法

default:client_max_body_size 1m;    #<==預設值是1m

context:http,server,location        #<==可以放置的標籤段

舉例配置:

1

2

3

4

5

http {

 sendfile        on;

 keepalive_timeout  65;

 client_max_body_size 8m;    # 設定上傳檔案最大值8M

}

2.5 站點 Nginx站點目錄及檔案URL訪問控制

01. 根據目錄或副檔名,禁止使用者訪問指定資料資訊

1

2

3

4

5

6

7

8

9

10

11

12

location ~ ^/images/.*\.(php|php5|sh|pl|py|html)$ 

    

        deny all;

    

location ~ ^/static/.*\.(php|php5|sh|pl|py)$ 

    

        deny all;

    

location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 

    

        deny all;

    }

02. 當訪問禁止的資料資訊時,進行頁面跳轉

Nginx下配置禁止訪問*.txt和*.doc檔案。

實際配置資訊如下:

1

2

3

4

5

6

7

8

9

10

11

location ~* \.(txt|doc)$ {

    if (-f $request_filename){

    root /data/www/www;

    #rewrite …..可以重定向到某個URL

    break;

    }

}

location ~* \.(txt|doc)${

    root /data/www/www;

    denyall;

}

03. 根據IP地址或網路進行訪問策略控制

1

2

3

4

5

6

location / { 

    deny 192.168.1.1;

    allow 192.168.1.0/24;

    allow 10.1.1.0/16;

    deny all;

}

04. 採用if判斷方式,進行訪問控制

1

2

3

if ($remote_addr = 10.0.0.7 ){

        return 403;

 }

2.6 配置Nginx,禁止非法域名解析訪問企業網站

第一種方式:配置一個server虛擬主機區塊,放置在所有server區塊最前面

1

2

3

4

5

server {

   listen 80;

   server_name - ;

   return 501;

}

第二種方式:將計就計,通過你的域名訪問時候,自動跳轉到我的域名上

1

2

3

4

5

6

7

8

9

server {

   listen 80 default_server;

   server_name _;

   rewrite ^(.*) http://www.oldboyedu.com/$1 permanent;

}

if ($host !~ ^www\.oldboyedu\.com$)

{

    rewrite ^(.*) http://www.oldboyedu.com/$1 permanent;

}

2.7 Nginx圖片及目錄防盜鏈解決方案

什麼是資源盜鏈 ?

簡單地說,就是某些不法網站未經許可,通過在其自身網站程式裡非法呼叫其他網站的資源,然後在自己的網站上顯示這些呼叫的資源,達到填充自身網站的效果。

實現盜鏈過程:

01. 真正的合法網站(盜鏈的目標) web01 www.oldboyedu.com www站點目錄有一個oldboy.jpg圖片

1

2

3

4

5

6

7

8

9

# 配置靜態虛擬主機

   server {

     listen       80;

     server_name  www.oldboyedu.com;

     location / {

         root   html/www;

         index  index.html index.htm;

     }

   # 確認生成盜鏈檔案

02. 不合法的網站(真正盜鏈網站) www.daolian.com

1

2

3

4

5

6

7

8

9

10

11

12

13

14

   # 編寫一個html盜鏈檔案

    <html>

    <head>

       <title>老男孩IT教育</title>

    </head>

    <body bgcolor=green>

       老男孩IT教育的部落格!

    <br>我的部落格是

    <a

     href="http://www.oldboyedu.com" target="_blank">部落格地址

    </a>

    <img src="http://www.oldboyedu.com/oldboy.jpg">

    </body>

    </html>

編寫盜鏈虛擬主機

1

2

3

4

5

6

7

8

    server {

            listen       80;

            server_name  www.daolian.org;

            location / {

                root   html;

                index  index.html index.htm;

            }   

        }

至此就實現了盜鏈。

03 常見防盜鏈解決方案的基本原理

1) 根據HTTP referer實現防盜鏈

利用referer,並且針對副檔名rewrite重定向,下面的程式碼為利用referer且針對副檔名rewrite重定向,即實現防盜鏈的Nginx配置。

1

2

3

4

5

6

7

    location ~* /\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

        root  html/www;

        valid_referers none blocked *.oldboyedu.com oldboyedu.com;

    if ($invalid_referer){ 

        rewrite ^/  http://www.oldboyedu.com/img/nolink.jpg;

      

    }

設定expires的方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

    [[email protected] www]# cat /application/nginx/conf/extra/www.conf 

        server {

            listen            80;

            server_name        www.oldboyedu.com;

                root        html/www;

                index        index.html index.htm;

                access_log    logs/www_access.log main;

    #Preventing hot linking of images and other file types

    location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {

        valid_referers none blocked server_names *.oldboyedu.com oldboyedu.com;

        if ($invalid_referer){

            rewrite ^/ http://www.oldboyedu.com/img/nolink.jpg;

        }

        access_log off;

        root html/www;

        expires 1d;

        break;

       }

    }

2) 根據cookie防盜鏈

3) 通過加密變換訪問路徑實現防盜鏈

4) 在所有網站資源上新增網站資訊,讓盜鏈人員幫你做推廣宣傳

2.8 NGINX錯誤頁面友好顯示

範例1:對錯誤程式碼403實行本地頁面跳轉,命令如下:

1

2

3

4

5

6

7

8

9

10

###www

    server {

        listen       80;

        server_name  www.oldboyedu.com;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

        error_page  403  /403.html;    #<==當出現403錯誤時,會跳轉到403.html頁面

    }

# 上面的/403.html是相對於站點根目錄html/www的。

範例2:50x頁面放到本地單獨目錄下,進行優雅顯示。

1

2

3

4

5

# redirect server error pages to the static page /50x.html

error_page   500 502 503 504  /50x.html;

location = /50x.html {

    root   /data0/www/html;

}

範例3:改變狀態碼為新的狀態碼,並顯示指定的檔案內容,命令如下:

1

2

3

4

5

6

7

8

9

10

11

12

error_page 404 =200 /empty.gif;

    server {

        listen       80;

        server_name www.oldboyedu.com;

        location / {

            root   /data0/www/bbs;

            index  index.html index.htm;

            fastcgi_intercept_errors on;

            error_page  404 =200    /ta.jpg;

            access_log  /app/logs/bbs_access.log  commonlog;

        }

}

範例4:錯誤狀態碼URL重定向,命令如下:

1

2

3

4

5

6

7

8

9

10

11

server {

        listen       80;

        server_name www.oldboyedu.com;

        location / {

            root   html/www;

            index  index.html index.htm;

        error_page   404  https://oldboy.cnblogs.com;

#<==當出現404錯誤時,會跳轉到指定的URL https://oldboy.cnblogs.com頁面顯示給使用者,這個URL一般是企業另外的可用地址

            access_log  /app/logs/bbs_access.log  commonlog;

        }

}

2.9 Nginx站點目錄檔案及目錄許可權優化

2.10 Nginx防爬蟲優化

範例1:阻止下載協議代理,命令如下:

1

2

3

4

5

## Block download agents ##

if ($http_user_agent ~* LWP::Simple|BBBike|wget)

 {

    return 403;

}

範例2:新增內容防止N多爬蟲代理訪問網站,命令如下:

這些爬蟲代理使用“|”分隔,具體要處理的爬蟲可以根據需求增加或減少,新增的內容如下:

1

2

3

4

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot"

 {

return 403;

}

2.11 利用Nginx限制HTTP的請求方法

#Only allow these request methods

1

2

3

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

    return 501;

}

#Do not accept DELETE,SEARCH and other methods

2.12 使用普通使用者啟動nginx

1、切換到普通使用者家目錄下,建立nginx所需檔案

1

2

3

4

5

[[email protected] ~]$ mkdir -p blog/{conf,logs,html}

[[email protected] ~]$ cd blog/ 

[[email protected] blog]$ cp /application/nginx/conf/nginx.conf.default  ./conf/

[[email protected] blog]$ grep -vE "^$|#" conf/nginx.conf.default  >  conf/nginx.conf

[[email protected] blog]$ cp /application/nginx/conf/mime.types conf/

2、編寫配置檔案

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

[[email protected] ~]$ cat blog/conf/nginx.conf

worker_processes  4;

worker_cpu_affinity 0001 0010 0100 1000;

worker_rlimit_nofile 65535;

error_log  /home/nginx/blog/logs/error.log;

user inca inca;

pid       /home/nginx/blog/logs/nginx.pid;

events {

    use epoll;

    worker_connections  1024;

}

http {

    include      mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {

        listen       8080;

        server_name  www.etiantian.org;

        root   /home/nginx/blog/html;

        location / {

            index  index.html index.htm;

                }

        access_log  /home/nginx/blog/logs/web_blog_access.log  main;

            }

}

注意:普通使用者不能使用知名埠,需要使用其他埠啟動服務

3、檢查配置檔案語法,並啟動nginx服務

1

2

3

/application/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf

/application/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

注意:忽略一些不正確的輸出資訊