背景:

公司交付项目,文件服务java + minio实现文件基本功能。其中包含文件上传与下载与在线预览,由于文件下载功能实现方式问题(web直接调用文件预览接口,有minio直接返回可预览路径二次请求实现文件下载)。

在公司局域网内没有问题,到客户环境文件无法下载,客户环境文件上传直接同网段局域网内部通讯没有问题,但是下载请求为公网,又不想打破网关内内网通讯,静态低敏访问直接开启对外访问权限的业务逻辑,所以,解决问题的方式只有一个,就是下载功能返回的路径必须是公网可以正常访问。

剖析问题:

代理实现,配合dmz区 (这里用的是nginx)代理直接将请求转发一下就可以了,思路是对的,但是请求穿透到minio服务器后访问被拒绝,验证密钥失败。

密钥?校验失败?要解决这个问题就要先了解minio加密与校验的环节,没有必要非的知道minio的加密手段,校验失败肯定就是在校验前,提供的校验参数与加密时不一致,问题出在哪里了呢?在转发前是没有问题的啊,转发之后可以访问了,但是校验不通过,那一定就是转发环节出了问题,结合以上分析,去minio找了官方文档,按照官方配置还是不可以。

肯定是参与加密的参数不满足呀!

解决问题:

minio(yaml.xml)配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


minio:


  oss:


    policyExpire: 300


    accessKeyId:  123456


    accessKeySecret:  123456


    endpoint: http://127.0.0.1:9199


    # 可以公网访问的域名,将minio返回的 ip 和端口直接替换就可以访问了


    web_endpoint: https://demo.chenyb-sec.com


    bucketName: oss-chenyb


    # km 最大支持 5g


    maxSize:  50

nginx配置

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162


server {


    listen       80;


    listen  443 ssl;


    server_name  https://demo.chenyb-sec.com;


 


    #选配 优化属性


    ignore_invalid_headers off;


    client_max_body_size 1000m;


    proxy_buffering off;


 


    #必须 防止请求头丢失


    underscores_in_headers on;   


 


    #选配 优化属性


    proxy_set_header        Host            $http_host;


    proxy_set_header        X-Real-IP       $remote_addr;


    proxy_set_header        X-Scheme        $scheme;


    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;


    add_header Pragma       "no-cache";


 


    #选配 优化属性


    # 针对缺失"X-Content-Type-Options"头漏洞整改建议


    add_header X-Content-Type-Options nosniff;   #影响demo服务登出等功能


    # 针对缺失"X-XSS-Protection"头漏洞整改建议


    add_header X-XSS-Protection "1; mode=block";


    # 针对点击劫持:X-Frame-Options头缺失漏洞的整改建议


    #add_header X-Frame-Options "SAMEORIGIN";


    # 针对缺少HTTP Strict-Transport-Security头漏洞的整改建议


    add_header Strict-Transport-Security "max-age=31536000;includeSubdomains;";


    


   


 


    #必须 minio 转发路由


    # 路由与minio.oss.bucketName  保持一致 


   location /oss-chenyb/ {


 


       # minio.oss.endpoint 参数,参与签名(服务直连地址)


       proxy_set_header X-Real-IP 127.0.0.1:9199;


 


       # minio.oss.endpoint 参数,参与签名(服务直连地址)


       proxy_set_header Host 127.0.0.1:9199;


       


       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


       proxy_set_header X-Forwarded-Proto $scheme;


 


       proxy_connect_timeout 300;


       # Default is HTTP/1, keepalive is only enabled in HTTP/1.1


       proxy_http_version 1.1;


       proxy_set_header Connection "";


       chunked_transfer_encoding off;


 


       # minio 服务直连地址


       proxy_pass  http://127.0.0.1:9199;


    }

注意两个配置文件呼应关系即可

  • web_endpoint:可以请求到nginx的域名

  • bucketName:最好是nginx路由规则

  • endpoint:能请求到minio的通讯地址,与proxy_pass、proxy_set_header Host、proxy_set_header X-Real-IP保持一致,因为要参与校验