Nginx 安全相關設定

Nginx 是很受歡迎的網頁伺服器,設定簡單、易用,正因為如此,很多人往往忽略了安全性的設定,建議檢查一下自己的Nginx伺服器,這些安全設定做了沒?

隱藏版本號

http {
    server_tokens off;
}

啟動HTTPS

server {
    listen 443;
    server_name ops-coffee.cn;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

設定白名單

location /admin/ {
    allow   192.168.1.0/24;
    deny    all;
}

設定黑名單

location /ops-coffee/ {
    deny   192.168.1.0/24;
    allow    all;
}

透過$http_x_forwarded_for進行限制

set $allow false;
if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; }
if ($http_x_forwarded_for ~ "108.2.66.[89]") { set $allow true; }
if ($allow = false) { return 404; }

增加帳號認證

server {
    location / {
        auth_basic "please input user&passwd";
        auth_basic_user_file key/auth.key;
    }
}

限制可接受的請求(如:GET、POST)

if ($request_method !~ ^(GET|POST)$ ) {
    return 405;
}

拒絕User-Agent

if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) {
    return 444;
}

Nginx 的404表示伺服器不回應任何狀態,client端將不會收到任何訊息,最造成像網站無法連線的狀況。

防止圖片盜連

location /images/ {
    valid_referers none blocked www.justdrink.com.tw justjii.justdrink.com.tw;
    if ($invalid_referer) {
        return  403;
    }
}

// 導倒特定圖片
location /images/ {
    valid_referers none blocked www.justdrink.com.tw justjii.justdrink.com.tw;
    if ($invalid_referer) {
        rewrite ^/images/.*\.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
    }
}

限制一個IP的同時連線數

http {
    limit_conn_zone $binary_remote_addr zone=ops:10m;

    server {
        listen       80;
        server_name  justdrink.com.tw;

        root /home/project/webapp;
        index index.html;

        location / {
            limit_conn ops 10;  // 只允許10個
        }

        access_log  /tmp/nginx_access.log  main;
    }
}

限制緩衝區大小

client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

// 連線時間限制
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

Header 設置

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
// 只允許來自相同網域
add_header Content-Security-Policy "default-src 'self'";