需求问题
公司渗透测试扫描发现了一个未授权访问文件的问题,即外网可以通过文件地址直接访问文件服务器中文件,无需任何认证,造成公司敏感数据泄露。
问题分析
当前获取文件的流程如下
我们的文件地址形如: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正确后,即为鉴权通过。
|