Nginx安全防护与HTTPS部署实战

目录

一:核心安全配置

1:编译安装nginx

(1)安装支持软件

(2)创建运行用户,组和日志目录

(3)编译安装nginx

(4)添加nginx系统服务

2:隐藏版本号

3:限制危险请求的方法

4:请求限制(cc攻击防御)

(1)使用nginx的limit_reg模块限制请求速率

(2)压力测试验证

5:防盗链

[(1)修改 Windows的C:\Windows\System32\drivers\etc\hosts文件,设置域名和IP映射关系](#(1)修改 Windows的C:\Windows\System32\drivers\etc\hosts文件,设置域名和IP映射关系)

(2)修改两台OpenEuler的hosts文件,设置域名和IP映射时关系。

(3)把图片kgc.png放到源主机(www.aaa.com)的工作目录下

(4)编辑原网站首页文件

(5)测试访问源网站

(6)编辑盗链网站首页文件

(7)测试访问盗链网站(盗链成功)

(8)配置Nginx防盗链

二:高级防护

1:动态黑名单

(1)编辑黑名单配置文件

(2)编辑主配置文件

(3)使用封禁ip测试访问

(4)自动添加黑名单

2.nginxhttps配置

2.1https概念

2.2nginx配置https证书

[2.2.1使用openssl 生成证书和私钥生成证书和私钥](#2.2.1使用openssl 生成证书和私钥生成证书和私钥)

[2.2.2 nginx启用https](#2.2.2 nginx启用https)

2.2.2通过浏览器验证


一:核心安全配置

1:编译安装nginx

(1)安装支持软件

Nginx的配置及运行需要pcre、zlib等软件包的支持,因此比应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。

root@localhost \^\]# dnf install -y gcc make pcre-deve1 zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget taar

(2)创建运行用户,组和日志目录

root@localhost\~\]# useradd -M -s /sbin/nologin nginx \[root@localhost\~\]# mkdir -p /var/log/nginx \[root@localhost \^\]# chown -R nginx:nginx /var/log/nginx

(3)编译安装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创建链接文件 \[root@localhost nginx-1.26.3\]# 1n -s /usr/local/nginx/sbir/nging/usr/local/sbin/

(4)添加nginx系统服务

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

Install

WantedBy=multi-user.target

root@localhost\~\]# systemctl daemon-reload \[root@localhost \^\]# systemctl start nginx \[root@localhost \^\]# systemctl enable nginx

2:隐藏版本号

在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Ngin的版本,攻击者不能针对特定版本进行攻击。在隐藏版本号之前,可以使用Fiddler 具抓取数据包,查看Nginx版本,也可以在0penEuler中使用命令curl-Ihttp://192.168.10.101/查看

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 //省略部分内容

3:限制危险请求的方法

不安全的请求方式,是潜在的安全风险,TRACE(易引发XST攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用),通过正则表达式四配请求方法,非白名单方法返回444(无响应关闭连接)

修改配置文件

root@localhost\^\]# vi /usr/local/nginx/conf/nginx.conf server if($request_method !\~\^(GET\|HEAD\|POST)$ ) { return 444; } 验证测试请求 测试PUT/DELETE请求 \[root@localhost \^\]# curl -XPUT -I 192.168.10.101 curl: (52) Empty reply from server 查看access.log 192.168.10.101 - - \[11/Mar/2025:18:30:46 +0800\] "PUT /HTTP/1.1" 444 0 "cur1/8.4.0"

4:请求限制(cc攻击防御)

CC攻击(ChallengeCollapsar攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在Nginx中有效防止CC攻击,可以采用多种策略和方法。

(1)使用nginx的limit_reg模块限制请求速率

编辑配置文件

root@localhost\~\]# vi /usr/local/nginx/conf/nginx.conf http { #定义限制区(10MB内存/每秒10请求 limit_req_zone $binary_remote_addr zone=req_limit:10m ratte=10r/s #其他全局配置... server { location / { root html; index index.html index.php; 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绑定到预定义的共享内存区

>fburst=20类似与等候区,超出并发数的请求会到等候区,等候区占满后,多余的请求会立刻返回503

>nodelay立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回503

(2)压力测试验证

安装ab测试工具

ApacheBench(简称ab)是Apache HTTP服务器自带的一个轻量级、易用的HTTP服务器性能测试工具。它主要用于评估服务器在并发访问下的性能表现,包括响应时间、吞吐量等关键指标。

