Nginx安全防护与HTTPS部署实战

目录

一:核心安全配置

1:编译安装nginx

(1)安装编译

(2)创建运行用户,组和日志目录

(3)安装编译

(4)软链接

(5)添加nginx系统服务

(6)启动服务

2:隐藏版本号

3:限制危险请求方法

4:请求限制(CC攻击防御)

(1)编辑配置文件

(2)压力测试验证

5:防盗链

二:高级防护

1:动态黑名单

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

(2)编辑主配置文件

(3)使用封禁IP测试访问

2:nginx https配置

(1)https概念

(2)HTTP为什么不安全

(3)安全通信的四大原则

(4)HTTPS通信原理简述

3:nginx 配置https证书

(1)使用openssl生成证书和私钥生成证书和私钥

(2)nginx启用https

(3)通过浏览器验证


一:核心安全配置

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请求方法(如PUTDELETETRACECONNECT等),仅开放必要的安全方法(如GETPOST)。

修改配置文件:

vim /usr/local/nginx/conf/nginx.conf
server{
	if ($request_method !~ ^(GET|HEAD|POST)$)
		return 444;
}
  1. $request_method:这是 Nginx 的一个内置变量,表示客户端发起的 HTTP 请求方法(如 GET、POST 等)。

  2. !~:这是 Nginx 中的"不匹配"运算符,表示后面的正则表达式不匹配时条件成立。

  3. ^(GET|HEAD|POST)$:这是一个正则表达式,表示只匹配以下三种 HTTP 方法:

    • GET

    • HEAD

    • POST

  4. 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服务
OpenEulerwww.aaa.com192.168.10.202源主机
OpenEulerwww.bbb.com192.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)安全通信的四大原则

  1. 机密性(Confidentiality)
  2. 完整性(Integrity)
  3. 可用性(Availability)
  4. 真实性(Authenticity)

(4)HTTPS通信原理简述

  1. 客户端发起连接:客户端向服务器发送 Client Hello 消息,其中包含客户端支持的 SSL/TLS 版本、加密算法套件、随机数等信息。
  2. 服务器响应:服务器收到请求后,发送 Server Hello 消息,确定使用的 SSL/TLS 版本、加密算法等,并将服务器的数字证书发送给客户端,证书中包含服务器的公钥等信息。
  3. 客户端验证证书:客户端验证服务器证书的合法性,如证书是否由受信任的证书颁发机构颁发、是否在有效期内、证书中的域名与访问的域名是否一致等。验证通过后,从证书中提取服务器公钥。
  4. 生成会话密钥:客户端生成一个随机的预主密钥,用服务器公钥加密后发送给服务器。
  5. 服务器解密密钥:服务器用自己的私钥解密收到的加密数据,得到预主密钥。然后双方根据预主密钥和之前的随机数,生成用于后续数据加密的会话密钥。

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 颁发),如果是正式的证书则不会有此类警告。可以点击锁形图标查看证书的详细信息,确认证书的有效性和相关信息是否正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值