nginx安全防护与HTTPS部署实战

打印 上一主题 下一主题

主题 1797|帖子 1797|积分 5393

目次
核心安全配置nginx
隐藏版本号
限定伤害请求的方法
请求限定(cc攻击防御)
使用Nginx的linit_req模块限定请求速率
压力测试验证
防盗链
高级防护动态黑名单
nginx https配置
HTTP为什么不安全
安全通讯的四大原则
HTTPS通讯原理简述
数字证书,办理公钥传输信任问题
nginx配置htps证书

核心安全配置nginx
安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这
些软件的开发包(devel),以便提供相应的库和头文件,确呆Nginx的安装顺
利完成
  1. [root@localhost ^]# dnf install -y gcc make pcre-develzlib-devel
  2. openssl-devel perl-ExtUtils-MakeMaker git wget tar
复制代码
                  创建运行用户,组和日志目次 
  1. [root@localhost~]# useradd -M -s /sbin/nologin nginx
  2. [root@localhost~]# mkdir -p /var/log/nginx
  3. [root@localhost~]# chown -R nginx:nginx /var/log/nginx
复制代码
                   编译安装nginx
  1. [root@localhost]# tar zxf nginx-1.26.3.tar.gz
  2. [root@localhost]# cd nginx-1.26.3
  3. [root@localhost nginx-1.26.3]# ./configure
  4. --prefix=/usr/local/nginx\
  5. --pid-path=/var/run/nginx.pid\
  6. --user=nginx\
  7. --group=nginx\
  8. --with-http_ssl_module \
  9. --with-http_v2_module \
  10. --with-http_realip_module \
  11. --with-http_stub_status_module\
  12. --with-http_gzip_static_module \
  13. --with-pcre\
  14. --with-stream
  15. [root@localhost nginx-1.26.3]# make & make install
复制代码
                  为步伐nfinx创建链接文件
  1. [root@localhost_nginx-1.26.3]# ln -s /usr/local/nginx/sbin/nginx
  2. /usr/local/sbin/
复制代码
                 添加nginx系统服务

  1. [root@localhost ~]# vim /lib/systemd/system/nginx. seervice
  2. [Unit]
  3. Description=The NGINX HTTP and reverse proxy server
  4. After=network.target
  5. [Service]
  6. Type=forking
  7. PIDFile=/usr/local/nginx/logs/nginx.pid
  8. ExecStartPre=/usr/local/sbin/nginx -t
  9. ExecStart=/usr/local/sbin/nginx
  10. ExecReload=/usr/local/sbin/nginx -s reload
  11. ExecStop=/bin/kill -s QUIT $MAINPID
  12. TimeoutStopSec=5
  13. KillMode=process
  14. PrivateTmp=true
  15. User=root
  16. Group=root
  17. [Install]
  18. WantedBy=multi-user.target
  19. [root@localhost ~]# systemctl daemon-reload
  20. [root@localhost ~]# systemctl start nginx
  21. [root@localhost ~]# systemctl enable nginx
复制代码
隐藏版本号
在 Nginx 中隐藏版本号可以提高服务器的安全性,减少因版本信息泄漏而可能带来的潜伏风险。以下是隐藏 Nginx 版本号的几种方法
                通过配置文件隐藏

                  在 Nginx 的配置文件(通常是nginx.conf)中,找到http块或者server块,添加或修改以下配置项
  1. server_tokens off;
复制代码
该配置项用于关闭 Nginx 在响应头中发送服务器版本号等信息。修改配置文件后,需要重新加载 Nginx 配置使更改生效。可以使用以下命令重新加载 Nginx 配置
  1. nginx -s reload
复制代码
                  通过编译参数隐藏
                  在编译 Nginx 源代码时,可以通过指定--with-http_headers_more_module模块,并在配置文件中使用more_set_headers指令来隐藏版本号。比方,在编译 Nginx 时添加以下参数
  1. ./configure --with-http_headers_more_module
复制代码
 然后在 Nginx 配置文件中添加如下配置
  1. server {
  2.     listen       80;
  3.     server_name  example.com;
  4.     more_set_headers 'Server: nginx';
  5.     # 其他配置项...
  6. }
复制代码
如许设置后,服务器返回的响应头中Server字段将显示为nginx,而不是具体的版本号 
               使用第三方模块隐藏

可以使用一些第三方的 Nginx 模块来更机动地处置惩罚服务器响应头信息,从而隐藏版本号。比方,ngx_http_headers_module模块可以用于修改和删除响应头中的字段。起首需要安装该模块,然后在 Nginx 配置文件中举行如下配置
  1. server {
  2.     listen       80;
  3.     server_name  example.com;
  4.     add_header Server nginx;
  5.     # 或者使用以下方式直接删除Server头字段
  6.     # add_header Server "" always;
  7.     # 其他配置项...
  8. }
