java - 当请求通过 servlet 重定向到 S3 存储桶时,S3 存储桶策略不起作用

标签 java nginx amazon-s3 servlets

  1. 我们有一个 java servlet 应用程序,它将请求重定向到 s3 存储桶 html 文件,例如,
String htmlURL = "https://s3_bucket.s3.amazonaws.com/118/vtour/tour.html";
resp.sendRedirect(url);
  • servlet 应用程序部署在 tomcat 服务器上,所有这些网络配置都通过 nginx 代理 channel 维护。 nginx 在不同的机器上运行。 Nginx 配置为:
  •     location /JavaServletApp {
             proxy_pass  http://ip_address_of_tomcat_server:8080;
        }
    

    在 s3 上,我们添加了存储桶策略,仅允许访问特定 IP 地址,如下所示:(理想情况下,我们希望将源 IP 设置为仅 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 存储桶是公共(public)的。

    如果我们尝试通过 https://nginx/JavaServlet 渲染 s3 html 文件应用程序,它会给出“访问被拒绝”错误。但是,如果我们通过curl从nginx服务器直接(没有servlet应用程序)点击s3存储桶html文件,那么该html文件就会被渲染。

    如果我们将本地笔记本电脑的 IP 地址(公共(public)网关 IP)添加到 s3 存储桶策略中,那么如果我们点击 https://nginx/JavaServlet app,S3上的html被渲染。但这不是一个可行的解决方案。

    另外,尝试将Referer设置为nginx-host,在nginx配置中,我们仍然无法通过https://nginx/JavaServlet访问S3上的html应用程序。

    Workflow

    最佳答案

    正如@Michel所说,因为你使用:

    resp.sendRedirect(url);
    

    存储桶将接收来自客户端浏览器的请求,因此您无法为其应用良好的策略。

    AWS 处理这种情况的方法是使用 GeneratePresignedURL并将客户端重定向到生成的 URL。

    关于java - 当请求通过 servlet 重定向到 S3 存储桶时,S3 存储桶策略不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388651/

    相关文章:

    ios - Amazon S3 Cognito 同步

    java - 来自数据库的 JTable 中的多个条目

    apache-spark - Spark是否支持对S3中的 Parquet 文件进行真实的列扫描?

    java - 从JAR播放.wav文件时遇到问题

    php - nginx - 您要找的页面暂时不可用

    node.js - Node 中的 502 Bad Gateway + Heroku 上的 nginx 代理设置

    ruby-on-rails - ubuntu 服务器(nginx+passenger+capistrano)上的 Rails 应用程序日志在哪里?

    amazon-s3 - 每当我将图像上传到 S3 AWS 时,如何设置 'always make image public'?

    java - 无法编译简单的JFACE程序; java.lang.NoClassDefFoundError

    java - getSupportActionBar() 空指针异常