所以这就是我遇到的问题。
我在Amazon S3上有一些对象(文件),每个人都无法公开访问。
现在我想为服务构建一个Web应用程序,该服务的一个功能是用户可以上传保存到S3的文件,用户可以允许该服务的其他用户(但不是一般的公众) )访问这些文件。所以我需要应用程序才能执行以下操作:
1)将请求捕获到S3对象,以便我可以将其记录以用于分析和度量目的。
2)验证发出访问S3对象请求的用户帐户,看他们是否有权下载它。
现在,虽然我了解亚马逊有S3 IAM政策,但我发现他们已经按照每个亚马逊用户,群组和/或广告管理系统进行了应用,所以我不确定我是否可以解决我的问题S3 IAM政策。
我最好的猜测是在我的网络应用上创建路由/request/<oject-id>
以接受请求,保存有关分析/指标用途请求的信息,然后根据相关文件授权用户发出请求,最后要么提供文件(通过将请求重定向到S3),要么在用户未被授权访问该对象时返回错误响应。
这是一个很好的方法吗?这种方法有任何警告/问题/考虑因素吗?不使用IAM政策是错误的吗?如果是这样,我会忽视什么?
另外,我应该指出,我通过在PHP上测试它并将请求重定向到Amazon S3以便为我使用header
命令的对象提供服务来执行小概念验证:
if($allowed) {
header( "Location: $S3ObjectURL" );
}else
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
虽然它确实有效,但我想知道我是否正确行事。我应该使用特定的HTTP代码(301
,302
重定向吗?)以及为什么?
我很感激任何建议和反馈。
答案 0 :(得分:2)
您不需要为服务的每个用户依赖IAM。相反,您可以为Web服务器上的每个对象生成预签名URL,并将其返回给用户,以便他们可以使用它来下载对象。这提供了许多额外的安全性,因为URL是临时的,每次用户想要访问对象时都需要重新生成(允许您重新验证它们)。查看有关如何执行此操作的教程here。