【发布时间】:2020-04-10 19:22:08
【问题描述】:
- 我们有一个 java servlet 应用程序,它将请求重定向到 s3 bucket html 文件,例如,
String htmlURL = "https://s3_bucket.s3.amazonaws.com/118/vtour/tour.html";
resp.sendRedirect(url);
- servlet 应用程序部署在 tomcat 服务器上,所有这些网络配置都通过 nginx 代理通道维护。 nginx 在不同的机器上运行。 Nginx 配置为:
location /JavaServletApp {
proxy_pass http://ip_address_of_tomcat_server:8080;
}
在 s3 上,我们添加了桶策略以仅允许特定 IP 地址访问,如下所示:(理想情况下,我们希望将 sourceIP 设置为仅 nginx 服务器的源IP)。 Tomcat 服务器不可公开访问)
{
"Version": "2012-10-17",
"Id": "Policy1576643187337",
"Statement": [
{
"Sid": "Stmt1576643184762",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::s3_bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"nginx_server_ip",
"tomcat_server_public_ip",
"tomcat_server_private_ip",
]
}
}
}
]
}
注意:S3 存储桶是公开的。
如果我们尝试通过https://nginx/JavaServlet 应用程序渲染 s3 html 文件,则会出现“拒绝访问”错误。但是,如果我们通过 curl 从 nginx 服务器直接(没有 servlet 应用程序)访问 s3 存储桶 html 文件,那么html 文件被渲染。
如果我们将本地笔记本电脑的 ip 地址(公共网关 IP)添加到 s3 存储桶策略中,那么如果我们点击https://nginx/JavaServlet app,则会呈现 S3 上的 html。但这不是一个可行的解决方案。
另外,尝试将Referer设置为nginx-host,在nginx配置中,我们仍然无法通过https://nginx/JavaServlet app访问S3上的html。
【问题讨论】:
-
你也可以尝试 IAM 策略来允许你的 IP
-
如果您重定向到存储桶,那么(当然)浏览器的 IP 地址就是 S3 将看到的 IP 地址,因为浏览器直接连接到存储桶。对我来说,不清楚您实际上试图通过访问控制公共存储桶来完成什么,为什么?
标签: java nginx amazon-s3 servlets