目录
一:隐藏版本号
在生产环境中,需要隐藏 Nginx 的版本号,以避免泄漏 Nginx 的版本,使攻击者不能针对特定版本进行攻击。
1,修改配置文件
[root@localhost ~]# curl -I 192.168.10.102
HTTP/1.1 200 OK
Server: nginx/1.26.3 ##查看nginx的版本号为1.26.3
...... //省略部分内容
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ##修改nginx的配置文件
http {
include mime.types;
default_type application/octet-stream;
server_tokens off; ##添加此行内容
1,验证
[root@localhost ~]# nginx -t ##验证配置文件是否有错
[root@localhost ~]# nginx -s reload ##重载nginx
[root@localhost html]# curl -I 192.168.10.102 ##进行测试
HTTP/1.1 200 OK
Server: nginx
.....//省略部分内容
二,限制危险请求方法
不安全的请求方式,是潜在的安全风险,TRACE(易引发XST攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非白名单方法返回 444(无响应关闭连接)
Nginx 作为 Web 服务器和反向代理服务器,支持处理多种 HTTP 请求方法:
- GET - 请求获取资源
- POST - 提交数据到服务器
- PUT - 上传或替换资源
- DELETE - 删除资源
- HEAD - 类似 GET 但只返回头部
- OPTIONS - 查询服务器支持的请求方法
- PATCH - 对资源进行部分修改
- TRACE - 回显服务器收到的请求(用于测试)
1,修改配置文件
server {
listen 80;
server_name localhost;
if ($request_method !~ ^(GET|HEAD|POST)$ ) { ##在server中添加部分内容
return 444;
}
$request_method ##Nginx 内置变量,表示客户端发起的 HTTP 请求方法(如 GET、POST 等)
! ##表示取反
~ ##表示不区分大小写
^ ##表示匹配开头
return 444 ##不匹配(GET|HEAD|POST)则输出444状态码
2,进行验证
[root@localhost ~]# nginx -s reload ##验证之前先重载nginx服务
[root@localhost html]# curl -XPUT -I 192.168.10.102 ##在101客户金进行验证
curl: (52) Empty reply from server
[root@localhost ~]# cat /usr/local/nginx/logs/access.log ##在nginx服务器查看日志文件
192.168.10.101 - - [29/Apr/2025:09:06:23 +0800] "PUT / HTTP/1.1" 444 0 "-" "curl/8.4.0"
三,请求限制(CC攻击防御)
CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx 中有效防止 CC 攻击,可以采用多种策略和方法。CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数。
1,通过nginx的模块限制请求速率
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; ##在http部分添加此行
server {
listen 80;
server_name localhost;
limit_req zone=req_limit burst=20 nodelay; ##在server部分添加此行
}
limit_req_zone ##定义共享内存区
$binary_remote_addr ##是一个内置变量,用于表示客户端 IP 地址的二进制格式
zone=req_limit:10m ##创建名为 req limit 的共享内存区,大小 10M,用来存储客户端的IP
rate=10r/s ##限制并发数,每个 IP 每秒可以发起的请求次数
1imit req ##实施速率限制
zone=req_limit ##绑定到预定义的共享内存区
burst=20 ##类似与等候区,超出并发数的请求会到等候区,等候区占满后,多余的请求会立刻返回 503
nodelay ##立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回 503
2,进行测试
##在101客户机进程测试
[root@localhost /]# dnf -y install httpd-tools ##测试前先安装此工具
[root@localhost /]# ab -n 300 -c 30 http://192.168.10.102/
-n 300 ##发起300个请求
-c 30 ##发起30个连接
##在nignx服务端进行查看
[root@localhost conf]# cat /usr/local/nginx/logs/access.log | grep 503 | wc -l
279
##因为我们在nginx的配置文件中设置了burst=20等候区为20
四,防盗链
防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。
1,防盗链如何使用
- 准备两台centos的服务器
IP地址 | 域名 | 服务 |
192.168.10.102 | www.aaa.com | 源主机 |
192.168.10.101 | www.bbb.com | 盗链主机 |
- 准备win10客户机
修改win10的hosts文件
192.168.10.102 www.aaa.com
192.168.10.101 www.bbb.com
##在101,102分别添加
[root@localhost src]# vim /etc/hosts
192.168.10.102 www.aaa.com
192.168.10.101 www.bbb.com
##在102nignx服务器进行配置
[root@localhost html]# ls ##准备好后缀为jpg的图片
111.jpg 50x.html index.html
[root@localhost src]# vim /usr/local/nginx/html/index.html ##编辑nginx的网页文件
<html>
<body>
<h1>111 It work!
<img src="111.png"/>
</h1>
</body>
</html>
##在101进行操作
[root@localhost html]# dnf -y install httpd
[root@localhost html]# vim /var/www/html/index.
<html>
<body>
<h1> wo shi dao tu zhe
<img src="http://www.aaa.com/kgc.png"/>
</h1>
</body>
</html>
分别测试102和101
2,如何避免防盗链
##在nginx的服务器配置文件进行添加 添加到server块中
location ~* \.(gif|jpg|jpeg|png)$ {
root html;
valid_referers aaa.cpm *.aaa.com;
if ($invalid_referer) {
return 403;
}
}
~* \.(gif|jpg|jpeg|png)$ ##表示正则表达式匹配不区分大小写,以gif jpg jpeg png结尾的文件
valid_referers ##设置信任的网站,可以正常使用图片
aaa.cpm *.aaa.com; ##后面的网站或者域名:包含相关字符串的网址
if语句:如果链接的来源域名不在valid_referers列出的表中,$invalid_referer为1,则执行后面的操作,返回403错误码
验证
五,高级防护
1,动态黑名单
动态黑名单是 Nginx中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的 IP地址或网段。相比静态配置的 allow/deny指令,动态黑名单更灵活高效,适用于高并发、多变的攻击防护场景。
[root@localhost conf]# vim blockips.conf
192.168.1.0/24 1; ##封禁整个网段
192.168.10.101 1; ##封禁单个IP
0 ""; #允许
1 403; #完全封禁
2 444; #静默断开
3 503; #服务不可用
[root@localhost conf]# 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内置模块指令,专门用于处理P地址相关的逻辑。基于客户端IP 地址生成一个变量值,用于后续的访问控制判断,
$block ip ##自定义的变量名,存储计算结果(通常为0或1)
default 0 ##默认值,表示不在黑名单中的 IP 允许访问
if($block ip) ##当变量值为1时触发封禁逻辑
使用被禁止访问的主机101进行访问
[root@localhost html]# curl 192.168.10.102
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.3</center>
</body>
</html>
2,自动添加黑名单
##自动添加到黑名单的命令
[root@localhost conf]# 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
[root@localhost conf]# cat /usr/local/nginx/conf/blockips.conf ##查看黑名单的文件
192.168.10.101 1;
[root@localhost conf]# vi /aaa.sh ##将自动添加黑名单的命令添加到aaa.sh脚本中
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
[root@localhost conf]# chmod +x /aaa.sh ##授予可执行的权限
##使用本机进行访问
[root@localhost conf]# for i in $(seq 101);do curl 192.168.10.102;done
##使用aaa.sh脚本
[root@localhost conf]# bash /aaa.sh
##发现102也被加了进去
[root@localhost conf]# cat /usr/local/nginx/conf/blockips.conf
192.168.10.101 1;
192.168.10.102 1;
六:nginx https的作用及配置
HTTP为什么不安全
- 窃听风险:中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险
- 篡改风险:中间人可以篡改报文内容后再发送给对方,风险极大。
- 冒充风险:比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信。
安全通信的四大原则
- 机密性:即对数据加密,解决了窃听风险,因为即使被中间人窃听,由于数据是加密的,他也拿不到明文;
- 完整性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收方也能识别出来,从来判定接收报文不合法;
- 身份认证:确认对方的真实身份,用户不用担心访问的是某宝结果却在和钓鱼网站通信的问题;不可否认:即
- 不可否认:已发生的行为,比如小明向小红借了1000元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失。
HTTPS的几种加密方式
HTTP 是明文传输的,那我们给报文加密,既然要加密,我们肯定需要通信双方协商好密钥吧。一种是通信双方使用同一把密钥,即对称加密的方式来给报文进行加解密。
非对称加密:使用一对密钥,即公钥和私钥。公钥可以公开,任何人都可以使用公钥对数据进行加密;私钥由所有者保密,只有使用对应的私钥才能对加密数据进行解密。
数字证书:数字证书是一种由证书颁发机构(CA)签发的电子文件,它将用户的身份信息(如姓名、组织、域名等)与公钥进行绑定。其主要作用是验证公钥的真实性和持有者的身份,防止中间人攻击,确保通信双方能够安全地交换信息。
1,在nginx https的作用
- 加密传输数据:HTTPS 使用 SSL/TLS 协议对数据进行加密,确保数据在客户端(如浏览器)和服务器(如 Nginx 服务器)之间传输时不被窃取或篡改。例如,用户在电商网站上输入的用户名、密码、信用卡信息等敏感数据,通过 HTTPS 加密后,即使数据在传输过程中被拦截,攻击者也无法获取其真实内容。
- 验证服务器身份:HTTPS 通过数字证书来验证服务器的身份,确保客户端连接到的是真实可靠的服务器,而不是假冒的服务器。用户访问银行网站时,浏览器会验证银行服务器的数字证书,如果证书有效且与银行域名匹配,用户就可以确认自己连接到了正确的银行服务器,防止遭受钓鱼攻击。
- 数据完整性保护:HTTPS 使用消息认证码(MAC)等技术来确保数据在传输过程中的完整性,防止数据被意外或恶意篡改。如果数据在传输过程中被篡改,接收方可以通过验证 MAC 发现数据的变化,从而拒绝接受被篡改的数据。
2,在nginx上配置https
[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=MyOrg/CN=localhost"
server {
listen 443 ssl; ##修改监听的端口号
ssl_certificate /etc/nginx/ssl/nginx.crt; ##指定证书和私钥路径
ssl_certificate_key /etc/nginx/ssl/nginx.key;
server { ##启用配置文件最下面的server
listen 80;
# listen somename:8080;
# server_name somename alias another.alias;
return 301 https://$host$request_uri; ##添加此行
-x509 ##生成自签名证书(而非 CSR)
-nodes ##不加密私钥(无密码保护)
-days 365 ##证书有效期1年。
-newkey ##rsa:2048:生成2048 位的 RSA 私钥。
-subj ##证书主题信息(按需修改字段)
验证:选择高级——接收风险并继续 即可访问到