我们公司的软件存储在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>
我的方法有什么问题? 有可能这样做吗? 最后你会用什么方法?
答案 0 :(得分:2)
我的方法有什么问题?
我认为你可能过于简化了另一个问题的答案。关键是,假设你有一个IAM用户有权写入存储桶。生成签名URL时,请勿使用该特权用户的凭据签署公开分发的链接。相反,创建一个只具有读取权限的不同IAM用户,并在生成签名URL时使用权限较低的用户凭据。
您的解决方案很简单,假设您拥有某种类型的站点,即授权用户登录的Web应用程序。如果这是真的,那么您创建一个“在此处下载”链接,该链接访问Web应用程序中的端点,该端点检查用户的凭据,如果下载已获得授权,请使用较短的过期时间签署URL,并将浏览器重定向到带有HTTP 302
重定向的签名网址。
如果你没有,那么另一个选项就是你可以分配长而不透明的URL(例如https://example.com/download/aoHxT9x88e1TTrID9VepHfjovG3TtN2iTQLU4N6B/filename.msi
),其中有效的组合在计算上是不可猜测的,给每个用户一个独特的链接......以及基于此类字符串有效性的后端系统,将从S3获取并返回(代理)下载,或者生成具有较短过期时间的签名URL,并重定向请求者。
请注意,在上面的示例中,这不是文件副本的路径,它只是给出了该外观。我有一个像这样运行的系统,存储“令牌”(随机的数字字符串,完全没有意义,它只映射到一个文件和一个授权用户,所有这些都存储在数据库中,而不是嵌入在数据库中每个授权下载的URL,查找每个传入的请求,并根据它找到的内容决定,是否重定向或拒绝请求(延迟后)与404。
没有简单明了的方法可以用“只是”S3做你想做的事。