nginx安全防護(hù)與https部署全過程
核心安全配置
編制安裝nginx
安裝支持軟件
[root@localhost ^]# dnf install -y gcc make pcre-deve1 zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
創(chuàng)建運(yùn)行用戶,組和日志目錄
[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
隱藏版本號(hào)
在生產(chǎn)環(huán)境中,需要隱藏Nginx的版本號(hào),以避免泄漏Nginx白的版本,使攻擊者不能針對(duì)特定版本進(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限制危險(xiǎn)請(qǐng)求方法
不安全的請(qǐng)求方式,是潛在的安全風(fēng)險(xiǎn),TRACE(易引發(fā)XST攻擊)、PUT/DELETE(文件修改風(fēng)險(xiǎn))、CONNECT(代理濫用),通過正則表達(dá)式匹配請(qǐng)求方法,非白名單方法返回444(無響應(yīng)關(guān)閉連接)
修改配置文件
[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf
server {
($request_method !~ (GET|HEAD|POST)$) {
return 444;
}
}驗(yàn)證
[root@localhost ^]# curl -XPUT -I 192.168.10.10] curl: (52) Empty reply from server
請(qǐng)求限制(cc攻擊防御)
CC攻擊(Challenge Collapsar攻擊)是一種常見的網(wǎng)絡(luò)J攻擊方式,通過大量合法或偽造的小流量請(qǐng)求來耗盡服務(wù)器資源,導(dǎo)致正常用戶無去訪問網(wǎng)站。要在Nginx中有效防止CC攻擊,可以采用多種策略和方法
CC攻擊,也稱為連接數(shù)攻擊或請(qǐng)求速率限制攻擊,通過模擬大量用戶訪問來消耗服務(wù)器資源,從而使得正常用戶無法正常訪問網(wǎng)站。為了防止此類攻擊,可以使用Nginx提供的模塊來限制請(qǐng)求速率和并發(fā)連接數(shù)
使用nginx的limit_req模塊限制請(qǐng)求速率
[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;
}
}
}壓力測(cè)試驗(yàn)證
安裝ab測(cè)試工具
[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:表示總請(qǐng)求數(shù)為300次,即模擬客戶端向服務(wù)器發(fā)送300 次HTTP請(qǐng)求
- -c 30:表示并發(fā)用戶數(shù)為30,即同時(shí)有30個(gè)請(qǐng)求并行發(fā)送到服務(wù)器。
防盜鏈
防盜鏈?zhǔn)且环N重要的安全設(shè)置,旨在防止未經(jīng)授權(quán)的用戶盜用網(wǎng)站(靜態(tài))資源。盜鏈行為不僅侵犯了內(nèi)容創(chuàng)作者的版權(quán),還可能導(dǎo)致原網(wǎng)站帶寬和資源的過度消耗,影響正常用戶的訪問速度和體驗(yàn)。
修改 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
修改兩臺(tái)OpenEuler的hosts文件,設(shè)置域名和IP映射關(guān)系。
192.168.10.101 www.aaa.com
192.168.10.102www.bbb.com
把圖片kgc.png放到源主機(jī)(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)行驗(yà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
測(cè)試訪問盜鏈網(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測(cè)試訪問盜鏈網(wǎng)站(盜鏈?zhǔn)?03)
高級(jí)防護(hù)
動(dòng)態(tài)黑名單
動(dòng)態(tài)黑名單是Nginx中一種實(shí)時(shí)攔截惡意請(qǐng)求的安全機(jī)制,它允許在不重啟服務(wù)的情況下,動(dòng)態(tài)更新需要封禁的IP地址或網(wǎng)段。
相比靜態(tài)配置的allow/deny指令,動(dòng)態(tài)黑名單更靈活高效,適用于高并發(fā)、多變的攻擊擊防護(hù)場(chǎng)景。
編輯黑名單配置文件
[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測(cè)試訪問
[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>
自動(dòng)添加黑名單
#!/bin/bash
#自動(dòng)封禁訪問超過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)計(jì)連續(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一層,用于對(duì)應(yīng)用層數(shù)據(jù)的加解密。
如下所示:
httpssl/tsltcpip
http為什么不安全
HTTP由于是明文傳輸,主要存在三大風(fēng)險(xiǎn):竊 聽風(fēng)險(xiǎn)、篡改區(qū)險(xiǎn)、冒充風(fēng)險(xiǎn)。
- 竊 聽風(fēng)險(xiǎn)
- 中間人可以獲取到通信內(nèi)容,由于內(nèi)容是明文,所以獲取明文后有安全風(fēng)險(xiǎn)
- 篡改風(fēng)險(xiǎn)
- 中間人可以篡改報(bào)文內(nèi)容后再發(fā)送給對(duì)方,風(fēng)險(xiǎn)極大。
- 冒充風(fēng)險(xiǎn)
- 比如你以為是在和某寶通信,但實(shí)際上是在和一個(gè)釣魚網(wǎng)站通信。
安全通信的四大原則
通信需要包括以下四個(gè)原則:機(jī)密性、完整性,身份認(rèn)證和不可否認(rèn)。
- 機(jī)密性:即對(duì)數(shù)據(jù)加密,解決了竊 聽風(fēng)險(xiǎn),因?yàn)榧词贡恢虚g人竊 聽,由于數(shù)據(jù)是加密的,他也拿不到明文:
- 完整性:指數(shù)據(jù)在傳輸過程中沒有被篡改,不多不少,保持原樣,中途如果哪怕改了一個(gè)標(biāo)點(diǎn)符號(hào),接收方也能識(shí)別出來,從來判定定接收?qǐng)?bào)文不合法
- 身份認(rèn)證:確認(rèn)對(duì)方的真實(shí)身份,即證明"你媽是你媽"的問題,這樣就解決了冒充風(fēng)險(xiǎn),用戶不用擔(dān)心訪問的是某寶結(jié)果卻在和釣魚網(wǎng)網(wǎng)站通信的問題:
- 不可否認(rèn):即不可否認(rèn)已發(fā)生的行為,比如小明向小紅借了1000元,但沒打借條,或者打了借條但沒有簽名,就會(huì)造成小紅的資金損失夫。
https通信原理簡(jiǎn)述
既然HTTP是明文傳輸?shù)?,那我們給報(bào)文加密不就行了,既然要加密,我們肯定需要通信雙方協(xié)商好密鑰吧。一種是通信雙方使用同一把密鑰,即對(duì)稱加密的方式來給報(bào)文進(jìn)行加解密。
非對(duì)稱加密即加解密雙方使用不同的密鑰,一把作為公鑰,可以公開的,把作為私鑰,不能公開,公鑰加密的密文只有私鑰可以解密,私鑰簽名的內(nèi)容,也只有公鑰可以驗(yàn)簽。
數(shù)字證書,解決公鑰傳輸信任問題
證書是由站點(diǎn)管理者向CA申請(qǐng),申請(qǐng)的時(shí)候會(huì)提交域名、組織單位信息和公鑰等數(shù)據(jù)(這些數(shù)據(jù)組成了Certificate Signing Request證書簽名請(qǐng)求簡(jiǎn)稱CSR),CA會(huì)根據(jù)這些信息生成證書
https總結(jié)
server傳輸CA頒發(fā)的證書給client,client收到證書后使用系統(tǒng)內(nèi)置的CA證書的公鑰來驗(yàn)簽,驗(yàn)簽通過證明證書是受信任的,證書受信任那么證書中的公鑰也就是受信任的,這樣的話就解決了公鑰傳輸過程中被調(diào)包的風(fēng)險(xiǎn)。
nginx配置https證書
由于ssl證書需要向CA組織申購,實(shí)驗(yàn)采用自簽名證書(也就是自己給自己簽名并頒發(fā)證書,當(dāng)然這種證書是不被信任的)
使用openssl 生成證書和私鑰生成證書和私鑰
創(chuàng)建證書存儲(chǔ)目錄
[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ā)機(jī)構(gòu)(CA)簽發(fā)。
流程如下:
- 1.用戶生成私鑰和CSR(證書簽名請(qǐng)求)。
- 2.將CSR提交給CA(如Let'sEncrypt、DigiCert等)。
- 3.CA機(jī)構(gòu)驗(yàn)證身份后,用CA的私鑰對(duì)證書簽名,生成最終證書。
自簽名證書:
- 證書的頒發(fā)者(Issuer)和主體(Subject)是同一個(gè)實(shí)體((即自己)。
- 無需第三方CA參與,直接用工具(如0penSSL)生成私鑰和證書。
- 簽名時(shí)使用自己的私鑰,而不是CA的私鑰。
- 適用于測(cè)試、內(nèi)部環(huán)境或無需公開信任的場(chǎng)景。
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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx實(shí)現(xiàn)if多重判斷配置方法示例
這篇文章主要介紹了Nginx實(shí)現(xiàn)if多重判斷配置方法示例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
對(duì)Nginx支持SSL的性能進(jìn)行優(yōu)化的方法
這篇文章主要介紹了對(duì)Nginx支持SSL的性能進(jìn)行優(yōu)化的方法,作者分別以不同方法進(jìn)行了8個(gè)優(yōu)化實(shí)驗(yàn),需要的朋友可以參考下2015-06-06
Nginx實(shí)現(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ù)器時(shí),過渡服務(wù)器再跳轉(zhuǎn)到后臺(tái)服務(wù)器,本文給大家介紹了Nginx外網(wǎng)訪問內(nèi)網(wǎng)如何實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-10-10
升級(jí)nginx支持HTTP/2服務(wù)端推送的方法
這篇文章主要介紹了升級(jí)nginx支持HTTP/2服務(wù)端推送的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

