快來檢查一下你的NGINX配置安全嗎

在當(dāng)今數(shù)字化時(shí)代,Web服務(wù)器的安全性至關(guān)重要。NGINX,作為一種強(qiáng)大而靈活的Web服務(wù)器和反向代理,需要經(jīng)過仔細(xì)的安全配置,以確保系統(tǒng)的健壯性。本文將介紹一系列NGINX安全配置的最佳實(shí)踐,幫助你保障服務(wù)器免受潛在的威脅。

nginx基本安全配置

Nginx默認(rèn)是不允許列出整個(gè)目錄的,不過,我們?yōu)榱税踩?,最好還是確認(rèn)這個(gè)真的關(guān)閉了,不然代碼被拉走了就悲劇了。

http {
    autoindex off;
}

nginx默認(rèn)是會(huì)在返回的數(shù)據(jù)包中顯示版本號(hào),還是隱藏好一點(diǎn)。

http {
    server_tokens off;
}

其他限制訪問請(qǐng)求參數(shù)

http {
    #設(shè)置客戶端請(qǐng)求頭讀取超時(shí)時(shí)間,超過這個(gè)時(shí)間還沒有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤
    client_header_timeout 15;
    #設(shè)置客戶端請(qǐng)求主體讀取超時(shí)時(shí)間,超過這個(gè)時(shí)間還沒有發(fā)送任何數(shù)據(jù),Nginx將返回“Request time out(408)”錯(cuò)誤
    client_body_timeout 15;   
    #上傳文件大小限制
    client_max_body_size 100m;
    #指定響應(yīng)客戶端的超時(shí)時(shí)間。這個(gè)超過僅限于兩個(gè)連接活動(dòng)之間的時(shí)間,如果超過這個(gè)時(shí)間,客戶端沒有任何活動(dòng),Nginx將會(huì)關(guān)閉連接。
    send_timeout    600;
    #設(shè)置客戶端連接保持會(huì)話的超時(shí)時(shí)間,超過這個(gè)時(shí)間,服務(wù)器會(huì)關(guān)閉該連接。
    keepalive_timeout 60;
}

nginx是可以做ip訪問限制的,但是不建議這么做。

#設(shè)置網(wǎng)站根目錄的訪問權(quán)限
location / 
    allow 192.168.1.1/24;
    deny 192.168.3.1/24;
    deny all;
}

限制訪問個(gè)別目錄或文件后綴名。

#在訪問uploads、images目錄時(shí),訪問php|php5|jsp后綴的文件會(huì)返回403代碼,也就是不給執(zhí)行代碼了。
location ~ ^/(uploads|images)/.*\.(php|php5|jsp)$ {
    return  403;
}
#禁止訪問所有目錄下的sql|log|txt|jar|war|sh|py后綴的文件,這些是什么文件就不詳細(xì)說了。
location ~.*\.(sql|log|txt|jar|war|sh|py) {
    deny all;
}
#有時(shí)候,有些訪問記錄不想保存到日志里面,例如靜態(tài)圖片
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ {
    access_log off;
}

Nginx 限制IP的訪問頻率

要先在http層定義,然后在 location, server, http上下文中作限制,他們用的是限制單ip訪問的漏桶算法,超過定義的限制會(huì)報(bào)503錯(cuò)誤,當(dāng)然,有些時(shí)候可能是某個(gè)公司同一個(gè)ip有幾十人一起訪問網(wǎng)站,這是有可能被誤傷的,做好503報(bào)錯(cuò)回調(diào)是很有必要的。

http {
    limit_req_zone $binary_remote_addr zone=iplimit:10m rate=20r/s;
    # zone=iplimit:10m 表示生成一個(gè)大小為10M的名字為iplimit的內(nèi)存區(qū)域來存儲(chǔ)訪問頻次信息,1M大約可以存16000個(gè)ip會(huì)話,看你訪問量有多少就設(shè)多少
    # rate=20r/s 表示允許相同標(biāo)識(shí)的客戶端訪問頻次 每秒20次,依據(jù)你的訪問量來設(shè)置
    server{
        location ~ ^/api {
            proxy_pass http:#127.0.0.1:8000;
            
            # 對(duì)訪問以/api的請(qǐng)求,限制每個(gè)ip每秒不超過20個(gè)請(qǐng)求,漏桶數(shù)burst為5,brust的意思就是,如果第1,2,3,4秒請(qǐng)求為19個(gè),第5秒的請(qǐng)求為25個(gè)是被允許的。但是如果你第1秒就25個(gè)請(qǐng)求,第2秒超過20的請(qǐng)求返回503錯(cuò)誤。nodelay,如果不設(shè)置該選項(xiàng),第1秒25個(gè)請(qǐng)求時(shí),5個(gè)請(qǐng)求放到第2秒執(zhí)行,設(shè)置nodelay,25個(gè)請(qǐng)求將在第1秒執(zhí)行。
            limit_req zone=ipmlimit burst=5 nodelay;
            limit_req_status 503;
            
            # burst 緩沖區(qū)大小 
            # nodelay 超過訪問頻次而且緩沖區(qū)也滿的時(shí)候返回503
            # limit_req_status指定自定義錯(cuò)誤碼, 默認(rèn)503
        }
    }
    
    # 指定503錯(cuò)誤頁面:
    error_page   503   /errpage/503.html;
}

Nginx 限制IP的并發(fā)

通過 limit_conn_zone 模塊來達(dá)到限制用戶的連接數(shù)的目的,即限制同一用戶 IP 地址的并發(fā)連接數(shù)。

通過配置,設(shè)定/api 這個(gè)location,每個(gè)IP,同一時(shí)刻只存在一個(gè)連接。注意:并發(fā)的概念并不是說 每秒多少連接。

http {
    limit_conn_zone $binary_remote_addr zone=connlimit:10m;
    # zone=iplimit:10m 表示生成一個(gè)大小為10M的名字為iplimit的內(nèi)存區(qū)域來存儲(chǔ)訪問頻次信息,1M大約可以存16000個(gè)ip會(huì)話,看你訪問量有多少就設(shè)多少
    
    server{
        location ~ ^/api {
            proxy_pass http:#127.0.0.1:8000;
            # 配置的并發(fā)請(qǐng)求為 1, 依據(jù)你的實(shí)際情況來設(shè)置
            limit_conn connlimit 1;
            # limit_conn_status 指定自定義錯(cuò)誤碼, 默認(rèn)503
            limit_conn_status 503;
        }
    }
    
    # 指定503錯(cuò)誤頁面:
    error_page   503   /errpage/503.html;
}

Nginx 限制IP的流量

通過limit_rate模塊來進(jìn)行流量控制, 對(duì)于提供下載的網(wǎng)站,肯定是要進(jìn)行流量控制的。Nginx 通過 core模塊的 limit_rate 等指令可以做到限流的目的。

如果要進(jìn)行限速,可以和 limit_conn_zone 模塊配合進(jìn)行使用

http {
    server{
        location ~ ^/download{
            # 以最大的速度下載 size大小后,在進(jìn)行 limit_rate speed 限速,例如:limit_rate_after 3m 解釋為:以最大的速度下載3m后,再進(jìn)行限速。
            limit_rate_after 3m;
            
            # 向客戶端傳輸數(shù)據(jù)的速度,速度的單位是每秒傳輸?shù)淖止?jié)數(shù)。注意:該限制只是針對(duì)一個(gè)連接的設(shè)定,也就是說,如果同時(shí)有2個(gè)連接,那么它的速度將會(huì)是該指令設(shè)置的兩倍。
            limit_rate 512k;
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容