我们公司的软件存储在 Amazon S3 存储桶的文件夹中,该软件需要由第三方公司下载。我们希望能够通过给出 URL 来控制对软件的访问。
我研究了预签名 URL,但它们会过期,这不好,因为第三方需要永久访问权限。
下面是堆栈溢出中另一个问题的链接: How secure are Amazon AWS Access keys?
发帖人 (AyKarsi) 使用的 URL - https://mywebsite.s3.amazonaws.com/40.pdf?AWSAccessKeyId=[my访问 key ]&Expires=1433297453&Signature=[这组随机数字]
汤姆·安德森(Tom Andersen)似乎回答了他的问题。我厌倦了在 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/*"
]
}
]
}
然后,我获取了该用户的访问 key 并将其放置在以下 URL 中: https://s3.amazonaws.com/bucket-name/folder-name/file-name.msi?AWSAccessKeyId=AKIAJO4RIDGETCCAH55Q
不幸的是,这只会返回错误代码“访问被拒绝”:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>8B394885E81B29A7</RequestId>
<HostId>fpaNduIOIkWGetgWECQMI/mm5rL2GpJ+6P+P5En0LODJDpKWrUwYn+dXbqvgFrb4
</HostId>
</Error>
我上面的方法有什么问题吗? 这样可以吗? 最后你会用什么方法呢?
最佳答案
What is wrong with my method above?
我认为您可能过于简单化了另一个问题的答案。关键是,假设您有一个 IAM 用户有权写入存储桶。生成签名 URL 时,请勿使用该特权用户的凭据来签署公开分发的链接。相反,请创建一个仅具有读取权限的不同 IAM 用户,并在生成签名 URL 时使用权限较低的用户的凭据。
您的解决方案很简单,假设您有某种网站,即授权用户登录的 Web 应用程序。如果是这样,那么您创建一个“在此处下载”链接,该链接会到达 Web 应用程序中的端点,该端点会检查用户的凭据,如果下载已获得授权,则签署一个具有较短到期时间的 URL,并将浏览器重定向到使用 HTTP 302
重定向签名的 URL。
如果您没有,那么另一个选择是分配长的、不透明的 URL(例如 https://example.com/download/aoHxT9x88e1TTrID9VepHfjovG3TtN2iTQLU4N6B/filename.msi
),其中有效的组合在计算上是无法猜测的,为每个用户提供一个唯一的链接...以及一个基于此类字符串有效性的后端系统,将从 S3 获取并返回(代理)下载,或者生成一个签名的 URL 的过期时间很短,并重定向请求者。
请注意,在上面的示例中,这不是文件副本的路径,它只是提供了这种外观。我有一个像这样运行的系统,存储“ token ”(随机的数字字符串,完全没有意义,它只映射到一个文件和一个授权用户,所有这些都存储在数据库中,而不是嵌入到数据库中每个授权下载的 URL),对每个传入请求进行查找,并根据找到的内容决定是重定向还是使用 404 拒绝请求(延迟后)。
没有简单明了的方法可以“仅”使用 S3 来实现您想要的功能。
关于amazon-web-services - 是否可以向第三方提供一个 URL,让他们下载我们存储在 aws 3s 存储桶中的软件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006365/