【问题标题】:Uploading to Amazon S3 without access & secret key在没有访问权限和密钥的情况下上传到 Amazon S3
【发布时间】:2012-03-05 21:53:57
【问题描述】:

通常当我上传到 S3 存储时,我使用这样的 AmazonS3Client:

var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, s3Config)

这适用于内部使用,但现在我正在考虑向外部用户提供应用程序,并且不希望我们的(秘密)访问和密钥出现在那里。我已经设置了一个 S3 存储桶,其存储桶策略允许匿名用户上传 (PutObject),但我现在如何使用 Amazon 开发工具包?如果不提供访问权限和密钥,我似乎找不到任何方法。

【问题讨论】:

    标签: c# .net amazon-s3


    【解决方案1】:

    您可能不应该为公开写入而打开存储桶。你很容易受到很多攻击,需要密切关注你的日志文件等。

    更好的解决方案是保留存储桶上的默认私有访问权限,然后创建一个 IAM 用户,该用户仅具有所需区域的上传(可能还有下载)权限。然后,当有人想要上传文件时,您可以调用具有 IAM 密钥的服务器来计算并返回“预签名帖子”,这将允许您的客户端应用程序将新文件发布到服务器。然后,您可以在服务器上使用您想要的任何身份验证工具来决定是否允许某人上传,包括不进行身份验证 - 但具有滥用检测功能。当您执行此操作时,IAM 用户的密钥永远不会发送到客户端,这可能是在调试会话等中。

    由于整个帖子是预签名的,您还可以决定允许文件去哪里、上传的文件名等,并在服务器响应中返回。

    【讨论】:

    • 这篇文章应该是正确的,因为它提供了一个实用、安全和智能的解决方案。
    【解决方案2】:

    您只需将null 传递给accessKeysecretKey,即可使用SDK 进行任何匿名允许的操作。

    查看此related question of mine,其中包含亚马逊员工在其开发者论坛上的官方回复!来自链接问题的相关信息:

    这是来自他们论坛上的亚马逊官方员工:

    从 SDK 的 1.3.8.0 版本开始,您可以为访问传递 null 和密钥,SDK 将跳过签名过程并尝试 像 GetObject 这样的操作作为公共操作。

    标准

    【讨论】:

    • 哇!这似乎是一个明显而简单的方法。幸好你也问了这个问题,否则我会因为在问之前没有尝试过而感到尴尬。 :) 让我试试看。
    • @BlueVoodoo 呵呵,很高兴能帮到你两次!在提问和回答中!我有点惊讶他们没有提供只需要 s3Config 的构造函数,不需要指定 accessKeysecretKey... 我觉得这样会更直观!
    • 嗯。尝试初始化分段上传时出现 ArgumentNullException。原因:“指定的 AWS 秘密访问密钥为 NULL!”。代码如下所示: InitiateMultipartUploadResponse initResponse = s3Client.InitiateMultipartUpload(initRequest);
    • 是的,我不知道我已经过时了。更新到最新版本,已经可以看到很多新功能了。我遇到了另一个问题“匿名用户无法启动分段上传”,但这是一个单独的问题,我想我总是可以通过在服务器端启动来解决它。谢谢你的帮助。会接受这个答案。
    • 我知道我在这个讨论中迟到了,但是有没有办法使用 awscli 实现相同的结果?我尝试传递 NULL,让它们保持空白,但它没有用。
    猜你喜欢
    • 2017-05-05
    • 2016-04-16
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2023-01-25
    • 2022-08-05
    相关资源
    最近更新 更多