nginx安全防护与https部署全过程

 更新时间:2025年05月06日 16:28:44   作者:阿萨德791  
这篇文章主要介绍了nginx安全防护与https部署全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

核心安全配置

编制安装nginx

安装支持软件

[root@localhost ^]# dnf install -y gcc make pcre-deve1 zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar

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

[root@localhost~]# useradd -M -s /sbin/nologin nginx
[root@localhost~]# mkdir-p/var/log/nginx
[root@localhost~]# chown -R nginx:nginx /var/log/nginx

编译安装

[root@localhost ^]# tar zxf nginx-1.26.3.tar.gz
[root@localhost ^]# cd nginx-1.26.3
[root@localhost nginx-1.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\
--with-http_gzip_static_module \
--with-pcre\
--with-stream

[root@localhost nginx-1.26.3]# make & make install

为主程序 nginx创建链接文件

[root@localhost nginx-1.26.3]# In -s /usr/local/nginx/sbin/nginx/usr/local/sbin/

添加nginx系统服务

[root@localhost ^]# vi /lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=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/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Instal1]
WantedBy=multi-user.target

[root@localhost^]# systemctl daemon-reload
[root@localhost~]# systemctl start nginx
[root@localhost^]# systemctl enable nginx

隐藏版本号

在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx白的版本,使攻击者不能针对特定版本进行攻击。

[root@localhost ~]# curl -I 192.168.10.101
HTTP/1.1 200 OK
Server: nginx/1.26.3

修改配置文件

[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf

http {
include mime.types;
default_type application/octet-stream;
server_tokens off;

.......

[root@localhost^]#nginx -t
[root@localhost~]#nginx -s reload
[root@localhost~]# curl -I 192.168.10.101

HTTP/1.1 200 OK
Server: nginx

限制危险请求方法

不安全的请求方式,是潜在的安全风险,TRACE(易引发XST攻击)、PUT/DELETE(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非白名单方法返回444(无响应关闭连接)

修改配置文件

[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf

server {
($request_method !~ (GET|HEAD|POST)$) {
return 444;

}
}

验证

[root@localhost ^]# curl -XPUT -I 192.168.10.10]
curl: (52) Empty reply from server

请求限制(cc攻击防御)

CC攻击(Challenge Collapsar攻击)是一种常见的网络J攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无去访问网站。要在Nginx中有效防止CC攻击,可以采用多种策略和方法

CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用Nginx提供的模块来限制请求速率和并发连接数

使用nginx的limit_req模块限制请求速率

[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf

http {
limit_req_zone_$binary_remote_addr_zone=req_limit:10m rate=10r/s;
server {
location / {
root html;
index index.html index.php;
limit_req zone=req_limit burst=20 nodelay;

}
}
}

压力测试验证

安装ab测试工具

[root@localhost ^]# dnf install httpd-tools -y

[root@localhost~]# ab -n 300 -c 30 http://192.168.10.101/

[root@localhost ^]# tail -300 /usr/local/nginx/logs/access. log | grep -c
503
279
  • -n 300:表示总请求数为300次,即模拟客户端向服务器发送300 次HTTP请求
  • -c 30:表示并发用户数为30,即同时有30个请求并行发送到服务器。

防盗链

防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。

修改 Windows 的 C:\Windows\System32 drivers\etc\hossts文件,设置域名和IP映射关系

192.168.10.101 www.aaa.com

192.168.10.102 www.bbb.com

修改两台OpenEuler的hosts文件,设置域名和IP映射关系。

192.168.10.101 www.aaa.com

192.168.10.102www.bbb.com

把图片kgc.png放到源主机(www.aaa.com的工作目录下

[root@localhost ^]# ls /usr/local/nginx/html
Index. html kgc.png

编辑原网站首页文件

[root@localhost ^]# vi /usr/local/nginx/html/index.html

<html>
<body>
<h1>aaa It work!</h1>
<img src="kgc.png"/>

<body>

</html>

使用浏览器访问进行验证即可

编辑盗链网站首页文件

[root@localhost ^]# dnf -y install httpd
[root@localhost~]# vi /usr/local/nginx/html/index.html

<html
<body>
<h1>bbb It work! </hl>
<img src="http://www.aaa.com/kgc.png
</body>
</html>

[root@localhost~]# systemctl stop firewalld
[root@localhost`]# systemctl start httpd

测试访问盗链网站(使用浏览器)

配置Nginx防盗链

[root@localhost ^]# vi /usr/local/nginx/conf/nginx.conf
location ^* \. (gif|jpg|jpeg|png|bmp|swf|flv|mp4|webp|ico)s{
root html;
valid_referers aaa.com *.aaa.com;
if($invalid referer){
return 403;

}

}

[root@localhost^]#nginx -t
[root@localhost~]#nginx -s reload

测试访问盗链网站(盗链失败403)

高级防护

动态黑名单

动态黑名单是Nginx中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的IP地址或网段。

相比静态配置的allow/deny指令,动态黑名单更灵活高效,适用于高并发、多变的攻击击防护场景。

编辑黑名单配置文件

[root@localhost ^]# vi /usr/local/nginx/conf/blockips.conf

192.168.1.0/24 1;
192.168.10.102 1;

编辑主配置文件

[root@localhost^]# vi /usr/local/nginx/conf/nginx.conf

http {
geo $block_ip {
default 0;
finclude /usr/local/nginx/conf/blockips.conf;

}

server
if
($block_ip) {
return 403;

}

}

}
[root@localhost^]# nginx -t
[root@localhost~]# nginx -s reload

使用封禁ip测试访问

[root@localhost ~]# curl 192.168.10.101

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

自动添加黑名单

#!/bin/bash
#自动封禁访问超过100次的IP
awk '{print$1}'/var/log/nginx/access.log|sort|uniq -cəssort -nr | awk'{if($1>100) print $2"1;"}' >/usr/local/nginx/conf/bllockips.conf
  • uniq-c:统计连续出现的次数,并在行首显示次数
  • sort-nr:按数值排序

nginx https配置

https概念

众所周知,http(超文本传输协议)是客户端浏览器与web服务器之间的通信协议,而https协议可以认为是HTTP+SSL/TLS,在http之下tcp之上加了ss1一层,用于对应用层数据的加解密。

如下所示:

  • http
  • ssl/tsl
  • tcp
  • ip

http为什么不安全

HTTP由于是明文传输,主要存在三大风险:窃 听风险、篡改区险、冒充风险。

  • 窃 听风险
  • 中间人可以获取到通信内容,由于内容是明文,所以获取明文后有安全风险
  • 篡改风险
  • 中间人可以篡改报文内容后再发送给对方,风险极大。
  • 冒充风险
  • 比如你以为是在和某宝通信,但实际上是在和一个钓鱼网站通信。

安全通信的四大原则

通信需要包括以下四个原则:机密性、完整性,身份认证和不可否认。

  • 机密性:即对数据加密,解决了窃 听风险,因为即使被中间人窃 听,由于数据是加密的,他也拿不到明文:
  • 完整性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途如果哪怕改了一个标点符号,接收方也能识别出来,从来判定定接收报文不合法
  • 身份认证:确认对方的真实身份,即证明"你妈是你妈"的问题,这样就解决了冒充风险,用户不用担心访问的是某宝结果却在和钓鱼网网站通信的问题:
  • 不可否认:即不可否认已发生的行为,比如小明向小红借了1000元,但没打借条,或者打了借条但没有签名,就会造成小红的资金损失夫。

https通信原理简述

既然HTTP是明文传输的,那我们给报文加密不就行了,既然要加密,我们肯定需要通信双方协商好密钥吧。一种是通信双方使用同一把密钥,即对称加密的方式来给报文进行加解密。

非对称加密即加解密双方使用不同的密钥,一把作为公钥,可以公开的,把作为私钥,不能公开,公钥加密的密文只有私钥可以解密,私钥签名的内容,也只有公钥可以验签。

数字证书,解决公钥传输信任问题

证书是由站点管理者向CA申请,申请的时候会提交域名、组织单位信息和公钥等数据(这些数据组成了Certificate Signing Request证书签名请求简称CSR),CA会根据这些信息生成证书

https总结

server传输CA颁发的证书给client,client收到证书后使用系统内置的CA证书的公钥来验签,验签通过证明证书是受信任的,证书受信任那么证书中的公钥也就是受信任的,这样的话就解决了公钥传输过程中被调包的风险。

nginx配置https证书

由于ssl证书需要向CA组织申购,实验采用自签名证书(也就是自己给自己签名并颁发证书,当然这种证书是不被信任的)

使用openssl 生成证书和私钥生成证书和私钥

创建证书存储目录

[root@localhost ^]# mkdir -p /etc/nginx/ssl

生成自签名证书

[root@localhost ^]# openssl req -x509 -nodes -days :365 -newkey rsa:2048
-keyout/etc/nginx/ssl/nginx-selfsigned.key
-out/etc/nginx/ssl/nginx-selfsigned.crt\
-subj "/C=CN/ST=Beijing/L=Beijing/0=MyOrg/CN=localhost

Ps:

CA签名证书:

需要由受信任的第三方证书颁发机构(CA)签发。

流程如下:

  • 1.用户生成私钥和CSR(证书签名请求)。
  • 2.将CSR提交给CA(如Let'sEncrypt、DigiCert等)。
  • 3.CA机构验证身份后,用CA的私钥对证书签名,生成最终证书。

自签名证书:

  • 证书的颁发者(Issuer)和主体(Subject)是同一个实体((即自己)。
  • 无需第三方CA参与,直接用工具(如0penSSL)生成私钥和证书。
  • 签名时使用自己的私钥,而不是CA的私钥。
  • 适用于测试、内部环境或无需公开信任的场景。

nginx启用https

编辑nginx配置文件

[root@localhost ~]#vi /usr/local/nginx/conf/nginx.conf
server {
listen 443 ssl; #监听 HTTPS 端口
server_namelocalhost; #域名或IP
#指定证书和私钥路径
ssl_certificate
/etc/nginx/ssl/nginx-selfsigned.crt;
/etc/nginx/ssl/nginx-selfsigned.key;
issl_certificate_key

server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;

}
[root@localhost ^]#nginx -t
[root@localhost ^]#nginx -s reload

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nginx内存池源码解析

    nginx内存池源码解析

    内存池是在真正使用内存之前,预先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用,接下来通过本文给大家介绍nginx内存池源码,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • Nginx禁止ip访问或非法域名访问

    Nginx禁止ip访问或非法域名访问

    这篇文章主要介绍了Nginx禁止ip访问或非法域名访问,需要的朋友可以参考下
    2022-04-04
  • Nginx日志中request_time和upstream_response_time区别

    Nginx日志中request_time和upstream_response_time区别

    Nginx日志中的request_time和upstream_response_time是关键的性能指标,本文就来介绍一下Nginx日志中request_time和upstream_response_time区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-11-11
  • Nginx 介绍及日常管理的详解

    Nginx 介绍及日常管理的详解

    这篇文章主要介绍了Nginx 介绍及日常管理的详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Nginx基础location语法及功能配置实例

    Nginx基础location语法及功能配置实例

    这篇文章主要为大家介绍了Nginx基础location语法及功能以及配置实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Nginx生产环境平滑升级的实现

    Nginx生产环境平滑升级的实现

    本文主要介绍了Nginx生产环境平滑升级的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Nginx高可用Keepalived的具体使用

    Nginx高可用Keepalived的具体使用

    Keepalived是一种实现高可用的软件,基于VRRP协议,可以自动将虚拟IP地址切换到备用服务器,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • nginx添加nginx-sticky-module模块步骤的实现

    nginx添加nginx-sticky-module模块步骤的实现

    nginx-sticky-module模块是nginx实现负载均衡的一种方案,和ip_hash负载均衡算法会有区别的,本文主要介绍了nginx添加nginx-sticky-module模块步骤的实现,感兴趣的可以了解一下
    2023-08-08
  • 在Nginx中隐藏版本号的方法详解

    在Nginx中隐藏版本号的方法详解

    Nginx是一款高性能的Web服务器软件,它支持反向代理、负载均衡、缓存等功能,在使用 Nginx 的过程中,有时候我们需要隐藏 Nginx 的版本号,以增强服务器的安全性,所以接下来小编将给大家介绍如何在Nginx中隐藏版本号,需要的朋友可以参考下
    2023-11-11
  • 通过Nginx实现前端与后端的协同部署

    通过Nginx实现前端与后端的协同部署

    在现代 web 开发中,前端与后端的协同部署是一个关键问题,一个高效的部署策略不仅能提升用户体验,还能简化开发流程,今天,我们就来探讨如何利用 Nginx 实现前端与后端的协同部署,需要的朋友可以参考下
    2025-03-03

最新评论