root@localhost\~\]# dnf install httpd-tools -y 发起测试请求 共发起300个请求,每次发起30个请求 \[root@localhost\]# ab -n 300 -c 30 http://192.168.10.101/ 查看access.log发现大量请求日志状态码503 \[root@localhost \^\]# tail -300 /usr/local/nginx/logs/access. log \| grep -c 503 279 -n 300 表示总请求数为300次,即模拟客户端向服务器发送300次HTTP请求。 -c 30 表示并发用户数为30,即同时有30个请求并行发送到服务器。 ### 5:防盗链 防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。 #### (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映射时关系。 > 192.168.10.101 www.aaa.com > > 192.168.10.102 www.bbb.com #### (3)把图片kgc.png放到源主机(www.aaa.com)的工作目录下 > \[root@localhost \^\]# ls /usr/local/nginx/html > > index. html kgc.png. #### (4)编辑原网站首页文件 > \[root@localhost \^\]# vi /usr/local/nginx/html/indexhtml > > \ > > \ > > \aaa It work! > > \ > \ > > \ > > \[root@localhost\]# systemctl stop firewalld > > \[root@localhost\^\]# systemctl start httpd #### (7)测试访问盗链网站(盗链成功) #### (8)配置Nginx防盗链 > \[root@localhost \^\]# vi /usr/local/nginx/conf/nginx.conf > > location \^\* \\.(gif\|jpg\|jpeg\|png\|bmp\|swf\|flv\|mp4\|webp\|ico)${ > > root html; > > valid_referers aaa.com \*.aaa.com; > > if($invalid_referer){ > > return 403; > > } > > } > > \[root@localhost\^\]#nginx -t > > \[root@localhost\~\]#nginx -s reload > > \>\*\\.(jpg\|gif\|swf)$:这段正则表达式表示匹配不区分大小写,以人.jpg或.gif或.swf结尾的文件; > > \>Valid_referers:设置信任的网站,可以正常使用图片; > > \>后面的网址或者域名:referer中包含相关字符串的网址; > > \>If语句:如果链接的来源域名不在valid_referers所列出的列表中,$invalid_referer为1,则执行后面的操作,即进行重写或返回403页面。 > > 测试访问盗链网站(盗链失败403) ## 二:高级防护 ### 1:动态黑名单 动态黑名单是Nginx中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的IP地址或网段。相比静态配置的allow/deny指令,动态黑名单更灵活高效,适用于高并发多变的攻击防护场景。 #### (1)编辑黑名单配置文件 > > \[root@localhost \^\]# vi /usr/local/nginx/conf/blockipss. conf > > 192.168.1.0/24 1;#封禁整个网段 > > 192.168.10.102 1;#封禁ip > > IP地址后的数字含义: > > 0 ""; #允许 > > 1 403 ; #完全封禁 > > 2 444; 静默断开 > > 3 503 ; 服务不可用 #### (2)编辑主配置文件 > \[root@localhost \^\]# vi /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; #封禁动作 > > } > > } > > } > > \[root@localhost\^\]# nginx -t > > \[root@localhost\^\]# nginx -s reload > > \>geo:Nginx内置模块指令,专门用于处理IP地址相关的逻辑。基于客IP地址生成一个变量值,用于后续的访问控制判断 > > \>$block_ip:自定义的变量名,存储计算结果(通常为0或1)。 > > \>default0:默认值,表示不在黑名单中的IP允许访问 > > \>if($block ip):当变量值为1时触发封禁逻辑 #### (3)使用封禁ip测试访问 > > \[root@localhost\*\]# curl 192.168.10.101 > > \ > > \\403 Forbidden\\ > > \ > > \\403 Forbidden\\ > > \\nginx\ > > \ > > \ > #### (4)自动添加黑名单 > > 自动封禁访问超过100次的IP > > #!/bin/bash > > #自动封禁访问超过100次的IP > > awk '{print$1}'/var/log/nginx/access.log\|sort\|uniq -c\| sort -nr > > \| awk'{if($100) print$2"1;"}' \>/usr/local/nginx/conf/blockips.conf > > uniq-c:统计连续出现的次数,并在行首显示次数 > > sort-nr:按数值排序 ### 2.nginxhttps配置 #### 2.1https概念 HTTPS,全称HyperText Transfer Protocol over SecureSocket Layer,设计初衷是为了保证数据传输安全。国内大型互联网巨头在2016开始大力推行https,期间关于https的重大事件有: Google搜索引擎让https的网站在搜索排名中更靠前。 从2017年开始,chrome 浏览器把只采用http的网站标记为不安全网站。 苹果要求App Store中的所有应用都必须使用https加密链接. 微信小程序也要求必须使用https。 新一代的http/2协议的支持需要以https为基础。 **2.1.1HTTP为什么不安全** HTTP由于是明文传输,主要存在三大风险:窃听风险、篡改风险、冒充风险。 **窃听风险** 中间人可以获取到通信内容,由于内容是明文,所以获取文后有安全风险 **簒改风险** 中间人可以篡改报文内容后再发送给对方,风险极大。 **冒充风险** 比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信。 **2.1.2安全通信的四大原则** 不难猜到HTTPS就是为了解决上述三个风险而生的,一般我们认为安全的通信需要包括以下四个原则:机密性、完整性,身份认证和不可否认。 **机密性:** 即对数据加密,解决了窃听风险,因为即使被中间人窃听,由于数据是加密的,他也拿不到明文; **完整性:**指数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收方也能识别出来,从来判定接收报文不合法; **身份认证:** 确认对方的真实身份,即证明"你妈是你妈"的问题,这样就解决了冒充风险,用户不用担心访问的是某宝结果却在和钓鱼网站通信的问题; **不可否认:**即不可否认已发生的行为,比如小明向小红借了1000元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失。 **2.1.3HTTPS通信原理简述** 既然HTTP是明文传输的,那我们给报文加密不就行了,既然要加密,我们肯定需要通信双方协商好密钥吧。一种是通信双方使用同一扣密钥,即对称加密的方式来给报文进行加解密。 有人说对这个密钥再次加密不就完了,但对方如果要解密这个密钥,那还是要传加密密钥给对方,依然还是会被中间人截获的,这么看来直接传输密钥无论怎样都无法摆脱俄罗斯套娃的难题,是不可行的。 直接传输密钥无论从哪一端传从上节分析来看是不行了,这里我们再看另一种加密方式:非对称加密。非对称加密即加解密双方使用不同的密钥,一把作为公钥,可以公开的,把作为私钥,不能公开,公钥加密的密文只有私钥可以解密,私钥签名的内容,也只有公钥可以验签。 这样的话对serve来说,保管好私钥,发布公钥给其他client,其他client只要把对称加密的密钥(或用于生成对称加密密钥的信息)使用公钥加密后传给server即可。如此一来由于公钥加密只有私钥能解密,而私钥只有server有,所以能保证client向server传输是安全的,server解密后即可拿到对称加密密钥,这样交换了密钥之后就可以用对称加密密钥通信了。 但是问题又来了,server怎么把公钥安全地传输给client呢???????? 如果直接传公钥,也会存在被中间人调包的风险,好像没完没了了一样...... **数字证书,解决公钥传输信任问题** 如何解决公钥传输问题呢?从现实生活中的场景找答案。员工入职时,企业一般会要求提供学历证明,这个学历必须由第三方权威成机构(CertificateAuthority证书颁发机构,简称CA)即教育部颁发。同理,server也可以向CA申请证书,在证书中附上公钥,然后将证书传给client。证书是由站点管理者向CA申请,申请的时候会提交域名、组织单位信息和公钥等数据(这些数据组成了Certificate Signing Request证书签名请求简称CSR),CA会根据这些信息生成证书 证书的数字签名怎么来的?是使用的CA机构的私钥给CSR(确切来说是CSR生成的摘要信息)进行的签名,这样的话client得用CA的公钥来给签名解密才行,拿到的才是未经篡改合法的证书(私钥签名,公钥签 **https总结:** server传输CA颁发的证书给client,client收到证书后使用系统内置的CA证书的公钥来验签,验签通过证明证书是受信任的,证书受信任那么证书中的公钥也就是受信任的,这样的话就解决了公钥传输过程中被调包的风险。 Client拿到server端的公钥后,使用公钥加密会话密钥(也就就是对称加密的密钥),然后发送给服务端,服务端通过私钥解密获得会话密钥(对称加密的密钥),然后就可以安全愉快的进行数据传输了 Ps: 1.这里可能有同学会有疑问,为什么client拿到了server给的公钥,不直接使用公钥进行加密通信,反而用公钥加密会话密钥,用会话密钥来加密通信,多此一举,这是因为会话密钥是对称加密,而对称加密的密钥管理简单且具有更高的加密和解密效率。所以https加密是混合模式,在握手阶段是非对称加密, 在数据传输阶段是对称加密 2.还有个问题,中间人如果也去CA申请一个受信任的证书呢,把server发送的证书截取并替换成自己的行不行呢,答案是不行的,因为client除了要验证证书的合法性外,每个证书中包含的域名也是唯一的 ### 2.2nginx配置https证书 由于ssl证书需要向CA组织申购,实验采用自签名证书(也就是自己给自己签名并颁发证书,当然这种证书是不被信任的) #### 2.2.1使用openssl 生成证书和私钥生成证书和私钥 创建证书存储目录 \[root@localhost\]# mkdir -p /etc/nginx/ssl 生成自签名证书 \[root@localhost \^\]# openssl req -x509 -nodes -days 365 -neewkey 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 参数解释: -x509:生成自签名证书(而非CSR)。 -nodes:不加密私钥(无密码保护)。 -days 365:证书有效期1年。 -keyout:私钥文件。 -out:自签名文件。 -newkey rsa:2048:生成2048位的RSA私钥。 -subj:证书主题信息(按需修改字段)。 Ps: CA签名证书: 需要由受信任的第三方证书颁发机构(CA)签发。流程如下: 1.用户生成私钥和CSR(证书签名请求)。 2.将CSR提交给CA(如Let'sEncrypt、DigiCert等)。 3.CA机构验证身份后,用CA的私钥对证书签名,生成最终证书。 自签名证书: 证书的颁发者(Issuer)和主体(Subject)是同一个实体(即自己) 无需第三方CA参与,直接用工具(如0penSSL)生成私钥和证书。 签名时使用自己的私钥,而不是CA的私钥。 适用于测试、内部环境或无需公开信任的场景。 #### 2.2.2 nginx启用https > 编辑nginx配置文件 > > \[root@localhost \^\]#vi /usr/local/nginx/conf/nginx.conf > > server { > > listen 443 ssl; #监听 HTTPS 端口 > > server_namelocalhost; #域名或IP > > #指定证书和私钥路径 > ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; > ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned. key; > > #SSL协议和加密套件配置(可选,提升安全性) > > 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请求重定向到HTTPS > > server { > > listen 80; > > server_name localhost; > > return 301 https://$host$request_uri; > > \[root@localhost\~\]#nginx -t > > \[root@localhost\~\]#nginx -s reload #### 2.2.2通过浏览器验证 访问https://你的服务器ip 浏览器会提示证书不安全(因自签名),选择"高级"--继续前往或信任此证书测试环境可忽略警告)。

