Nginx系列:安全下载模块

简介: ngx_http_secure_link_module模块用于检查请求链接的真伪,保护资源免受未经授权的访问,限制链接的生命周期。

ngx_http_secure_link_module模块用于检查请求链接的真伪,保护资源免受未经授权的访问,限制链接的生命周期。


通过将请求中传递的校验和值与请求计算的值进行比较来验证请求链接的真实性。如果链接的生命周期有限并且时间已过,则该链接将被视为过时。


微信图片_20220502080732.jpg

 

验证原理:


  • 用户在客户端点击下载按钮,服务器收到请求后生成一个下载地址返回给客户端。
  • 客户端使用这个生成的下载地址去请求资源,此时nginx去做校验,校验链接地址真伪和链接地址是否过期。如果链接地址是真的并且链接地址没有过期,就给客户端返回下载资源。


nginx验证和服务器生成密钥规则要一致,否则验证是不会通过的


该模块提供两种备选操作模式:


  • 第一种模式secure_link_secret指令启用,用于检查请求链接的真实性以及保护资源免受未经授权的访问
  • 第二种模式secure_link和secure_link_md5指令启用,也用于限制链接生命周期。


更详细参考官网


http://nginx.org/en/docs/http/ngx_http_secure_link_module.html


0x01:配置模块语法


ngx_http_secure_link_module主要有以下三个语法


secure_link


Syntax: secure_link expression;
Default: —
Context: http, server, location


secure_link_md5


Syntax: secure_link_md5 expression;


Default: —
Context: http, server, location


secure_link_secret


Syntax: secure_link_secret word;
Default: —
Context: location


0x02:安装ngx_http_secure_link_module模块


  • 首先检查nginx是否已安装模块


#nginx -V


结果如下,没有安装ngx_http_secure_link_module模块


微信图片_20220502080741.jpg

 

输出nginx所有已安装模块,检查是否有ngx_http_secure_link_module,因为这个模块没有默认编译,在编译Nginx时,必须使用明确的配置参数


--with-http_secure_link_module


  • 安装


执行以下命令


#先安装secure link 其实这个组件nginx本身就有,只不过是默认不安装罢了
./configure  --prefix=/usr/local/nginx --user=nginx \
--group=nginx --with-http_secure_link_module \
--with-http_stub_status_module


执行mak编译nginx


make


make之后的操作需要注意,如果nginx第一次安装,直接执行make install即可


make install


如果单纯添加模块,不需要install,而是执行以下操作,将打过补丁的nginx二进制文件覆盖/usr/local/nginx/sbin/目录中的文件即可


#备份之前的nginx
mv /usr/local/nginx/sbin/nginx  /usr/local/nginx/sbin/nginx.bak
#拷贝新的nginx到sbin目录
cp /nginx源码目录/objs/nginx   /usr/local/nginx/sbin/


0x03: ngx_http_secure_link_module配置


在server节点增加以下location配置


location / {
    root html; 
    #这里配置了2个参数一个是md5,一个是expires
    secure_link $arg_md5,$arg_expires;
    #md5的哈希格式为: expires+url+addr
    #expires为时间戳单位s
    #url为请求地址
    #remote_addr为远程IP地址
    #mysecure为密钥
    secure_link_md5 "mysecure$secure_link_expires$uri$remote_addr";
    if ($secure_link = "") {
    #资源不存在或哈希比对失败
        return 402;
    }
    if ($secure_link = "0") {
        #时间戳过期
        return 404;
    }
    if ($request_filename ~* ^.*?\.(mp4)$){
        #直接下载防止打开文件  格式: (mp4|txt|jpg)
        add_header Content-Disposition 'attachment;';
    }
}
#设置400,404的跳转
#在server节点
error_page 400 = 400.html; #跳转400页面
error_page 404 = 404.html; #跳转404页面


在html目录添加400.html和404.htmll两个界面


微信图片_20220502080751.jpg

 

0x04:JAVA计算防盗链地址


需要使用到commons-codec-1.10.jar包,请自行下载


package com.alibaba.csp.sentinel.datasource.consul;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
/**
 * 防盗链资源下载地址
 *
 */
