Nginx安全防護與HTTPS部署實戰(zhàn)
前言
在互聯(lián)網(wǎng)高速發(fā)展的今天,Web 服務安全已成為企業(yè)與開發(fā)者必須重視的核心問題。Nginx 憑借輕量、高并發(fā)、模塊化設計,占據(jù)全球近三分之一 Web 服務器市場。但 DDoS、CC 攻擊、惡意爬蟲、SQL 注入等威脅層出不窮,加之 GDPR、等保 2.0 等法規(guī)要求,掌握 Nginx 安全加固與 HTTPS 部署,已是運維與開發(fā)人員的必備技能。
一、Nginx 核心安全配置(生產(chǎn)必配)
1. 編譯安裝 Nginx(安全基礎)
生產(chǎn)環(huán)境不推薦 yum 直接安裝,編譯安裝可按需開啟模塊、關閉危險功能,安全性更高。
(1)安裝依賴包
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker git wget tar
(2)創(chuàng)建專用運行用戶(最小權(quán)限原則)
禁止 nginx 使用 root 運行,降低入侵后風險:
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)服務
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
新建 systemd 服務文件:
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
啟動并設置開機自啟:
systemctl daemon-reload systemctl start nginx systemctl enable nginx
2. 隱藏 Nginx 版本號(防版本定向攻擊)
攻擊者可通過版本號查找對應 CVE 漏洞,生產(chǎn)環(huán)境必須隱藏。
查看版本號
curl -I 192.168.10.101 # 返回:Server: nginx/1.26.3
關閉版本顯示
vi /usr/local/nginx/conf/nginx.conf
在http塊中添加:
http {
server_tokens off;
}
重載配置:
nginx -t && nginx -s reload
再次驗證:
curl -I 192.168.10.101 # 返回:Server: nginx(無版本號)
3. 限制危險 HTTP 請求方法
HTTP 中PUT/DELETE/CONNECT/TRACE等方法存在高危風險:
- PUT/DELETE:可上傳 / 刪除文件
- TRACE:易導致 XST 攻擊
- CONNECT:可被用于代理濫用
只放行GET/HEAD/POST,其他直接返回 444 斷開連接。
配置:
server {
...
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
}測試:
curl -XPUT -I 192.168.10.101 # 返回 Empty reply from server
注意:TRACE/CONNECT 會被 Nginx 核心層直接攔截,返回 405/400,不會進入 if 判斷。
4. 請求限制(CC 攻擊防御核心)
CC 攻擊通過海量請求耗盡服務器資源,Nginx 自帶limit_req模塊可精準限速。
配置請求速率限制
http {
# 定義限流區(qū)域:10M內(nèi)存,按IP限速,10請求/秒
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
root html;
index index.html;
# 突發(fā)隊列20,不延遲直接處理
limit_req zone=req_limit burst=20 nodelay;
}
}
}關鍵參數(shù)說明
limit_req_zone:定義共享內(nèi)存,存儲 IP 訪問狀態(tài)$binary_remote_addr:以客戶端 IP 為維度限流rate=10r/s:每秒最多 10 個請求burst=20:緩沖隊列,超出速率的請求排隊nodelay:隊列請求立即處理,否則會延遲返回
壓力測試驗證
安裝 ab 工具:
dnf install httpd-tools -y
發(fā)起 300 請求,30 并發(fā):
ab -n 300 -c 30 http://192.168.10.101/
查看日志:
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
大量請求返回 503,限流生效。
5. 防盜鏈配置(保護靜態(tài)資源)
盜鏈會消耗服務器帶寬、侵犯版權(quán),Nginx 可通過referer機制攔截。
實驗環(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,防護生效。
二、Nginx 高級防護(進階安全)
1. 動態(tài)黑名單(實時封禁惡意 IP)
靜態(tài)allow/deny需要重啟服務,動態(tài)黑名單可熱加載,無需重啟。
(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)自動封禁高頻 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 自動加入黑名單,配合定時任務使用。
三、Nginx HTTPS 部署(全站加密)
1. HTTPS 核心原理
HTTPS = HTTP + SSL/TLS,解決 HTTP 三大風險:
- 竊 聽風險:明文傳輸可被截取
- 篡改風險:數(shù)據(jù)被中間人修改
- 冒充風險:訪問釣魚網(wǎng)站
HTTPS 采用混合加密:
- 握手階段:非對稱加密(公鑰 / 私鑰)交換會話密鑰
- 傳輸階段:對稱加密加密業(yè)務數(shù)據(jù),效率更高
數(shù)字證書解決公鑰信任問題,由 CA 機構(gòu)簽名,系統(tǒng)內(nèi)置根證書信任。
2. 生成自簽名證書(測試環(huán)境)
生產(chǎn)請使用 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強制跳轉(zhuǎn)HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}重載配置:
nginx -t && nginx -s reload
4. 驗證 HTTPS
訪問https://服務器IP,瀏覽器提示證書不安全(自簽名),測試環(huán)境可忽略。生產(chǎn)環(huán)境使用受信任證書后,瀏覽器顯示安全鎖,支持 HTTP/2,SEO 權(quán)重更高。
四、生產(chǎn)環(huán)境安全加固總結(jié)
- 最小權(quán)限:使用專用 nginx 用戶,禁止 root 運行
- 隱藏信息:關閉版本號、隱藏服務器信息
- 請求限流:limit_req 防 CC,limit_conn 防并發(fā)過量
- 方法限制:只放行 GET/HEAD/POST
- 防盜鏈:保護靜態(tài)資源,減少帶寬浪費
- 動態(tài)黑名單:實時封禁惡意 IP
- 全站 HTTPS:開啟 TLS1.2+,禁用不安全協(xié)議
- 定期更新:Nginx 保持最新版,修復 CVE 漏洞
五、結(jié)語
Nginx 安全防護不是一次性配置,而是持續(xù)優(yōu)化的過程。本文覆蓋的編譯加固、版本隱藏、請求限流、防盜鏈、動態(tài)黑名單、HTTPS 部署,可直接應用于中小企業(yè)生產(chǎn)環(huán)境,大幅提升 Web 服務安全性。
以上就是Nginx安全防護與HTTPS部署實戰(zhàn)的詳細內(nèi)容,更多關于Nginx安全防護與HTTPS部署的資料請關注腳本之家其它相關文章!
相關文章
Nginx中動態(tài)upstream域名解析失效問題解決的幾種方法
本文主要介紹了Nginx中實現(xiàn)動態(tài)解析upstream域名的方法,強調(diào)了使用resolver指令與變量觸發(fā)、作用域正確、配置兼容三要素的重要性,并提供了四種解決方案,下面就來詳細的介紹一下2026-04-04
Nginx實現(xiàn)UDP四層轉(zhuǎn)發(fā)的過程
為了解決VPN連接速度慢的問題,可以通過Nginx實現(xiàn)UDP的四層轉(zhuǎn)發(fā),首先檢查Nginx是否安裝了with-stream模塊,然后修改nginx.conf配置文件進行UDP端口的轉(zhuǎn)發(fā)設置,使用nginx-t檢查配置文件語法,無誤后重新加載Nginx,這樣通過國內(nèi)服務器中轉(zhuǎn),可以提升連接到國外服務器的速率2024-09-09
解決使用了nginx獲取IP地址都是127.0.0.1 的問題
這篇文章主要介紹了解決使用了nginx獲取IP地址都是127.0.0.1 的問題,獲取i工具的完整代碼文中給大家提到,具體實例代碼跟隨小編一起看看吧2021-09-09
安裝配置php-fpm來搭建Nginx+PHP的生產(chǎn)環(huán)境
這篇文章主要介紹了安裝配置php-fpm來搭建Nginx+PHP的生產(chǎn)環(huán)境的方法,php-fpm的作用是將FastCGI進程管理整合進PHP包,需要的朋友可以參考下2016-01-01
阿里云部署Ubuntu 1.4 Flask + WSGI + Nginx 詳解
本文解決的是 Flask 最后一公里的問題:Linux 部署,需要的朋友可以參考下2017-12-12