相关推荐
真智AI6 小时前
构建安全的机器学习推理API:基于FastAPI的用户认证与管理实战
安全·机器学习·fastapi
胡耀超6 小时前
内网渗透技术全面指南——安全业务视角(基于《内网渗透技术 (吴丽进、苗春雨 主编;郑州、雷珊珊、王伦 副主编)》)
linux·windows·安全·web安全·网络安全·内网渗透·安全治理
群联云防护小杜9 小时前
如何有效防御服务器DDoS攻击
运维·服务器·前端·tcp/ip·安全·ddos
FreeBuf_9 小时前
CVE体系若消亡将如何影响网络安全防御格局
大数据·安全·web安全
凪z13 小时前
【渗透测试】任意文件上传下载漏洞原理、复现方式、防范措施
安全·web安全
独行soc13 小时前
2025年渗透测试面试题总结-网络安全、Web安全、渗透测试笔试总结(一)(附回答)(题目+回答)
linux·运维·服务器·安全·web安全·面试·职场和发展
上海云盾商务经理杨杨13 小时前
2025年游戏行业DDoS攻防指南:智能防御体系构建与实战策略
服务器·安全·游戏·ddos
南玖yy14 小时前
探索 C++ 语言标准演进:从 C++23 到 C++26 的飞跃
开发语言·c++·人工智能·安全·c++23·c++基础语法
奔跑的石头_14 小时前
网络安全的原理和基本知识点
网络·安全