是否可以为第三方提供一个网址,让他们下载存储在aws 3s存储桶中的软件

时间:2015-06-23 14:59:28

标签: amazon-web-services amazon-s3

我们公司的软件存储在Amazon S3存储桶的文件夹中,该软件需要由第三方公司下载。我们希望能够通过提供URL来控制对软件的访问。

我查看了预先签名的网址,但是这些网址过期并不合适,因为第三方需要永久访问。

下面是堆栈溢出中不同问题的链接: How secure are Amazon AWS Access keys?

海报(AyKarsi)正在使用网址 - https://mywebsite.s3.amazonaws.com/40.pdf?AWSAccessKeyId=[my访问密钥]& Expires = 1433297453& Signature = [此随机数字集合]

汤姆安徒生回答了他的问题。我厌倦了在没有URL过期的情况下流动Tom的步骤:

首先,我创建了一个IAM用户并附加了以下权限策略:

{
"Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "Stmt14350*******0",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket", 
            "GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/folder-name/*"
        ]
    }
  ]
}

然后,我获取了此用户的访问密钥,并将其放在以下URL中: https://s3.amazonaws.com/bucket-name/folder-name/file-name.msi?AWSAccessKeyId=AKIAJO4RIDGETCCAH55Q

不幸的是,这只会返回错误代码Access Denied:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>8B394885E81B29A7</RequestId>
<HostId>fpaNduIOIkWGetgWECQMI/mm5rL2GpJ+6P+P5En0LODJDpKWrUwYn+dXbqvgFrb4
</HostId>
</Error>

我的方法有什么问题? 有可能这样做吗? 最后你会用什么方法?

1 个答案:

答案 0 :(得分:2)

  

我的方法有什么问题?

我认为你可能过于简化了另一个问题的答案。关键是,假设你有一个IAM用户有权写入存储桶。生成签名URL时,请勿使用该特权用户的凭据签署公开分发的链接。相反,创建一个只具有读取权限的不同IAM用户,并在生成签名URL时使用权限较低的用户凭据

您的解决方案很简单,假设您拥有某种类型的站点,即授权用户登录的Web应用程序。如果这是真的,那么您创建一个“在此处下载”链接,该链接访问Web应用程序中的端点,该端点检查用户的凭据,如果下载已获得授权,请使用较短的过期时间签署URL,并将浏览器重定向到带有HTTP 302重定向的签名网址。

如果你没有,那么另一个选项就是你可以分配长而不透明的URL(例如https://example.com/download/aoHxT9x88e1TTrID9VepHfjovG3TtN2iTQLU4N6B/filename.msi),其中有效的组合在计算上是不可猜测的,给每个用户一个独特的链接......以及基于此类字符串有效性的后端系统,将从S3获取并返回(代理)下载,或者生成具有较短过期时间的签名URL,并重定向请求者。

请注意,在上面的示例中,这不是文件副本的路径,它只是给出了该外观。我有一个像这样运行的系统,存储“令牌”(随机的数字字符串,完全没有意义,它只映射到一个文件和一个授权用户,所有这些都存储在数据库中,而不是嵌入在数据库中每个授权下载的URL,查找每个传入的请求,并根据它找到的内容决定,是否重定向或拒绝请求(延迟后)与404。

没有简单明了的方法可以用“只是”S3做你想做的事。