这是一个很好的方法来捕获对AmazonS3对象的请求,并在web应用程序中授权某些用户的某些请求吗


Would this be a good approach to capture requests to Amazon S3 objects and authorize certain requests from certain users would within a web app?

所以这是我遇到的问题。

我在AmazonS3上有一些对象(文件),不是每个人都可以公开访问。

现在我想为一项服务构建一个web应用程序,该服务的一个功能是用户可以上传保存到S3上的文件,用户可以允许该服务的其他用户(但不是一般的公众)访问这些文件。所以我需要该应用程序能够做到以下几点:

1) 捕获对S3对象的请求,以便我可以将其记录下来用于分析和度量目的。

2) 对请求访问S3对象的用户帐户进行身份验证,以查看他们是否有权下载该对象

现在,虽然我知道亚马逊有S3 IAM政策,但我发现它们是在每个亚马逊用户、组和/或Bucket的基础上应用的,所以我不确定我是否可以使用S3 IAM政策解决我的问题。

我的最佳猜测是在我的web应用程序上创建一个路由/request/<oject-id>来接受请求,保存有关请求的信息以用于分析/度量目的,然后授权用户根据有问题的文件发出请求,最后要么提供文件(通过将请求重定向到S3),要么在用户未被授权访问对象时返回错误响应。

这是一个好方法吗?这种方法是否有任何注意事项/问题/考虑因素?不使用IAM政策是错的吗?如果是的话,是在俯瞰什么吗?

此外,我应该指出,我在PHP上测试了它,并将请求重定向到AmazonS3以服务于对象,我使用header命令,如下所示:

if($allowed) {
    header( "Location: $S3ObjectURL" );
}else
    header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

虽然它确实有效,但我想知道我做得是否正确。我应该使用特定的HTTP代码(301302?)重定向吗?为什么?

如果有任何建议和反馈,我将不胜感激。

您不需要为服务的每个用户依赖IAM。相反,您可以为web服务器上的每个对象生成一个预先签名的URL,并将其返回给用户,以便用户可以使用它下载该对象。这提供了很多额外的安全性,因为URL是临时的,每次用户想要访问对象时都需要重新生成(允许您重新验证它们)。在这里查看有关如何做到这一点的教程。