在當(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;
}
}
}