Nginx安全防護(hù)與HTTPS部署實(shí)戰(zhàn)
前言
在互聯(lián)網(wǎng)高速發(fā)展的今天,Web 服務(wù)安全已成為企業(yè)與開發(fā)者必須重視的核心問題。Nginx 憑借輕量、高并發(fā)、模塊化設(shè)計(jì),占據(jù)全球近三分之一 Web 服務(wù)器市場(chǎng)。但 DDoS、CC 攻擊、惡意爬蟲、SQL 注入等威脅層出不窮,加之 GDPR、等保 2.0 等法規(guī)要求,掌握 Nginx 安全加固與 HTTPS 部署,已是運(yùn)維與開發(fā)人員的必備技能。
一、Nginx 核心安全配置(生產(chǎn)必配)
1. 編譯安裝 Nginx(安全基礎(chǔ))
生產(chǎn)環(huán)境不推薦 yum 直接安裝,編譯安裝可按需開啟模塊、關(guān)閉危險(xiǎn)功能,安全性更高。
(1)安裝依賴包
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)創(chuàng)建專用運(yùn)行用戶(最小權(quán)限原則)
禁止 nginx 使用 root 運(yùn)行,降低入侵后風(fēng)險(xiǎn):
useradd -M -s /sbin/nologin nginx mkdir -p /var/log/nginx chown -R nginx:nginx /var/log/nginx
(3)編譯配置(開啟安全必備模塊)
tar zxf nginx-1.26.3.tar.gz cd nginx-1.26.3 ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --with-stream make && make install
(4)創(chuàng)建軟鏈接、配置系統(tǒng)服務(wù)
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
新建 systemd 服務(wù)文件:
vi /lib/systemd/system/nginx.service
寫入內(nèi)容:
[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target [Service] Type=forking ExecStartPre=/usr/local/sbin/nginx -t ExecStart=/usr/local/sbin/nginx ExecReload=/usr/local/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID TimeoutStopSec=5 KillMode=process PrivateTmp=true User=root Group=root [Install] WantedBy=multi-user.target
啟動(dòng)并設(shè)置開機(jī)自啟:
systemctl daemon-reload systemctl start nginx systemctl enable nginx
2. 隱藏 Nginx 版本號(hào)(防版本定向攻擊)
攻擊者可通過(guò)版本號(hào)查找對(duì)應(yīng) CVE 漏洞,生產(chǎn)環(huán)境必須隱藏。
查看版本號(hào)
curl -I 192.168.10.101 # 返回:Server: nginx/1.26.3
關(guān)閉版本顯示
vi /usr/local/nginx/conf/nginx.conf
在http塊中添加:
http {
server_tokens off;
}
重載配置:
nginx -t && nginx -s reload
再次驗(yàn)證:
curl -I 192.168.10.101 # 返回:Server: nginx(無(wú)版本號(hào))
3. 限制危險(xiǎn) HTTP 請(qǐng)求方法
HTTP 中PUT/DELETE/CONNECT/TRACE等方法存在高危風(fēng)險(xiǎn):
- PUT/DELETE:可上傳 / 刪除文件
- TRACE:易導(dǎo)致 XST 攻擊
- CONNECT:可被用于代理濫用
只放行GET/HEAD/POST,其他直接返回 444 斷開連接。
配置:
server {
...
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
}測(cè)試:
curl -XPUT -I 192.168.10.101 # 返回 Empty reply from server
注意:TRACE/CONNECT 會(huì)被 Nginx 核心層直接攔截,返回 405/400,不會(huì)進(jìn)入 if 判斷。
4. 請(qǐng)求限制(CC 攻擊防御核心)
CC 攻擊通過(guò)海量請(qǐng)求耗盡服務(wù)器資源,Nginx 自帶limit_req模塊可精準(zhǔn)限速。
配置請(qǐng)求速率限制
http {
# 定義限流區(qū)域:10M內(nèi)存,按IP限速,10請(qǐng)求/秒
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
root html;
index index.html;
# 突發(fā)隊(duì)列20,不延遲直接處理
limit_req zone=req_limit burst=20 nodelay;
}
}
}關(guān)鍵參數(shù)說(shuō)明
limit_req_zone:定義共享內(nèi)存,存儲(chǔ) IP 訪問狀態(tài)$binary_remote_addr:以客戶端 IP 為維度限流rate=10r/s:每秒最多 10 個(gè)請(qǐng)求burst=20:緩沖隊(duì)列,超出速率的請(qǐng)求排隊(duì)nodelay:隊(duì)列請(qǐng)求立即處理,否則會(huì)延遲返回
壓力測(cè)試驗(yàn)證
安裝 ab 工具:
dnf install httpd-tools -y
發(fā)起 300 請(qǐng)求,30 并發(fā):
ab -n 300 -c 30 http://192.168.10.101/
查看日志:
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
大量請(qǐng)求返回 503,限流生效。
5. 防盜鏈配置(保護(hù)靜態(tài)資源)
盜鏈會(huì)消耗服務(wù)器帶寬、侵犯版權(quán),Nginx 可通過(guò)referer機(jī)制攔截。
實(shí)驗(yàn)環(huán)境
- 源站:www.aaa.com 192.168.10.101
- 盜鏈站:www.bbb.com 192.168.10.102
配置防盜鏈
location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)$ {
root html;
# 信任域名
valid_referers aaa.com *.aaa.com;
# 非法referer返回403
if ($invalid_referer) {
return 403;
}
}配置后,盜鏈網(wǎng)站直接顯示圖片 403,防護(hù)生效。
二、Nginx 高級(jí)防護(hù)(進(jìn)階安全)
1. 動(dòng)態(tài)黑名單(實(shí)時(shí)封禁惡意 IP)
靜態(tài)allow/deny需要重啟服務(wù),動(dòng)態(tài)黑名單可熱加載,無(wú)需重啟。
(1)創(chuàng)建黑名單文件
vi /usr/local/nginx/conf/blockips.conf
寫入:
192.168.1.0/24 1; 192.168.10.102 1;
數(shù)字含義
- 0:允許
- 1:返回 403 封禁
- 2:返回 444 斷開
- 3:返回 503
(2)主配置加載
http {
geo $block_ip {
default 0;
include /usr/local/nginx/conf/blockips.conf;
}
server {
if ($block_ip) {
return 403;
}
}
}重載:
nginx -t && nginx -s reload
(3)自動(dòng)封禁高頻 IP 腳本
#!/bin/bash
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | awk '{if($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
訪問量超 100 的 IP 自動(dòng)加入黑名單,配合定時(shí)任務(wù)使用。
三、Nginx HTTPS 部署(全站加密)
1. HTTPS 核心原理
HTTPS = HTTP + SSL/TLS,解決 HTTP 三大風(fēng)險(xiǎn):
- 竊 聽風(fēng)險(xiǎn):明文傳輸可被截取
- 篡改風(fēng)險(xiǎn):數(shù)據(jù)被中間人修改
- 冒充風(fēng)險(xiǎn):訪問釣魚網(wǎng)站
HTTPS 采用混合加密:
- 握手階段:非對(duì)稱加密(公鑰 / 私鑰)交換會(huì)話密鑰
- 傳輸階段:對(duì)稱加密加密業(yè)務(wù)數(shù)據(jù),效率更高
數(shù)字證書解決公鑰信任問題,由 CA 機(jī)構(gòu)簽名,系統(tǒng)內(nèi)置根證書信任。
2. 生成自簽名證書(測(cè)試環(huán)境)
生產(chǎn)請(qǐng)使用 Let’s Encrypt、DigiCert 等正規(guī) CA 證書。
mkdir -p /etc/nginx/ssl openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx-selfsigned.key -out /etc/nginx/ssl/nginx-selfsigned.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
3. Nginx 配置 HTTPS
server {
listen 443 ssl;
server_name localhost;
# 證書路徑
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
# 安全協(xié)議與加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
location / {
root /usr/local/nginx/html;
index index.html;
}
}
# HTTP強(qiáng)制跳轉(zhuǎn)HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}重載配置:
nginx -t && nginx -s reload
4. 驗(yàn)證 HTTPS
訪問https://服務(wù)器IP,瀏覽器提示證書不安全(自簽名),測(cè)試環(huán)境可忽略。生產(chǎn)環(huán)境使用受信任證書后,瀏覽器顯示安全鎖,支持 HTTP/2,SEO 權(quán)重更高。
四、生產(chǎn)環(huán)境安全加固總結(jié)
- 最小權(quán)限:使用專用 nginx 用戶,禁止 root 運(yùn)行
- 隱藏信息:關(guān)閉版本號(hào)、隱藏服務(wù)器信息
- 請(qǐng)求限流:limit_req 防 CC,limit_conn 防并發(fā)過(guò)量
- 方法限制:只放行 GET/HEAD/POST
- 防盜鏈:保護(hù)靜態(tài)資源,減少帶寬浪費(fèi)
- 動(dòng)態(tài)黑名單:實(shí)時(shí)封禁惡意 IP
- 全站 HTTPS:開啟 TLS1.2+,禁用不安全協(xié)議
- 定期更新:Nginx 保持最新版,修復(fù) CVE 漏洞
五、結(jié)語(yǔ)
Nginx 安全防護(hù)不是一次性配置,而是持續(xù)優(yōu)化的過(guò)程。本文覆蓋的編譯加固、版本隱藏、請(qǐng)求限流、防盜鏈、動(dòng)態(tài)黑名單、HTTPS 部署,可直接應(yīng)用于中小企業(yè)生產(chǎn)環(huán)境,大幅提升 Web 服務(wù)安全性。
以上就是Nginx安全防護(hù)與HTTPS部署實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Nginx安全防護(hù)與HTTPS部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx實(shí)現(xiàn)靜態(tài)資源的反向代理實(shí)例
這篇文章主要介紹了Nginx實(shí)現(xiàn)靜態(tài)資源的反向代理實(shí)例,本文通過(guò)分析github發(fā)現(xiàn)這個(gè)應(yīng)用,可以避免在https的網(wǎng)站中出現(xiàn)http鏈接,需要的朋友可以參考下2015-03-03
Nginx中動(dòng)態(tài)upstream域名解析失效問題解決的幾種方法
本文主要介紹了Nginx中實(shí)現(xiàn)動(dòng)態(tài)解析upstream域名的方法,強(qiáng)調(diào)了使用resolver指令與變量觸發(fā)、作用域正確、配置兼容三要素的重要性,并提供了四種解決方案,下面就來(lái)詳細(xì)的介紹一下2026-04-04
Nginx實(shí)現(xiàn)UDP四層轉(zhuǎn)發(fā)的過(guò)程
為了解決VPN連接速度慢的問題,可以通過(guò)Nginx實(shí)現(xiàn)UDP的四層轉(zhuǎn)發(fā),首先檢查Nginx是否安裝了with-stream模塊,然后修改nginx.conf配置文件進(jìn)行UDP端口的轉(zhuǎn)發(fā)設(shè)置,使用nginx-t檢查配置文件語(yǔ)法,無(wú)誤后重新加載Nginx,這樣通過(guò)國(guó)內(nèi)服務(wù)器中轉(zhuǎn),可以提升連接到國(guó)外服務(wù)器的速率2024-09-09
解決使用了nginx獲取IP地址都是127.0.0.1 的問題
這篇文章主要介紹了解決使用了nginx獲取IP地址都是127.0.0.1 的問題,獲取i工具的完整代碼文中給大家提到,具體實(shí)例代碼跟隨小編一起看看吧2021-09-09
排查Openresty獲取不到Host請(qǐng)求頭解決過(guò)程詳解
這篇文章主要為大家介紹了排查Openresty獲取不到Host請(qǐng)求頭解決過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
安裝配置php-fpm來(lái)搭建Nginx+PHP的生產(chǎn)環(huán)境
這篇文章主要介紹了安裝配置php-fpm來(lái)搭建Nginx+PHP的生產(chǎn)環(huán)境的方法,php-fpm的作用是將FastCGI進(jìn)程管理整合進(jìn)PHP包,需要的朋友可以參考下2016-01-01
阿里云部署Ubuntu 1.4 Flask + WSGI + Nginx 詳解
本文解決的是 Flask 最后一公里的問題:Linux 部署,需要的朋友可以參考下2017-12-12

