需求问题

公司渗透测试扫描发现了一个未授权访问文件的问题,即外网可以通过文件地址直接访问文件服务器中文件,无需任何认证,造成公司敏感数据泄露。

问题分析

当前获取文件的流程如下

我们的文件地址形如:http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc(x.x.x.x是应用服务器IP)
1)请求地址到应用服务器。
2)应用服务器再通过nginx转发到文件服务器(y.y.y.y),获取到对应文件。
3)获取到文件后直接返回,如果是返回前端,即可做图片预览,文件下载,视频播放等功能。此外中台应用功能,如发送邮件时,也是直接调用的文件地址获取附件。
该地址是在应用服务器通过nginx直接转发到文件服务器的,没有经过应用系统鉴权,好处就是获取文件无需暂用应用服务器带宽,速度较快。但也产生了未授权访问的问题。
在这里插入图片描述

解决方案

方案1

应用服务器增加接口,所有文件都从该接口转发到文件服务器获取,并以文件流的方式返回。该方式需占用大量带宽,且前后台所有请求文件服务器的代码都需调整,后考虑使用方案二。

方案2

方案2是基于该篇文章(https://www.cnblogs.com/JQ04/p/15905762.html)调整的。
1)请求的文件地址保持不变,先跳转至应用服务器的nginx
2)转换请求路径。因为后续要请求后端进行鉴权,而http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc的请求方式不满足后端接口形式,因此跳转前将该请求转换成了get请求入参的方式:http://x.x.x.x:5001/filefolder?addr=/folder1/folder2/aaa.doc。
3)应用服务器nginx再路由至应用做鉴权,鉴权通过后重定向会nginx服务器配置的静态资源路径。
4)再由应用服务器跳转至文件服务器获取文件。
流程如下:
在这里插入图片描述

具体实现

应用服务器nginx配置
server{
	listen 5001;
	# 文件路径前缀
	location /filefolder{
	    # 此步骤是经文件路径转换成get请求带入参的格式。
		proxy_pass http:x.x.x.x:5001/ftpFile?addr=;
	}
	# 鉴权前缀
	location /ftpFile{
		 proxy_redirect off;            
		 proxy_set_header Host  $host;            
		 proxy_set_header X-Real-IP $remote_addr;            
		 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
		 # 指定提供文件鉴权服务的地址
		 proxy_pass http://x.x.x.x:5002/servername/ftpFile; 
	}
	# 静态资源前缀
	location /filefolder_static/{
		internal;
		proxy_pass http://y.y.y.y:5123/filefolder/;  #代理的静态文件目录
	}
}
中台鉴权

中台鉴权代码参考文章:https://www.cnblogs.com/JQ04/p/15905762.html
与该文章不同点:
1)前端请求文件地址时,带有cookie,通过cookie进行鉴权
2)中台请求文件地址时,无cookie,因此在鉴权接口上增加了authkey字段,要求中台传文件地址时制定传一个key。中台请求格式如下:

    http://x.x.x.x:5001/filefolder/folder1/folder2/aaa.doc&authKey=xxxxxxxx

该路径经过nginx转换参数变为

    http://x.x.x.x:5001/filefolder?addr=folder1/folder2/aaa.doc&authKey=xxxxxxxx

在鉴权接口中判断authKey正确后,即为鉴权通过。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