目录
一:核心安全配置
1:编译安装nginx
(1)安装编译
yum -y install gcc* pcre-devel zlib-devel openssl-devel
(2)创建运行用户,组和日志目录
useradd -M -s /sbin/nologin nginx
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
(3)安装编译
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
——回车——
make
make install
(4)软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
(5)添加nginx系统服务
vim nginx.service
[Unit]
Description=my nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/sbin/nginx
ExecStop=/usr/local/sbin/nginx -s stop
ExecrReload=/usr/local/sbin/nginx -s reload
[Install]
WantedBy=multi-user.target
(6)启动服务
端口被占用的情况下:sudo pkill nginx
或
sudo systemctl stop nginx
重启服务:systemctl restart nginx
2:隐藏版本号
vim /usr/local/nginx/conf/nginx.conf
http{
server_tokens off;
}
nginx -t
nginx -s reload
curl -I 192.168.10.202
3:限制危险请求方法
概念:
在Web应用中,应严格限制或禁用可能对系统安全造成威胁的HTTP请求方法(如PUT
、DELETE
、TRACE
、CONNECT
等),仅开放必要的安全方法(如GET
、POST
)。
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
server{
if ($request_method !~ ^(GET|HEAD|POST)$)
return 444;
}
$request_method
:这是 Nginx 的一个内置变量,表示客户端发起的 HTTP 请求方法(如 GET、POST 等)。
!~
:这是 Nginx 中的"不匹配"运算符,表示后面的正则表达式不匹配时条件成立。
^(GET|HEAD|POST)$
:这是一个正则表达式,表示只匹配以下三种 HTTP 方法:
GET
HEAD
POST
return 444;
:这是 Nginx 特有的响应代码,表示直接关闭连接而不返回任何响应。
验证测试请求:
curl -XPUT-I192.168.10.202
4:请求限制(CC攻击防御)
概念:
通过限制客户端(如IP、用户、设备)的请求频率或并发连接数,防止恶意用户通过高频请求耗尽服务器资源(如CC攻击、DDoS攻击、暴力破解等),保障服务的可用性。
(1)编辑配置文件
http {
limit_req_zone $binary_remote_addr zone=req__limit:10m rate=10r/s;
server{
location / {
limit_req_zone=req__limit brust=20 nodelay;
}
}
}
#limit_req_zone 指令(定义限流区域)
#$binary_remote_addr 基于客户端 IP 地址进行限制(二进制格式存储,更节省空间)
#zone=req_limit:10m req_limit:区域名称 10m:分配 10MB 内存空间(大约可存储 16 万个 IP 的状态)
#rate=10r/s 限制请求速率:
#10r/s:每秒 10 个请求(也支持 r/m 分钟单位,如 30r/m)
#limit_req 指令(应用限流)
#zone=req_limit 指定使用哪个预定义的限流区域
#burst=20 允许突发请求量: 当请求超过 rate 限制时,最多允许 20 个请求排队等待
#nodelay 处理方式:不加此参数:排队中的请求会延迟处理 加此参数:立即处理突发请求,但超过 (rate + burst) 的请求会被拒绝
(2)压力测试验证
安装ab测试工具
dnf -y install httpd_tools
发起测试请求
ab -n 300 -c 30 http://192.168.10.202/
查看access.log发现大量请求日志状态码503
tail -300 /usr/local/nginx/logs/access.log | grep -c 503
5:防盗链
概念:
防盗链是一种技术手段,用于防止其他网站直接盗用自己服务器上的资源(如图片、视频、文件等),从而节省带宽、保护版权或维护内容独特性。
资源清单:
操作系统 | 域名 | IP | 服务 |
OpenEuler | www.aaa.com | 192.168.10.202 | 源主机 |
OpenEuler | www.bbb.com | 192.168.10.201 | 盗链主机 |
编辑原网站首页文件:
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
# 或重写为警告图片:rewrite ^ /anti-hotlink.jpg;
}
}
二:高级防护
1:动态黑名单
概念:
动态黑名单是一种实时更新的禁止访问列表,用于识别并拦截恶意或不合规的实体(如IP地址、用户账号、设备等)。与静态黑名单不同,动态黑名单会根据实时行为分析、威胁情报或预设规则自动调整内容,以应对不断变化的威胁环境。
(1)编辑黑名单配置文件
# 封禁IP段
192.168.1.0/24 1;
# 封禁单个IP
192.168.10.201 1;
#IP地址后的数字含义:
#0 “”; 允许
#1 403; 完全封禁
#2 444; 静默断开
#3 503; 服务不可用
(2)编辑主配置文件
http {
geo $block_ip {
default 0;
include /usr/local/nginx/conf/blockips.conf;
}
server {
if ($block_ip) {
return 403;
}
}
}
nginx -t
nginx -s reload
(3)使用封禁IP测试访问
curl 192.168.10.202
2:nginx https配置
(1)https概念
HTTPS(超文本传输安全协议)是一种通过计算机网络进行安全通信的传输协议。它在 HTTP 的基础上,通过传输加密和身份认证来确保网络数据传输的安全性。HTTPS 利用 SSL/TLS协议,对数据进行加密处理,防止数据在传输过程中被窃取、篡改,同时使用数字证书验证网站服务器的身份,避免用户访问到恶意伪造的网站,从而保障了用户与服务器之间通信的机密性、完整性和可靠性。
(2)HTTP为什么不安全
HTTP由于是明文传输,主要存在三大风险:窃听风险,篡改风险,冒充风险。
(3)安全通信的四大原则
- 机密性(Confidentiality)
- 完整性(Integrity)
- 可用性(Availability)
- 真实性(Authenticity)
(4)HTTPS通信原理简述
- 客户端发起连接:客户端向服务器发送 Client Hello 消息,其中包含客户端支持的 SSL/TLS 版本、加密算法套件、随机数等信息。
- 服务器响应:服务器收到请求后,发送 Server Hello 消息,确定使用的 SSL/TLS 版本、加密算法等,并将服务器的数字证书发送给客户端,证书中包含服务器的公钥等信息。
- 客户端验证证书:客户端验证服务器证书的合法性,如证书是否由受信任的证书颁发机构颁发、是否在有效期内、证书中的域名与访问的域名是否一致等。验证通过后,从证书中提取服务器公钥。
- 生成会话密钥:客户端生成一个随机的预主密钥,用服务器公钥加密后发送给服务器。
- 服务器解密密钥:服务器用自己的私钥解密收到的加密数据,得到预主密钥。然后双方根据预主密钥和之前的随机数,生成用于后续数据加密的会话密钥。
3:nginx 配置https证书
(1)使用openssl生成证书和私钥生成证书和私钥
#创建证书存储目录
mkdir -p /etc/nginx/ssl
#生成自签名证书
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"
(2)nginx启用https
编辑nginx配置文件
server {
listen 443 ssl;
server_name example.com; # 替换为你的域名
ssl_certificate /path/to/server.crt; # 证书文件路径
ssl_certificate_key /path/to/server.key; # 私钥文件路径
ssl_protocols TLSv1.2 TLSv1.3; # 设置支持的 TLS 协议版本
ssl_ciphers HIGH:!aNULL:!MD5; # 设置加密套件
location / {
root /var/www/html; # 网站根目录
index index.html index.htm;
}
}
(3)通过浏览器验证
在浏览器地址栏中输入 https://example.com
(替换为实际配置的域名),如果配置正确,浏览器会显示连接安全的提示,地址栏中会出现锁形图标。同时,浏览器可能会对自签名证书显示警告(因为不是由受信任的 CA 颁发),如果是正式的证书则不会有此类警告。可以点击锁形图标查看证书的详细信息,确认证书的有效性和相关信息是否正确。