复制代码
上述配置中,通过add_header指令将Server头字段设置为自界说的值,或者将其设置为空字符串来隐藏版本号 
限定伤害请求的方法
不安全的请求方式,是潜伏的安全风险,TRACE(易引发XSST攻击)、PUT/DELETE
(文件修改风险)、CONNECT(代理滥用),通过正则表达式匹配请求方法,非
白名单方法返回444(无响应关闭毗连)
  1. [root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
  2. vim /usr/local/nginx/conf/nginx.conf
  3. server {
  4. if($request_method !~~(GET|HEAD|POST)$){
  5. return 444;
  6. }
  7. }
复制代码
测试
  1. [root@localhost ^]#curl -XPUT -I 192.168.10.202
  2. curl: (52) Empty reply from server
复制代码
 PS:注意测试TRACE和CONNECT方法时,状态码不是444(原因:1.CONNECT请
求的目的不是代理服务器时,服务器必须返回400BadRequest,Nginx核心层
在请求剖析阶段直接拦截,根本不进入后续的location处置惩罚流程2.现代Nginx
默认禁用TRACE方法,在ngx_http_core_module阶段直接返回405 Not Allowed)
 
请求限定(cc攻击防御)
CC攻击(ChallengeCollapsar攻击)是一种常见的网络攻击方式,通过大
量正当或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要
在Nginx中有用防止CC攻击,可以采用多种策略和方法。
CC攻击,也称为毗连数攻击或请求速率限定攻击,通过模拟气力用户访问
来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,
可以使用Nginx提供的模块来限定请求速率和并发毗连数
使用Nginx的linit_req模块限定请求速率
limit_req 模块是 Nginx 用于限定客户端请求速率的强大工具。它可以有用防止服务器因过多请求而过载
                配置速率限定区域

你要在 http 块中界说一个速率限定区域。此区域可跟踪客户端的请求,并按照指定的速率举行限定
  1. http {
  2.     # 定义一个名为 one 的速率限制区域,大小为 10m,速率为每秒 1 个请求
  3.     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  4.     ...
  5. }
复制代码
在上述代码里,$binary_remote_addr 表现客户端的 IP 地址,zone=one:10m 界说了名为 one 的区域,其大小为 10MB,rate=1r/s 意味着每秒最多允许 1 个请求 
                 应用速率限定

在需要举行速率限定的 server 或者 location 块中运用该速率限定区域
  1. server {
  2.     ...
  3.     location / {
  4.         # 应用名为 one 的速率限制区域
  5.         limit_req zone=one;
  6.         ...
  7.     }
  8. }
复制代码
 处置惩罚突发请求 要是你期望允许肯定数量的突发请求,可以添加 burst 参数
  1. server {
  2.     ...
  3.     location / {
  4.         # 应用名为 one 的速率限制区域,允许 5 个突发请求
  5.         limit_req zone=one burst=5;
  6.         ...
  7.     }
  8. }
复制代码
 在这个配置里,burst=5 表明允许最多 5 个突发请求。若请求速率超出限定,多余的请求会被放入队列,直至队列满了,才会返回 503 错误
完备配置示例

  1. http {
  2.     # 定义一个名为 one 的速率限制区域,大小为 10m,速率为每秒 1 个请求
  3.     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  4.     server {
  5.         listen 80;
  6.         server_name example.com;
  7.         location / {
  8.             # 应用名为 one 的速率限制区域,允许 5 个突发请求
  9.             limit_req zone=one burst=5;
  10.             proxy_pass http://backend;
  11.         }
  12.     }
  13. }
复制代码
  重新加载 Nginx 配置在完成配置文件的修改之后,要重新加载 Nginx 配置,使新的配置生效
  1. sudo nginx -s reload
复制代码
 通过上述步调,你就可以使用 limit_req 模块对 Nginx 的请求速率举行限定了

压力测试验证
安装ab测试工具
ApacheBench(简称ab)是Apache HTTP服务器自带的一个轻量级、易用的
HTTP服务器性能测试工具。它重要用于评估服务器在并发议方向下的性能表现,
包括响应时间、吞吐量等关键指标
  1. [root@localhost ~]#dnf install httpd-tools -y
复制代码
发送请求300个每次发送30个请求

  1. [root@localhost~]#ab -n 300 -c 30 http://192.168.10.202/
复制代码
 检察access.log发现大量请求日志状态码503
  1. [root@localhost ^]#tail -300 /usr/local/nginx/logs/acocess. log | grep-c503
复制代码
                  防盗链
防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用用网站(静态)资
源。盗链行为不仅侵占了内容创作者的版权,还可能导致原网站带宽和资源的过
度消耗,影响正常用户的访问速度和体验。
一般来说,用户浏览一个完备的页面并不是一次性全部传送到到客户端的。如
果所请求的页面带有图片或其他信息,那么第一个HTTP请求传送的是这个页面
的文本,然后通过客户端的浏览器对这段文本举行解释实行。假如发现其中另有
图片,那么客户端的浏览器会再次发送一条HTTP请求,当这个请求被处置惩罚后这
个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的精确位置,
就如许一个完备的页面要颠末多次发送HTTP请求才可以大概被完备的显示。基于这
样的机制,就会产生盗链问题:假如一个网站中没有其页面中所说图片信息,那
么它完全可以链接到其他网站的图片信息上。如许,没有任何资源的网站使用了
其他网站的资源来展示给浏览者,提高了本身的访问量,而大部门浏览者又不会
很容易地发现。一些不良网站为了不增加成本而扩充本身站点内容,常常盗用其
他网站的链接。一方面损害了原网站的正当长处,另一方面又加重了服务器的负

基于 valid_referers 指令的简朴防盗链
可以使用 valid_referers 指令指定允许的引用页面(即哪些网站可以引用你的资源),对于不在列表中的引用,可返回 403 状态码
  1. server {
  2.     listen 80;
  3.     server_name yourdomain.com;
  4.     location ~* \.(jpg|jpeg|png|gif)$ {
  5.         valid_referers none blocked yourdomain.com *.yourdomain.com;
  6.         if ($invalid_referer) {
  7.             return 403;
  8.         }
  9.         root /path/to/your/images;
  10.     }
  11. }
复制代码
 使用 secure_link 模块举行高级防盗链secure_link 模块可以通过天生加密的链接来实现更高级的防盗链功能,只有拥有有用链接的用户才能访问资源
起首,在 Nginx 配置文件中启用 secure_link 模块配置nginx
  1. server {
  2.     listen 80;
  3.     server_name yourdomain.com;
  4.     location /protected/ {
  5.         secure_link $arg_md5,$arg_expires;
  6.         secure_link_md5 "$secure_link_expires$uri yoursecretkey";
  7.         if ($secure_link = "") {
  8.             return 403;
  9.         }
  10.         if ($secure_link = "0") {
  11.             return 410;
  12.         }
  13.         root /path/to/your/protected/files;
  14.     }
  15. }
复制代码
 
天生安全链接

在你的应用步伐中,可以使用以下 Python 代码天生安全链接
  1. import hashlib
  2. import time
  3. def generate_secure_link(uri, secret_key, expires_in=3600):
  4.     expires = int(time.time()) + expires_in
  5.     md5 = hashlib.md5(f"{expires}{uri} {secret_key}".encode('utf-8')).hexdigest()
  6.     return f"http://yourdomain.com{uri}?md5={md5}&expires={expires}"
  7. # 示例
  8. uri = "/protected/file.jpg"
  9. secret_key = "yoursecretkey"
  10. link = generate_secure_link(uri, secret_key)
  11. print(link)
复制代码
 重新加载 Nginx 配置完成配置文件的修改后,需要重新加载 Nginx 配置,使新的配置生效
  1. sudo nginx -s reload
复制代码

高级防护动态黑名单
 安装必要的组件要包管 Nginx 已经安装了 Lua 模块(ngx_http_lua_module),同时安装 Redis 数据库
配置 Nginx

在 Nginx 配置文件里添加如下内容
  1. http {
  2.     # 加载 Lua 模块
  3.     lua_shared_dict blacklist 10m;
  4.     init_by_lua_block {
  5.         -- 连接 Redis
  6.         local redis = require "resty.redis"
  7.         local red = redis:new()
  8.         red:set_timeout(1000) -- 1 秒超时
  9.         local ok, err = red:connect("127.0.0.1", 6379)
  10.         if not ok then
  11.             ngx.log(ngx.ERR, "Failed to connect to Redis: ", err)
  12.             return
  13.         end
  14.         -- 从 Redis 加载黑名单到共享字典
  15.         local res, err = red:keys("blacklist:*")
  16.         if res then
  17.             for _, key in ipairs(res) do
  18.                 local ip = string.sub(key, 11)
  19.                 ngx.shared.blacklist:set(ip, true)
  20.             end
  21.         end
  22.         -- 定期从 Redis 同步黑名单
  23.         local function sync_blacklist()
  24.             while true do
  25.                 ngx.sleep(60) -- 每分钟同步一次
  26.                 local ok, err = red:connect("127.0.0.1", 6379)
  27.                 if not ok then
  28.                     ngx.log(ngx.ERR, "Failed to connect to Redis: ", err)
  29.                     goto continue
  30.                 end
  31.                 local res, err = red:keys("blacklist:*")
  32.                 if res then
  33.                     ngx.shared.blacklist:flush_all()
  34.                     for _, key in ipairs(res) do
  35.                         local ip = string.sub(key, 11)
  36.                         ngx.shared.blacklist:set(ip, true)
  37.                     end
  38.                 end
  39.                 ::continue::
  40.             end
  41.         end
  42.         ngx.timer.at(0, sync_blacklist)
  43.     }
  44.     server {
  45.         listen 80;
  46.         server_name yourdomain.com;
  47.         access_by_lua_block {
  48.             local ip = ngx.var.remote_addr
  49.             if ngx.shared.blacklist:get(ip) then
  50.                 ngx.exit(ngx.HTTP_FORBIDDEN)
  51.             end
  52.         }
  53.         location / {
  54.             # 其他配置
  55.         }
  56.     }
  57. }
复制代码
管理黑名单

可以使用 Redis 命令来管理黑名单添加 IP 到黑名单
  1. redis-cli set blacklist:192.168.1.1 true
复制代码
从黑名单中移除 IP
  1. redis-cli del blacklist:192.168.1.1
复制代码
重新加载 Nginx 配置完成配置文件的修改后,重新加载 Nginx 配置,使新的配置生效

  1. sudo nginx -s reload
复制代码
nginx https配置
HTTPS,全称HyperText Transfer Protocol over SecureSocket Layer,
设计初衷是为了包管数据传输安全。国内大型互联网巨头在2016开始大力推行
https,期间关于https的重大事件有众所周知,http(超文本传输协议)是客户端浏览器与vveb服务器之间的通
信协议,而https协议可以认为是HTTP+SSL/TLS,在http下tcp之上加了
ss1一层,用于对应用层数据的加解密如图
HTTP
SSL/TSL
TCP
IP
SSL:由Netscape公司开发,专门用于保护Web通讯。SSL协议位于TCP/IP
协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议又可分为SSL记
录协议(SSLRecord Protocol)和SSL握手协议(SSLHaIndshake Protocol)
两层。SSL履历了多个版本的迭代,包括从未公开发布的SSL1.0、存在严峻安
全毛病且现已废弃的SSL2.0、在2014年因POODLE攻击毛病而被逐步淘汰的SSL
3.0TLS:是IETF (Internet Engineering Task Foorce,互联网工程使命组)
制定的一种新的协议,它创建在SSL3.0协议规范之上,是SSSL3.0的后续版本。
从汗青上看,TLS对SSL起首是继承关系,后来逐步发展并取代了SSL,成为当
前主流的网络安全协议。TLS履历了多个版本的演进,包括TLS 1.0(1999年发
布,基于SSL3.0但举行了改进)、TLS 1.1(2006年发布,增加了对CBC攻击
的保护)、TLS1.2(2008年发布,引入了更强大的加密算法、如AES)和TLS1.3
(2018年发布,进一步简化了握手过程,提高了性能和安全性)。值得注意的
是,TLS 1.0和TLS1.1也在2021年被正式弃用
HTTP为什么不安全
HTTP由于是明文传输,重要存在三大风险:窃听风险、篡改!风险、冒充风险

安全通讯的四大原则
不难猜到HTTPS就是为了办理上述三个风险而生的,一般我们认为安全的
通讯需要包括以下四个原则:秘密性、完备性,身份认证和不可能否认
秘密性:即对数据加密,办理了窃听风险,由于即使被中心间人窃听,由于数
据是加密的,他也拿不到明文;
完备性:指数据在传输过程中没有被篡改,不多不少,保持原样,中途假如
哪怕改了一个标点符号,吸收方也能辨认出来,从来判定吸收报文不正当:
身份认证:确认对方的真实身份,即证明"你妈是你妈"的问题,如许就解
决了冒充风险,用户不消担心访问的是某宝结果却在和钓鱼鱼网站通讯的问题:
不能否认:即不能否认已发生的行为,比如小明向小红借了1000元,但没
打借条,或者打了借条但没有签名,就会造成小红的资金丧失。
HTTPS通讯原理简述
HTTPS(Hypertext Transfer Protocol Secure)即超文本传输安全协议,它的通讯原理重要涉及以下几个关键步调

  • 客户端发起请求:客户端(如浏览器)向服务器发送一个 HTTPS 请求,请求中包含了客户端支持的加密算法、密钥交换方式等信息。
  • 服务器响应:服务器收到请求后,会根据客户端提供的信息,选择双方都支持的加密算法和密钥交换方式,并将服务器的数字证书发送给客户端。数字证书包含了服务器的公钥、证书颁发机构(CA)的信息以及证书的有用期等内容。
  • 客户端验证证书:客户端收到服务器的数字证书后,会验证证书的正当性。它会检查证书是否由受信任的 CA 颁发,证书是否在有用期内,以及证书中的域名是否与请求的域名一致等。假如证书验证通过,客户端就可以从证书中提取出服务器的公钥。
  • 天生会话密钥:客户端天生一个随机的会话密钥,然后使用服务器的公钥对会话密钥举行加密,并将加密后的会话密钥发送给服务器。
  • 服务器解密会话密钥:服务器使用本身的私钥解密客户端发送的加密会话密钥,从而得到客户端天生的会话密钥。
  • 加密通讯:双方使用会话密钥对后续通讯的数据举行加密和解密。客户端将请求数据使用会话密钥加密后发送给服务器,服务器收到加密数据后,使用会话密钥举行解密并处置惩罚请求。然后,服务器将响应数据使用会话密钥加密后发送给客户端,客户端收到后再使用会话密钥解密得到响应内容

数字证书,办理公钥传输信任问题
数字证书的概念

数字证书是一种由权势巨子的证书颁发机构(CA)颁发的电子文件,它将公钥与拥有该公钥的实体(如网站、用户等)的身份信息绑定在一起。证书中包含了公钥、证书持有者的身份信息、证书颁发机构的信息、有用期等内容,并由证书颁发机构使用其私钥对这些信息举行数字签名
办理信任问题的原理

认证证书颁发机构:在 HTTPS 通讯中,客户端浏览器内置了一些受信任的根证书颁发机构的公钥。当客户端收到服务器发送的数字证书时,它会起首检查证书的颁发机构是否在受信任的列表中。假如是,客户端就信任该颁发机构。
验证数字签名:客户端使用证书颁发机构的公钥来验证数字证书上的签名。由于数字签名是由证书颁发机构使用其私钥天生的,只有使用对应的公钥才能成功验证。假如签名验证通过,客户端就可以确认证书中的公钥确实是由该证书颁发机构颁发的,而且证书在传输过程中没有被篡改。
绑定身份和公钥:数字证书将服务器的身份信息(如域名)与公钥绑定在一起。客户端通过验证证书中的域名与本身请求的域名是否一致,来确认所获取的公钥是否属于精确的服务器,从而防止中心人攻击。比方,攻击者不能将本身的公钥伪装成某个正当网站的公钥,由于其数字证书中的域名与正当网站的域名不匹配,客户端会发现这种不一致并拒绝毗连
nginx配置htps证书
预备证书文件

你需要拥有有用的 SSL/TLS 证书文件,一般包含一个 .crt 或 .pem 格式的证书文件和一个 .key 格式的私钥文件
备份 Nginx 配置文件

在修改配置文件之前,最好先辈行备份,以防配置错误导致 Nginx 无法正常工作
  1. cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
复制代码
 
 配置 Nginx 以使用 HTTPS

编辑 Nginx 的配置文件,通常位于 /etc/nginx/sites-available/ 目次下
  1. server {
  2.     listen 80;
  3.     server_name your_domain_or_ip;
  4.     # 将所有 HTTP 请求重定向到 HTTPS
  5.     return 301 https://$host$request_uri;
  6. }
  7. server {
  8.     listen 443 ssl;
  9.     server_name your_domain_or_ip;
  10.     # 证书文件路径
  11.     ssl_certificate /path/to/your_certificate.crt;
  12.     ssl_certificate_key /path/to/your_private_key.key;
  13.     # SSL 协议和加密套件配置
  14.     ssl_protocols TLSv1.2 TLSv1.3;
  15.     ssl_prefer_server_ciphers on;
  16.     ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
  17.     # 其他配置
  18.     root /var/www/html;
  19.     index index.html index.htm index.nginx-debian.html;
  20.     location / {
  21.         try_files $uri $uri/ =404;
  22.     }
  23. }
复制代码
 
检查配置文件语法

  1. nginx -t
复制代码
重启服务
  1. systemctl restart nginx
复制代码
 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表