nginx安全防護(hù)與https部署全過程
核心安全配置
編制安裝nginx
安裝支持軟件
[root@localhost ^]# dnf install -y gcc make pcre-deve1 zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
創(chuàng)建運行用戶,組和日志目錄
[root@localhost~]# useradd -M -s /sbin/nologin nginx [root@localhost~]# mkdir-p/var/log/nginx [root@localhost~]# chown -R nginx:nginx /var/log/nginx
編譯安裝
[root@localhost ^]# tar zxf nginx-1.26.3.tar.gz [root@localhost ^]# cd nginx-1.26.3 [root@localhost 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 [root@localhost nginx-1.26.3]# make & make install
為主程序 nginx創(chuàng)建鏈接文件
[root@localhost nginx-1.26.3]# In -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
添加nginx系統(tǒng)服務(wù)
[root@localhost ^]# vi /lib/systemd/system/nginx.service [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 [Instal1] WantedBy=multi-user.target [root@localhost^]# systemctl daemon-reload [root@localhost~]# systemctl start nginx [root@localhost^]# systemctl enable nginx
隱藏版本號
在生產(chǎn)環(huán)境中,需要隱藏Nginx的版本號,以避免泄漏Nginx白的版本,使攻擊者不能針對特定版本進(jìn)行攻擊。
[root@localhost ~]# curl -I 192.168.10.101 HTTP/1.1 200 OK Server: nginx/1.26.3
修改配置文件
[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf http { include mime.types; default_type application/octet-stream; server_tokens off; ....... [root@localhost^]#nginx -t [root@localhost~]#nginx -s reload [root@localhost~]# curl -I 192.168.10.101 HTTP/1.1 200 OK Server: nginx
限制危險請求方法
不安全的請求方式,是潛在的安全風(fēng)險,TRACE(易引發(fā)XST攻擊)、PUT/DELETE(文件修改風(fēng)險)、CONNECT(代理濫用),通過正則表達(dá)式匹配請求方法,非白名單方法返回444(無響應(yīng)關(guān)閉連接)
修改配置文件
[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf server { ($request_method !~ (GET|HEAD|POST)$) { return 444; } }
驗證
[root@localhost ^]# curl -XPUT -I 192.168.10.10] curl: (52) Empty reply from server
請求限制(cc攻擊防御)
CC攻擊(Challenge Collapsar攻擊)是一種常見的網(wǎng)絡(luò)J攻擊方式,通過大量合法或偽造的小流量請求來耗盡服務(wù)器資源,導(dǎo)致正常用戶無去訪問網(wǎng)站。要在Nginx中有效防止CC攻擊,可以采用多種策略和方法
CC攻擊,也稱為連接數(shù)攻擊或請求速率限制攻擊,通過模擬大量用戶訪問來消耗服務(wù)器資源,從而使得正常用戶無法正常訪問網(wǎng)站。為了防止此類攻擊,可以使用Nginx提供的模塊來限制請求速率和并發(fā)連接數(shù)
使用nginx的limit_req模塊限制請求速率
[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf http { limit_req_zone_$binary_remote_addr_zone=req_limit:10m rate=10r/s; server { location / { root html; index index.html index.php; limit_req zone=req_limit burst=20 nodelay; } } }
壓力測試驗證
安裝ab測試工具
[root@localhost ^]# dnf install httpd-tools -y [root@localhost~]# ab -n 300 -c 30 http://192.168.10.101/ [root@localhost ^]# tail -300 /usr/local/nginx/logs/access. log | grep -c 503 279
- -n 300:表示總請求數(shù)為300次,即模擬客戶端向服務(wù)器發(fā)送300 次HTTP請求
- -c 30:表示并發(fā)用戶數(shù)為30,即同時有30個請求并行發(fā)送到服務(wù)器。
防盜鏈
防盜鏈?zhǔn)且环N重要的安全設(shè)置,旨在防止未經(jīng)授權(quán)的用戶盜用網(wǎng)站(靜態(tài))資源。盜鏈行為不僅侵犯了內(nèi)容創(chuàng)作者的版權(quán),還可能導(dǎo)致原網(wǎng)站帶寬和資源的過度消耗,影響正常用戶的訪問速度和體驗。
修改 Windows 的 C:\Windows\System32 drivers\etc\hossts文件,設(shè)置域名和IP映射關(guān)系
192.168.10.101 www.aaa.com
192.168.10.102 www.bbb.com
修改兩臺OpenEuler的hosts文件,設(shè)置域名和IP映射關(guān)系。
192.168.10.101 www.aaa.com
192.168.10.102www.bbb.com
把圖片kgc.png放到源主機(www.aaa.com的工作目錄下
[root@localhost ^]# ls /usr/local/nginx/html Index. html kgc.png
編輯原網(wǎng)站首頁文件
[root@localhost ^]# vi /usr/local/nginx/html/index.html <html> <body> <h1>aaa It work!</h1> <img src="kgc.png"/> <body> </html>
使用瀏覽器訪問進(jìn)行驗證即可
編輯盜鏈網(wǎng)站首頁文件
[root@localhost ^]# dnf -y install httpd [root@localhost~]# vi /usr/local/nginx/html/index.html <html <body> <h1>bbb It work! </hl> <img src="http://www.aaa.com/kgc.png </body> </html> [root@localhost~]# systemctl stop firewalld [root@localhost`]# systemctl start httpd
測試訪問盜鏈網(wǎng)站(使用瀏覽器)
配置Nginx防盜鏈
[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf location ^* \. (gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)s{ root html; valid_referers aaa.com *.aaa.com; if($invalid referer){ return 403; } } [root@localhost^]#nginx -t [root@localhost~]#nginx -s reload
測試訪問盜鏈網(wǎng)站(盜鏈?zhǔn)?03)
高級防護(hù)
動態(tài)黑名單
動態(tài)黑名單是Nginx中一種實時攔截惡意請求的安全機制,它允許在不重啟服務(wù)的情況下,動態(tài)更新需要封禁的IP地址或網(wǎng)段。
相比靜態(tài)配置的allow/deny指令,動態(tài)黑名單更靈活高效,適用于高并發(fā)、多變的攻擊擊防護(hù)場景。
編輯黑名單配置文件
[root@localhost ^]# vi /usr/local/nginx/conf/blockips.conf 192.168.1.0/24 1; 192.168.10.102 1;
編輯主配置文件
[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf http { geo $block_ip { default 0; finclude /usr/local/nginx/conf/blockips.conf; } server if ($block_ip) { return 403; } } }
[root@localhost^]# nginx -t [root@localhost~]# nginx -s reload
使用封禁ip測試訪問
[root@localhost ~]# curl 192.168.10.101 <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx</center> </body> </html>
自動添加黑名單
#!/bin/bash #自動封禁訪問超過100次的IP awk '{print$1}'/var/log/nginx/access.log|sort|uniq -c?ssort -nr | awk'{if($1>100) print $2"1;"}' >/usr/local/nginx/conf/bllockips.conf
- uniq-c:統(tǒng)計連續(xù)出現(xiàn)的次數(shù),并在行首顯示次數(shù)
- sort-nr:按數(shù)值排序
nginx https配置
https概念
眾所周知,http(超文本傳輸協(xié)議)是客戶端瀏覽器與web服務(wù)器之間的通信協(xié)議,而https協(xié)議可以認(rèn)為是HTTP+SSL/TLS,在http之下tcp之上加了ss1一層,用于對應(yīng)用層數(shù)據(jù)的加解密。
如下所示:
http
ssl
/tsl
tcp
ip
http為什么不安全
HTTP由于是明文傳輸,主要存在三大風(fēng)險:竊 聽風(fēng)險、篡改區(qū)險、冒充風(fēng)險。
- 竊 聽風(fēng)險
- 中間人可以獲取到通信內(nèi)容,由于內(nèi)容是明文,所以獲取明文后有安全風(fēng)險
- 篡改風(fēng)險
- 中間人可以篡改報文內(nèi)容后再發(fā)送給對方,風(fēng)險極大。
- 冒充風(fēng)險
- 比如你以為是在和某寶通信,但實際上是在和一個釣魚網(wǎng)站通信。
安全通信的四大原則
通信需要包括以下四個原則:機密性、完整性,身份認(rèn)證和不可否認(rèn)。
- 機密性:即對數(shù)據(jù)加密,解決了竊 聽風(fēng)險,因為即使被中間人竊 聽,由于數(shù)據(jù)是加密的,他也拿不到明文:
- 完整性:指數(shù)據(jù)在傳輸過程中沒有被篡改,不多不少,保持原樣,中途如果哪怕改了一個標(biāo)點符號,接收方也能識別出來,從來判定定接收報文不合法
- 身份認(rèn)證:確認(rèn)對方的真實身份,即證明"你媽是你媽"的問題,這樣就解決了冒充風(fēng)險,用戶不用擔(dān)心訪問的是某寶結(jié)果卻在和釣魚網(wǎng)網(wǎng)站通信的問題:
- 不可否認(rèn):即不可否認(rèn)已發(fā)生的行為,比如小明向小紅借了1000元,但沒打借條,或者打了借條但沒有簽名,就會造成小紅的資金損失夫。
https通信原理簡述
既然HTTP是明文傳輸?shù)?,那我們給報文加密不就行了,既然要加密,我們肯定需要通信雙方協(xié)商好密鑰吧。一種是通信雙方使用同一把密鑰,即對稱加密的方式來給報文進(jìn)行加解密。
非對稱加密即加解密雙方使用不同的密鑰,一把作為公鑰,可以公開的,把作為私鑰,不能公開,公鑰加密的密文只有私鑰可以解密,私鑰簽名的內(nèi)容,也只有公鑰可以驗簽。
數(shù)字證書,解決公鑰傳輸信任問題
證書是由站點管理者向CA申請,申請的時候會提交域名、組織單位信息和公鑰等數(shù)據(jù)(這些數(shù)據(jù)組成了Certificate Signing Request證書簽名請求簡稱CSR),CA會根據(jù)這些信息生成證書
https總結(jié)
server傳輸CA頒發(fā)的證書給client,client收到證書后使用系統(tǒng)內(nèi)置的CA證書的公鑰來驗簽,驗簽通過證明證書是受信任的,證書受信任那么證書中的公鑰也就是受信任的,這樣的話就解決了公鑰傳輸過程中被調(diào)包的風(fēng)險。
nginx配置https證書
由于ssl證書需要向CA組織申購,實驗采用自簽名證書(也就是自己給自己簽名并頒發(fā)證書,當(dāng)然這種證書是不被信任的)
使用openssl 生成證書和私鑰生成證書和私鑰
創(chuàng)建證書存儲目錄
[root@localhost ^]# mkdir -p /etc/nginx/ssl
生成自簽名證書
[root@localhost ^]# 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/0=MyOrg/CN=localhost
Ps:
CA簽名證書:
需要由受信任的第三方證書頒發(fā)機構(gòu)(CA)簽發(fā)。
流程如下:
- 1.用戶生成私鑰和CSR(證書簽名請求)。
- 2.將CSR提交給CA(如Let'sEncrypt、DigiCert等)。
- 3.CA機構(gòu)驗證身份后,用CA的私鑰對證書簽名,生成最終證書。
自簽名證書:
- 證書的頒發(fā)者(Issuer)和主體(Subject)是同一個實體((即自己)。
- 無需第三方CA參與,直接用工具(如0penSSL)生成私鑰和證書。
- 簽名時使用自己的私鑰,而不是CA的私鑰。
- 適用于測試、內(nèi)部環(huán)境或無需公開信任的場景。
nginx啟用https
編輯nginx配置文件
[root@localhost ~]#vi /usr/local/nginx/conf/nginx.conf server { listen 443 ssl; #監(jiān)聽 HTTPS 端口 server_namelocalhost; #域名或IP #指定證書和私鑰路徑 ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; /etc/nginx/ssl/nginx-selfsigned.key; issl_certificate_key server { listen 80; server_name localhost; return 301 https://$host$request_uri; }
[root@localhost ^]#nginx -t [root@localhost ^]#nginx -s reload
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
對Nginx支持SSL的性能進(jìn)行優(yōu)化的方法
這篇文章主要介紹了對Nginx支持SSL的性能進(jìn)行優(yōu)化的方法,作者分別以不同方法進(jìn)行了8個優(yōu)化實驗,需要的朋友可以參考下2015-06-06Nginx實現(xiàn)外網(wǎng)訪問內(nèi)網(wǎng)的步驟詳解
外網(wǎng)瀏覽器與內(nèi)網(wǎng)是不通的,但是外網(wǎng)與中間過渡服務(wù)器是通的,中間過渡服務(wù)器與內(nèi)網(wǎng)服務(wù)器是通的,這樣在外網(wǎng)訪問過渡服務(wù)器時,過渡服務(wù)器再跳轉(zhuǎn)到后臺服務(wù)器,本文給大家介紹了Nginx外網(wǎng)訪問內(nèi)網(wǎng)如何實現(xiàn)步驟,需要的朋友可以參考下2023-10-10