public class GenSourceDownloadPath {
    final static String HTTP = "http://";
    final static String ST = "?md5=";
    final static String E = "&expires=";
    final static String F = "/";
    final static String WARN = "path参数最好带上 \"/\" ,例: \"/abc.mp4\" ";
    final static String SERVER_IP = "127.0.0.1";
    final static Long expires = 20L; //过期时间 秒
    final static String secret = "mysecure"; //密钥
    public static String execute(String path) {
        if (path.indexOf(F) == -1) {
            path =  F + path;
            System.out.println(WARN);
        }
        // +n代表n秒后地址失效
        String time = String.valueOf(System.currentTimeMillis() / 1000 + expires); 
        // $secure_link_expires$uri$remote_addr
        String md5Str = secret + time + path + SERVER_IP;
        byte[] md5byte = DigestUtils.md5(md5Str);
        String base64 = Base64.encodeBase64URLSafeString(md5byte);
        return HTTP + SERVER_IP + path+ ST + base64 + E + time;
    }
    public static void main(String[] args) {
        System.out.println(execute("my.conf"));
    }
}


现在html目录存放一个图片文件my.conf,该文件是需要访问演示的文件


微信图片_20220502080757.jpg

 

执行GenSourceDownloadPath生成一个访问的URL:


http://127.0.0.1/my.conf?md5=YO4diAmlVa8NfHlMBCMFaw&expires=1598071052


执行访问


微信图片_20220502080802.jpg

 

如果没有带参数访问


微信图片_20220502080805.jpg

 

超过20s访问,不在有权限访问


微信图片_20220502080809.jpg


备注:


如果按官方秘密mysecure放在最后,需加一个空格与参数分隔


微信图片_20220502080812.jpg

 

在使用java计算时也需要多加一个空格


微信图片_20220502080816.jpg


相关文章
|
2月前
|
负载均衡 应用服务中间件 API
Nginx:location配置模块的用法(一)
Nginx:location配置模块的用法(一)
254 2
|
2月前
|
缓存 应用服务中间件 nginx
安装nginx-http-flv-module模块
本文介绍如何为Nginx安装`nginx-http-flv-module`模块。此模块基于`nginx-rtmp-module`二次开发,不仅具备原模块的所有功能,还支持HTTP-FLV播放、GOP缓存、虚拟主机等功能。安装步骤包括:确认Nginx版本、下载相应版本的Nginx与模块源码、重新编译Nginx并加入新模块、验证模块安装成功。特别注意,此模块已包含`nginx-rtmp-module`功能,无需重复编译安装。
85 1
|
2月前
|
负载均衡 应用服务中间件 Linux
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
|
2月前
|
缓存 前端开发 应用服务中间件
Nginx:location配置模块的用法(二)
Nginx:location配置模块的用法(二)
45 2
|
2月前
|
安全 应用服务中间件 网络安全
Nginx要怎么配置才算安全
Nginx要怎么配置才算安全
42 0
|
3月前
|
应用服务中间件 Linux nginx
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
《FFmpeg开发实战》书中介绍了如何使用FFmpeg向网络推流,简单流媒体服务器MediaMTX不适用于复杂业务。nginx-rtmp是Nginx的RTMP模块,提供基本流媒体服务。要在Linux上集成rtmp,需从官方下载nginx和nginx-rtmp-module源码,解压后在nginx目录配置并添加rtmp模块,编译安装。配置nginx.conf启用RTMP服务,监听1935端口。使用ffmpeg推流测试,如能通过VLC播放,表明nginx-rtmp运行正常。更多详情见书本。
87 0
FFmpeg开发笔记(四十)Nginx集成rtmp模块实现RTMP推拉流
|
2月前
|
Ubuntu 应用服务中间件 Linux
如何在Ubuntu 14.04上使用Nginx和Php-fpm安全地托管多个网站
如何在Ubuntu 14.04上使用Nginx和Php-fpm安全地托管多个网站
15 0
|
2月前
|
Ubuntu 前端开发 JavaScript
如何在 Ubuntu 14.04 上为 Nginx 添加 gzip 模块
如何在 Ubuntu 14.04 上为 Nginx 添加 gzip 模块
20 0
|
2月前
|
安全 应用服务中间件 Linux
nginx搭建静态文件下载服务器
nginx搭建静态文件下载服务器
152 0
|
5月前
|
应用服务中间件 数据库 nginx
nginx 第三方模块 与变量
nginx 第三方模块 与变量
下一篇
无影云桌面