在没有访问密钥和秘密密钥的情况下上传到Amazon S3

9
通常情况下,当我上传到S3存储时,我会使用类似于这样的AmazonS3Client:
var client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey, s3Config)

对于内部使用来说,这样很好,但现在我正在考虑为外部用户提供一个应用程序,不想让我们的 (sacret) 访问密钥和密钥暴露出来。我已经设置了一个 S3 存储桶,并创建了一个存储桶策略,允许匿名用户上传 (PutObject),但是如何使用 Amazon SDK 呢?我似乎找不到任何不提供访问密钥和密钥的方式。

2个回答

18

通常情况下,您不应该将存储桶设置为公共写入。这样会面临许多攻击,并且需要密切关注日志文件等内容。

更好的解决方案是保持默认的私有访问权限,并创建一个只具备所需区域上传(以及可能的下载)权限的IAM用户。然后,当某人想要上传文件时,您可以使用调用具备IAM密钥的服务器来计算并返回“预签署的提交”,使您的客户端应用程序能够向服务器上载新文件。然后,您可以在服务器上使用任何授权工具来决定是否允许某人上传,包括无授权但具有滥用检测功能。这样做时,IAM用户的秘密密钥永远不会发送到客户端,客户端可能处于调试会话等状态。

由于整个提交都是预签署的,因此您还可以决定文件允许去哪里、上传的文件名等,并将其返回到服务器响应中。


这篇文章应该是正确的,因为它提供了一个功能性、安全性和智能性的解决方案。 - juanba1984

8
你只需要对accessKeysecretKey传递null即可,这样你就可以使用SDK进行任何匿名操作。请查看我的相关问题,其中包括了来自亚马逊开发者论坛官方回复的信息!来自关联问题的相关信息如下所示: 这是亚马逊公司员工在论坛上的正式回复: “从SDK 1.3.8.0版本开始,您可以对访问和秘密密钥传递null,并且SDK将跳过签署过程并尝试像GetObject这样的操作作为公共操作。” Norm

2
哇!那似乎是一个明显而简单的方法。幸好你也问了这个问题,否则我会因为在提问之前没有尝试而感到尴尬。让我试一试。 - BlueVoodoo
1
尝试初始化我的分段上传时,我遇到了一个ArgumentNullException。原因是:“指定的AWS Secret Access Key为空!”代码如下:InitiateMultipartUploadResponse initResponse = s3Client.InitiateMultipartUpload(initRequest); - BlueVoodoo
1
是的,我没有意识到自己如此过时。已更新至最新版本,已经看到了许多新功能。我遇到了另一个问题:“匿名用户无法启动分段上传”,但这是一个单独的问题,我想我可以通过在服务器端启动来解决它。感谢您的帮助。将接受此答案。 - BlueVoodoo
1
我知道我来晚了,但有没有一种使用awscli实现相同结果的方法?我尝试传递NULL,保持它们为空白,但没有成功。 - Swapnil Dinkar
我知道我来晚了,现在是否可以在没有访问和秘密密钥的情况下上传到Amazon S3? - Karthick Kumar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接