目錄
一、核心安全配置
1、隱藏版本號
2、限制危險請求方法
3、請求限制(CC攻擊防御)
(1)使用Nginx的limit_req模塊限制請求速率
(2)壓力測試驗證
4、防盜鏈
(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,設置域名和 IP 映射關系
(2)修改兩臺 OpenEuler 的 hosts 文件,設置域名和 IP 映射關系
(3)把圖片 kgc.png 放到源主機的工作目錄下
(4)編輯原網站首頁文件
(5)測試訪問源網站
(6)編輯島鏈網站首頁文件
(7)測試訪問盜鏈網站(盜鏈成功)
(8)配置Nginx防盜鏈
(9)測試訪問呢盜鏈網站(盜鏈失敗403)
二、高級防護
1、動態黑名單
(1)編輯黑名單配置文件
(2)編輯主配置文件
(3)使用封禁ip 測試訪問
(4)自動添加黑名單
2、nginx https 配置
(1)HTTP 風險
(2)安全通信的四大原則
(3)HTTPS 通信原理簡述
3、nignx 配置https 證書
(1)使用 openssl 生成證書和私鑰生成證書和私鑰
(2)nginx 啟用https
(3)驗證
一、核心安全配置
1、隱藏版本號
在生產環境中,需要隱藏 Nginx 的版本號,以避免泄漏 Nginx 的版本,使攻擊者不能針對特定版本進行攻擊。在隱藏版本號之前,可以使用 Fiddler 工具抓取數據包,查看 Nginx版本,也可以在 OpenEuler 中使用命令 curl -Ihttp://192.168.10.101/查看
修改配置文件
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.confserver_tokens off; #第20行添加,隱藏版本號
[root@bogon ~]# nginx -t #查看文件是否有錯誤
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@bogon ~]# systemctl restart nginx #重啟
再次查看會發現版本號被隱藏
2、限制危險請求方法
不安全的請求方式,是潛在的安全風險,TRACE(易引發XST攻擊)、PUT/DELETE(文件修改風險)、CONNECT(代理濫用),通過正則表達式匹配請求方法,非白名單方法返回 444(無響應關閉連接)
修改配置文件
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.confserver {……if ($request_method !~ ^(GET|HEAD|POST)$ ) {return 444;}……}
[root@bogon ~]# nginx -t
[root@bogon ~]# systemctl restart nginx
測試PUT/DELETE請求
[root@localhost ~]# curl -XPUT -I 192.168.10.101
curl: (52) Empty reply from server
[root@bogon ~]# cat /usr/local/nginx/logs/access.log
192.168.10.102 - - [06/May/2025:12:17:52 +0800] "PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"
3、請求限制(CC攻擊防御)
CC 攻擊(Challenge Collapsar 攻擊)是一種常見的網絡攻擊方式,通過大量合法或偽造的小流量請求來耗盡服務器資源,導致正常用戶無法訪問網站。?
CC攻擊,也稱為連接數攻擊或請求速率限制攻擊,通過模擬大量用戶訪問來消耗服務器資源,從而使得正常用戶無法正常訪問網站。為了防止此類攻擊,可以使用 Nginx 提供的模塊來限制請求速率和并發連接數
(1)使用Nginx的limit_req模塊限制請求速率
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.conf
http {limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;#34,定義限制區(10MB內存/每秒10請求)server {location / {root html;index index.html index.htm;limit_req zone=req_limit burst=20 nodelay;}}
}
關鍵參數說明:
limit_req_zone | 定義共享內存區 |
$binary_remote _addr | 是一個內置變量,用于表示客戶端 IP 地址的二進制格式 |
zone=req_limit:10m | 創建名為 req_limit 的共享內存區,大小 10M,用來存儲客戶端IP |
rate=10r/s | 限制并發數,每個 IP 每秒可以發起的請求次數 |
limit req | 實施速率限制 |
zone=req limit | 綁定到預定義的共享內存區 |
burst=20 | 類似與等候區,超出并發數的請求會到等候區,等候區占滿后,多余的請求會立刻返回 503 |
nodelay | 立即處理突發請求而不延遲,相當于立即處理等候區的請求,多余的請求會立刻返回 503 |
(2)壓力測試驗證
安裝 ab 測試工具
ApacheBench(簡稱 ab)是 Apache HTTP 服務器自帶的一個輕量級、易用的HTTP 服務器性能測試工具。它主要用于評估服務器在并發訪問下的性能表現,包括響應時間、吞吐量等關鍵指標。
[root@bogon ~]# dnf -y install httpd-tools
發起測試請求
[root@bogon ~]# ab -n 300 -c 30 http://192.168.10.101/
-n 300:表示總請求數為 300 次,即模擬客戶端向服務器發送300次HTTP 請求。
-c 30:表示并發用戶數為 30,即同時有30個請求并行發送到服務器
查看access.log發現大量請求日志狀態碼 503
[root@bogon ~]# tail -300 /usr/local/nginx/logs/access.log | grep -c 503
278
4、防盜鏈
防盜鏈是一種重要的安全設置,旨在防止未經授權的用戶盜用網站(靜態)資源。盜鏈行為不僅侵犯了內容創作者的版權,還可能導致原網站帶寬和資源的過度消耗,影響正常用戶的訪問速度和體驗。
一般來說,用戶瀏覽一個完整的頁面并不是一次性全部傳送到客戶端的。如果所請求的頁面帶有圖片或其他信息,那么第一個 HTTP 請求傳送的是這個頁面的文本,然后通過客戶端的瀏覽器對這段文本進行解釋執行。如果發現其中還有圖片,那么客戶端的瀏覽器會再次發送一條HTTP請求,當這個請求被處理后這個圖片文件才會被傳送到客戶端,最后瀏覽器會將圖片安放到頁面的正確位置,就這樣一個完整的頁面要經過多次發送HTTP請求才能夠被完整的顯示。基于這樣的機制,就會產生盜鏈問題:如果一個網站中沒有其頁面中所說圖片信息,那么它完全可以鏈接到其他網站的圖片信息上。這樣,沒有任何資源的網站利用了其他網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現。一些不良網站為了不增加成本而擴充自己站點內容,經常盜用其他網站的鏈接。一方面損害了原網站的合法利益,另一方面又加重了服務器的負擔。
本實驗需要兩臺主機
OpenEuler | www.aaa.com | 192.168.10.101 | 源主機 |
OpenEuler | www.bbb.com | 192.168.10.102 | 盜鏈主機 |
(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,設置域名和 IP 映射關系
192.168.10.101 www.aaa.com
192.168.10.102 www.bbb.com
(2)修改兩臺 OpenEuler 的 hosts 文件,設置域名和 IP 映射關系
[root@bogon ~]# vim /etc/hosts
192.168.10.101 www.aaa.com
192.168.10.102 www.bbb.com
(3)把圖片 kgc.png 放到源主機的工作目錄下
[root@bogon ~]# ls /usr/local/nginx/html/
50x.html index.html kgc.png
(4)編輯原網站首頁文件
[root@bogon ~]# vim /usr/local/nginx/html/index.html
<h1>aaa</h1>
<img src="kgc.png"/>
(5)測試訪問源網站
(6)編輯島鏈網站首頁文件
[root@bogon ~]# dnf -y install httpd
[root@bogon ~]# vim /var/www/html/index.html
<h1>bbb</h1>
<img src="http://www.aaa.com/kgc.png"/>
[root@bogon ~]# systemctl stop firewalld
[root@bogon ~]# systemctl start httpd
(7)測試訪問盜鏈網站(盜鏈成功)
(8)配置Nginx防盜鏈
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.conflocation ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {root html;valid_referers aaa.com *.aaa.com;if ($invalid_referer) { return 403;}}
[root@bogon ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@bogon ~]# systemctl restart nginx
~* \.(jpglgif|swf)$ | 這段正則表達式表示匹配不區分大小寫,以.jpg或. gif 或.swf 結尾的文件; |
Valid referers | 設置信任的網站,可以正常使用圖片 |
后面的網址或者域名 | referer 中包含相關字符串的網址 |
If 語句 | 如果鏈接的來源域名不在 valid referers 所列出的列表中,$invalid referer 為1,則執行后面的操作,即進行重寫或返回 403 頁面。 |
(9)測試訪問呢盜鏈網站(盜鏈失敗403)
二、高級防護
1、動態黑名單
動態黑名單是 Nginx 中一種實時攔截惡意請求的安全機制,它允許在不重啟服務的情況下,動態更新需要封禁的 IP地址或網段。相比靜態配置的 allow/deny指令,動態黑名單更靈活高效,適用于高并發、多變的攻擊防護場景。
(1)編輯黑名單配置文件
[root@bogon ~]# vim /usr/local/nginx/conf/blockips.conf
192.168.1.0/24 1; #封禁整個網段
192.168.10.102 1; #封禁ip
IP 地址后的數字含義:
0 | 允許 | |
1 | 403 | 完全封禁 |
2 | 444 | 靜默斷開 |
3 | 503 | 服務不可用 |
(2)編輯主配置文件
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.conf
http {
……geo $block_ip {default 0; #默認允許訪問include /usr/local/nginx/conf/blockips.conf; #包含黑名單}
……server {
……if ($block_ip) { #判斷標記值return 403; #封禁動作}
……}
}
geo | Nginx 內置模塊指令,專門用于處理IP地址相關的邏輯。基于客戶端IP 地址生成一個變量值,用于后續的訪問控制判斷 |
$block_ip | 自定義的變量名,存儲計算結果(通常為0或1)。 |
default 0 | 默認值,表示不在黑名單中的 IP 允許訪問 |
if($block ip) | 當變量值為1時觸發封禁邏輯 |
[root@bogon ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@bogon ~]# systemctl restart nginx
(3)使用封禁ip 測試訪問
(4)自動添加黑名單
[root@bogon ~]# awk '{print $1}' /usr/local/nginx/logs/access.log | sort | uniq -c | sort -nr | awk '{if ($1>100) print $2" 1;"}' > /usr/local/nginx/conf/blockips.conf
uniq -c:統計連續出現的次數,并在行首顯示次數
sort -nr:按數值排序
2、nginx https 配置
(1)HTTP 風險
HTTP 由于是明文傳輸,主要存在三大風險:竊聽風險、篡改風險、冒充風險。
- 竊聽風險:中間人可以獲取到通信內容,由于內容是明文,所以獲取明文后有安全風險
- 篡改風險:中間人可以篡改報文內容后再發送給對方,風險極大。
- 冒充風險:比如你以為是在和某寶通信,但實際上是在和一個釣魚網站通信。
(2)安全通信的四大原則
- 機密性:即對數據加密,解決了竊聽風險,因為即使被中間人竊聽,由于數據是加密的,他也拿不到明文;
- 完整性:指數據在傳輸過程中沒有被篡改,不多不少,保持原樣,中途如果哪怕改了一個標點符號,接收方也能識別出來,從來判定接收報文不合法;
- 身份認證:確認對方的真實身份,即證明“你媽是你媽”的問題,這樣就解決了冒充風險,用戶不用擔心訪問的是某寶結果卻在和釣魚網站通信的問題;
- 不可否認:即不可否認已發生的行為,比如小明向小紅借了1000元,但沒打借條,或者打了借條但沒有簽名,就會造成小紅的資金損失。
(3)HTTPS 通信原理簡述
- 對稱加密:通信雙方使用同一把密鑰進行加解密,效率高但存在密鑰協商難題。若通過報文傳輸密鑰,易被中間人截獲替換,導致后續通信內容被竊取和篡改。
- 非對稱加密:加解密使用不同密鑰,公鑰可公開,私鑰保密。服務器保管私鑰并發布公鑰,客戶端用公鑰加密對稱加密密鑰(或相關信息)傳給服務器,解決了密鑰傳輸安全問題,但服務器的公鑰傳輸又面臨被中間人調包風險。
數字證書解決公鑰信任問題:
證書申請與構成:服務器向證書頒發機構(CA)申請證書,提交域名、組織單位信息和公鑰等生成證書簽名請求(CSR) ,CA 據此生成證書,包含證書序列號、過期時間、站點信息、公鑰、頒發者名稱和簽名等內容。
證書驗證與通信流程:客戶端收到服務器的證書后,用系統內置的 CA 證書公鑰驗簽。驗簽通過則表明證書可信,其公鑰也可信。客戶端用該公鑰加密會話密鑰(對稱加密密鑰)發送給服務器,服務器用私鑰解密獲取會話密鑰,之后雙方使用對稱加密進行數據傳輸。
HTTPS 加密模式:握手階段采用非對稱加密,用于安全交換對稱加密密鑰;數據傳輸階段使用對稱加密,因其密鑰管理簡便、加密解密效率高,這種混合模式既保障安全又兼顧性能。
3、nignx 配置https 證書
由于 ss1 證書需要向 CA 組織申購,實驗采用自簽名證書(也就是自己給自己簽名并頒發證書,當然這種證書是不被信任的)
(1)使用 openssl 生成證書和私鑰生成證書和私鑰
[root@localhost ~]# mkdir -p /etc/nginx/ssl
[root@localhost ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt -subj "/C=CN/ST=BeiJing/L=BeiJing/O=benet/CN=localhost"
.+......+++++++++++++++++++++++++++++++++++++++*..+.....+...+.......+++++++++++++++++++++++++++++++++++++++*..+...+.......+...+..+.......+.....+.+..+...+....+.....+......+....+.....+......+......+...+.......+...+.....+...+.........+................+...+..+.........+...+...+.......+...+...+.........+......+.....+.+...............+.....+......+...+......+....+..+...+.......+..+.+......+.....+...+.......+...+........+.........+................+........+......+......+.........+.............+.....+.+...........+...+.+............+...+..+...+.........+.+......+.....+.+...+..+.......+..+.........+..........+.........+..+..........+...+........+...+.......+...............+...+......+.....+......+.........+.+..................+.........+.....+............+....+..+....+........+...+...+.........+......+.+.....+.+...+.....+.......+...............+........+....+...+..+.......+...+..+......+....+.....................+.........+...........+....+.....+.+........+.......+.....+...............+....+...........+..........+...+.....+.+...+...+..+................+.....+....+..+...+.............+...............+..+.+..+..................+.........+...+...+.+...+..+.+..+.............+..+.+.....+....+........+.............+..+...+......+....+.........+..+...+.+..............+...+.........+....+......+........+......+.+.....+...+...+....+..................+...+....................+...+.+...+......+.........+..+.+.........+.....+...+.+..+..........+........+.+.........+.....+.......+..+...+.......+..+.........+....++++++
.....+++++++++++++++++++++++++++++++++++++++*...+...+++++++++++++++++++++++++++++++++++++++*.+..+.+......+.....+...+.......+.....+.+........................+...+...........+......+......+....+.....+....+..+...+....+....................+......+.......+..+......+.+...............+...+...+..............+....+......+...+.....+.+.........+.....+...+...+.......+..+......+.+......+.....+.......+..+.....................+...+....+.................+....+......+......+...+......+.....+.+..+...............+.+......+......+..............+.........+.......+..+.+...........+....+..+.......+........+....+...+..+.+...+.....+..........+......+...+...+..............+.............+..++++++
-----
參數解釋:
-x509 | 生成自簽名證書(而非CSR) |
-nodes | 不加密私鑰(無密碼保護)。 |
-days 365 | 證書有效期1年。 |
-keyout | 私鑰文件。 |
-out | 自簽名文件。 |
-newkey rsa:2048 | 生成2048 位的 RSA 私鑰。 |
-subj | 證書主題信息(按需修改字段) |
注:
CA 簽名證書:需要由受信任的第三方證書頒發機構(CA)簽發。流程如下:
1.用戶生成私鑰和 CSR(證書簽名請求)。
2.將 CSR 提交給 CA(如Let's Encrypt、DigiCert 等)。
3.CA 機構驗證身份后,用CA的私鑰對證書簽名,生成最終證書。
自簽名證書:證書的頒發者(Issuer)和主體(Subject)是同一個實體(即自己)無需第三方 CA 參與,直接用工具(如 0penSSL)生成私鑰和證書。簽名時使用自己的私鑰,而不是 CA的私鑰。適用于測試、內部環境或無需公開信任的場景。
(2)nginx 啟用https
編輯nginx 配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {listen 443 ssl; #監聽HTTPS端口server_name localhost;#指定證書和私鑰路徑ssl_certificate /etc/nginx/ssl/nginx.crt;ssl_certificate_key /etc/nginx/ssl/nginx.key;
}
#重定向server {listen 80; return 301 https://$host$request_uri;}
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]# systemctl restart nginx
(3)驗證
訪問https://服務器ip
瀏覽器會提示證書不安全(因自簽名),選擇“高級’”--繼續前往或信任此證書(測試環境可忽略警告)。