一:核心安全配置
1.编译安装Nginx
(1)安装支持软件
[root@localhost ~]# dnf instally gcc make pcre-devel zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
(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-l.26.3.tar.gz
[root@localhost~ ]# cd nginx-l.26.3
[root@localhost nginx-l.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 \ #状态统计模块--withhttp gzip static module\
--with-pcre\
--with-stream
[root@localhost nginx-l.26.3]# make && make install
为主程序 nginx 创建链接文件
[root@localhost nginx-l.26.3]# In -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
(4)添加Nginx系统服务
[root@localhost ~]# vi /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy serverAfter=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/ki11-S QUIT $MAINPID
TimeoutStopSec=5
KillMode=processPrivateTmp=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 主配置文件(通常为
/etc/nginx/nginx.conf
或/usr/local/nginx/conf/nginx.conf
):sudo vi /etc/nginx/nginx.conf
- 在
http
块或server
块中添加:server_tokens off; # 关闭版本号显示
- 验证:访问
http://你的域名
,查看响应头(如通过浏览器开发者工具或curl -I http://你的域名
),Server
字段会显示为nginx
而非nginx/1.23.4
。
3.限制危险请求方法
作用
禁用 Web 服务器中不必要的 HTTP 请求方法(如 PUT
、DELETE
、OPTIONS
等),防止恶意文件上传或资源删除。
配置方法
- 在
server
或location
块中添加以下规则,禁止危险方法:location / { # 允许的方法(按需调整,通常保留 GET、HEAD、POST) if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; # 返回 Method Not Allowed 状态码 } # 额外:限制 OPTIONS 方法(用于跨域预检),按需保留 if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header Access-Control-Max-Age 1728000; add_header Content-Type 'text/plain; charset=utf-8'; add_header Content-Length 0; return 204; # 允许 OPTIONS,但返回空内容 } }
- 重启 Nginx 使配置生效:
sudo nginx -s reload
4.请求限制(CC攻击防御)
CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx 中有效防止 CC 攻击,可以采用多种策略和方法。
CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数
(1)使用Nginx的limit_rep模块限制请求速率
编辑配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx. conf
http {
#定义限制区(10MB 内存/每秒 10 请求)
limit_req_zone $binary_remote_addr zone=reg limit:l0m rate=10r/s,
#其他全局配置...
server i
location /{
root html;index index.html index. php;
limit reg zone=reg 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=reg limit 绑定到预定义的共享内存区
- burst=20 类似与等候区,超出并发数的请求会到等候区,等候区占满后,多余的请求会立刻返回 503
- nodelay 立即处理突发请求而不延迟,相当于立即处理等候区的请求,多余的请求会立刻返回 503
(2)压力测试验证
安装 ab 测试工具
ApacheBench(简称 ab)是 Apache HTTP 服务器自带的一个轻量级、易用的HTTP 服务器性能测试工具。它主要用于评估服务器在并发访问下的性能表现,包括响应时间、吞吐量等关键指标。
[root@localhost~]#dnf install httpd-tools -y
5.防盗链
防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。
一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中还有图片,那么客户端的浏览器会再次发送一条HTTP请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示。基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了其他网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
资源清单
本实验需要两台主机
操作系统 | 域名 | IP | 服务 |
opereuler | www.aaa.com | 192.168.10.202 | 源主机 |
opereuler | www.bbb.com | 192.168.10.101 | 盗链主机 |
(1)修改 Windows 的C:\Windows\System32\drivers\etc\hosts 文件,设置域名和 IP 映射关系
192.168.10.202 www. aaa. com
192.168.10.201 www. bbb.com
(2)修改两台 Cent0s 的 hosts 文件,设置域名和 IP 映射关系。
192.168.10.202 www. aaa.com
192.168.10.201 www.bbb. com
(3)把图片 logo.jpg 放到源主机(www.aaa.com)的工作目录下
[root@localhost ~]#ls /usr/local/nginx/htm1
(4)编辑原网站首页文件
[root@localhost~]#vim /usr/local/nginx/html/index.html
<html>
<body>
<hl>aaa It work!
<img src="kgc.png"/> //网页中显示图片的代码
</h1>
</body>
</html>
(5)测试访问源网站
(6)编辑盗链网站首页文件
[root@localhost~]#vim /usr/local/nginx/html/index.html
<html>
<body>
<hl>bbb It work!
<img src="http://www.aaa.com/kgc.png”/> //网页中显示图片
</h1>
</body>
</html>
(7)测试访问盗链网站(盗链成功)
(8)配置 Nginx 防盗链
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
location~ *\.(gif jpgljpeg pnglbmplswf|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 页面。
(8)测试访问盗链网站(盗链失败 403)
二:高级防护
1.动态黑名单
动态黑名单是 Nginx中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的 IP地址或网段。相比静态配置的 allow/deny指令,动态黑名单更灵活高效,适用于高并发、多变的攻击防护场景。
(1)编辑黑名单配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/blockips.conf
192.168.1.0/24 1;#封禁整个网段
192.168.10.201 1;#封禁 ip
IP 地址后的数字含义:
0 ""; # 允许
1 403; # 完全封禁
2 444; #静默断开
3 503; #服务不可用
(2)编辑主配置文件
在 Nginx 的主配置文件(通常是 nginx.conf
或者在 sites - available
目录下的站点配置文件)里引入黑名单配置文件,示例如下:
server {
listen 80;
server_name example.com;
# 引入黑名单配置文件
include /path/to/blacklist.conf;
location / {
# 其他配置
root /var/www/html;
index index.html;
}
}
(3)使用封禁IP测试访问
配置完成后,重新加载 Nginx 配置:
sudo nginx -s reload
使用被封禁的 IP 地址尝试访问网站,若看到 “403 Forbidden” 页面,就表明封禁配置生效了。
(4)自动添加黑名单
可以借助脚本实现自动添加 IP 到黑名单。以下是一个简单的 Python 脚本示例,它会将访问失败次数过多的 IP 添加到黑名单:
import subprocess
# 假设这里有一个函数可以获取需要封禁的IP列表
def get_ips_to_block():
# 这里可以实现获取IP列表的逻辑,例如从日志文件中统计
return ['192.168.1.102', '192.168.1.103']
ips = get_ips_to_block()
for ip in ips:
# 将IP添加到黑名单配置文件
with open('blacklist.conf', 'a') as f:
f.write(f'deny {ip};\n')
# 重新加载Nginx配置
subprocess.run(['sudo', 'nginx', '-s', 'reload'])
2.nginx https 配置
(1)https 概念
1-HTTP为什么不安全
HTTP 是明文传输协议,数据在传输过程中容易被窃听、篡改和伪造。例如,攻击者可以在网络中截获 HTTP 请求和响应,获取用户的敏感信息,像用户名、密码、信用卡号等。
2-安全通信的四大原则
- 机密性:确保数据在传输过程中不被第三方获取,通常采用加密算法对数据进行加密。
- 完整性:保证数据在传输过程中不被篡改,接收方可以验证数据是否与发送方发送时一致。
- 身份验证:确认通信双方的身份,防止中间人攻击。
- 不可否认性:确保发送方不能否认发送过的消息。
3-HTTPS通信原理简述
HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 协议,其通信过程如下:
- 客户端发起请求:客户端向服务器发送 HTTP 请求,同时携带客户端支持的 SSL/TLS 版本和加密算法列表。
- 服务器响应:服务器选择一个 SSL/TLS 版本和加密算法,并返回证书和会话密钥。
- 客户端验证证书:客户端验证服务器证书的有效性,若证书有效,生成会话密钥。
- 密钥交换:客户端和服务器使用会话密钥进行加密通信。
(2)nginx 配置https证书
1-使用openssl生成证书和私钥生成证书和私钥
可以使用以下命令生成自签名的 SSL 证书和私钥:
# 生成私钥
sudo openssl genrsa -out /etc/ssl/private/nginx-selfsigned.key 2048
# 生成证书签名请求(CSR)
sudo openssl req -new -key /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.csr
# 生成自签名证书
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/nginx-selfsigned.csr -signkey /etc/ssl/private
2-nginx 启用https
在 Nginx 主配置文件中添加 HTTPS 配置,示例如下:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
location / {
root /var/www/html;
index index.html;
}
}
# 将HTTP请求重定向到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
配置完成后,重新加载 Nginx 配置:
sudo nginx -s reload
3-通过浏览器验证
这样,Nginx 就开启了 HTTPS 服务。需要注意的是,自签名证书在浏览器中会显示不安全提示,若要在生产环境使用,建议从权威的证书颁发机构(CA)获取 SSL 证书