amazon-web-services - 是否可以向第三方提供一个 URL,让他们下载我们存储在 aws 3s 存储桶中的软件

标签 amazon-web-services amazon-s3

我们公司的软件存储在 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/

相关文章:

Nginx Proxy Pass S3 特定的 html 文件

amazon-web-services - 在 aws ECS 集群中显示 docker 容器日志

amazon-web-services - 使用 aws sts assume-role 配置 AWS EMR spark

amazon-web-services - AWS ELB 根据子域进行不同的路由

javascript - AWS Pagination listObjects node.js

php - 如何从 amazon s3 对象中获取键数组

javascript - 带有 Promise 的 AWS Javascript SDK

amazon-web-services - 如何在单个 URL 中包含 S3 存储桶名称和区域/端点?

laravel - docker 组成 : how to use minio in- and outside of the docker network

ios - Amazon S3 阻止从 URL 访问文件