nginx安全防护与HTTPS部署实战

一、核心安全配置

1. 编译安装nginx

编译安装nginx可以自定义模块和优化性能。标准步骤见:nginx核心功能(https://blog.csdn.net/2601_94969852/article/details/158970288?fromshare=blogdetail&sharetype=blogdetail&sharerId=158970288&sharerefer=PC&sharesource=2601_94969852&sharefrom=from_link)

2. 隐藏版本号

隐藏版本号可减少信息泄露风险

(1) 查看nginx版本号:

使用命令:

bash 复制代码
curl -I http://localhost

在响应头中查找 Server: nginx/版本号

(2) 修改配置文件 : 验证:再次运行 curl -I http://localhost,应看不到版本号。

编辑nginx主配置文件(通常为 /usr/local/nginx/conf/nginx.conf)

在 http 块中添加:

nginx 复制代码
server_tokens off;

重载配置:

bash 复制代码
/usr/local/nginx/sbin/nginx -s reload

3. 限制危险请求方法

限制HTTP方法可防止恶意请求

(1) HTTP常用方法:

常见方法包括:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE。危险方法如PUT、DELETE可能被滥用

(2) GET和POST区别:

GET:用于获取数据,参数在URL中可见,长度有限,可缓存

POST:用于提交数据,参数在请求体中,更安全,长度无限制,不可缓存

(3) 修改配置和验证:

编辑nginx配置文件,在 server 块中添加:

nginx 复制代码
if ($request_method !~ ^(GET|POST)$) {
    return 405;
}

这会限制只允许GET和POST,其他方法返回405错误

重载配置后,测试:

bash 复制代码
curl -X PUT http://localhost

应返回 405 Method Not Allowed

4. 请求限制

使用模块限制请求速率,防止DDoS攻击

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

在 http 块中定义共享内存区:

nginx 复制代码
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

zone=mylimit:10m:定义10MB共享区

rate=10r/s:限制每秒10个请求

在 server 或 location 块中应用:

nginx 复制代码
location / {
    limit_req zone=mylimit burst=20;
    # 其他配置
}

burst=20 允许突发20个请求

重载配置生效

(2) 压力测试验证:

使用工具如 ab(Apache Bench)测试:

bash 复制代码
ab -n 1000 -c 100 http://localhost/

观察输出,如果请求被拒绝或延迟,则限制生效。日志中可能显示 503 Service Unavailable

5. 防盗链配置验证

防盗链阻止外部网站盗用资源

配置:

编辑nginx配置文件,在 location 块中添加:

nginx 复制代码
location ~ .*\.(gif|jpg|jpeg|png)$ {
    valid_referers none blocked server_names ~\.example\.com;
    if ($invalid_referer) {
        return 403;
    }
}

valid_referers:指定允许的引用来源(如 example.com)

非法引用时返回403

验证:

访问图片URL,如果从非法站点访问,应返回403。测试:

bash 复制代码
curl -I http://localhost/image.jpg -H "Referer: http://bad.com"

应返回 403 Forbidden

二、高级防护

1. 动态黑名单

动态黑名单可实时拦截恶意IP

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

创建文件 /usr/local/nginx/conf/blacklist.conf,内容为IP列表:

nginx 复制代码
deny 192.168.1.100;
deny 10.0.0.50;

每行一个 deny 指令

(2) 编辑主配置文件:

在nginx主配置的 http 块中引入黑名单:

nginx 复制代码
include blacklist.conf;

在 server 块中应用:

nginx 复制代码
location / {
    # 其他配置
}

黑名单自动生效

(3) 测试:

从黑名单IP访问:

bash 复制代码
curl http://localhost

应返回 403 Forbidden。非黑名单IP正常访问

2. nginx https配置

HTTPS提供加密通信

(1) https概念:

HTTPS是HTTP的安全版本,使用SSL/TLS协议加密数据,确保传输安全

(2) 安全通信四大原则:

机密性:数据加密,防止窃听

完整性:确保数据不被篡改,使用哈希算法如SHA-256

身份验证:验证服务器身份,防止中间人攻击

不可否认性:通过数字签名,确保行为可追溯

(3) HTTPS通信原理:

基于SSL/TLS协议,过程包括:

握手阶段:客户端和服务器交换密钥,验证证书

密钥交换:使用非对称加密(如RSA)建立会话密钥

数据传输:使用对称加密(如AES)加密数据。 数学基础涉及离散对数问题: \\text{例如,Diffie-Hellman密钥交换:} g\^{a} \\mod p \\text{ 和 } g\^{b} \\mod p \\text{ 交换后生成共享密钥 } g\^{ab} \\mod p

3. nginx配置https证书

获取证书:使用Let's Encrypt免费证书:

bash 复制代码
sudo apt install certbot
certbot certonly --standalone -d example.com

证书保存在 /etc/letsencrypt/live/example.com/

配置nginx:

编辑配置文件,在 server 块中添加:

nginx 复制代码
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    # 其他配置
}

4. nginx启用https

重定向HTTP到HTTPS:

添加一个新 server 块:

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

重载配置:

bash 复制代码
/usr/local/nginx/sbin/nginx -s reload

5. 验证

测试HTTPS:

bash 复制代码
curl -I https://example.com

应返回200 OK,并查看证书信息:

bash 复制代码
openssl s_client -connect example.com:443

输出中显示SSL/TLS握手成功

浏览器验证 :访问 https://example.com,地址栏显示锁图标

相关推荐
还是大剑师兰特5 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
龙亘川5 天前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
kybs19916 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
xing-xing6 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
LorryJovens6 天前
【LAAP科研】双系统具身AGI范式研究——基于LAAP认知架构与Jev概率决策模型的系统性技术调研与范式验证
人工智能·gpt·安全·架构
其实防守也摸鱼6 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
山东科恩光电6 天前
提升安全性的关键技术:安全触边在工业自动化中的应用解析
安全
2501_916007476 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
Lsetea6 天前
证书没到期却报certificate has expired:OpenSSL定位中间证书与系统时间
运维·https·ssl证书·openssl·证书链