目录
(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,设置域名和 IP 映射关系
(2)修改两台 OpenEuler 的 hosts 文件,设置域名和 IP 映射关系
一、核心安全配置
1、隐藏版本号
在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。在隐藏版本号之前,可以使用 Fiddler 工具抓取数据包,查看 Nginx版本,也可以在 OpenEuler 中使用命令 curl -Ihttp://192.168.10.101/查看
修改配置文件
[root@bogon ~]# vim /usr/local/nginx/conf/nginx.conf
server_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.conf
server {
……
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.conf
location ~* \.(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
浏览器会提示证书不安全(因自签名),选择“高级’”--继续前往或信任此证书(测试环境可忽略警告)。