我的AWS S3存储桶中有一张图片。将AWS URL放在<img>
标记中,将此图像包含在我的网站中是否安全? URL包含诸如“Amz-Signature”,“Amz-Credential”和“amz-security-token”之类的参数。这些参数是否可以被恶意用于访问我的S3存储桶中的其他文件?
以下是一个示例网址:
https://s3.amazonaws.com/MyBucketName/FileName.jpg?X-Amz-Date=20160126T141139Z&X-Amz-Expires=300&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=Lots_of_letters_and_Numbers2&X-Amz-Credential=MYAMAZON_CREDENTIALS/20160126/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=REALLY_LONG_SECURITYTOKEN
或者,我可以使用AWS SDK从我的C#代码生成到期URL。类似的东西:
var expiryUrlRequest = new GetPreSignedUrlRequest
{
BucketName = WebConfigurationManager.AppSettings["AWSBucketName"],
Key = fileName,
Expires = DateTime.Now.AddHours(3)
};
这会产生一个以“AWSAccessKeyId”作为参数的URL。
这些网址中的任何一个都可以在我的网页中使用吗?在我的网站上使用它们会涉及哪些风险?
非常感谢你的时间。如果您需要更多信息或我不清楚,请告诉我。
编辑:为了进一步了解我的应用程序,用户正在将文件上传到S3存储桶。我正在使用SignalR通过在我的网页上显示S3中的图像来确认图像在桶中,供用户查看。
答案 0 :(得分:5)
不要公开桶。如果这样做,那么user1可能会看到user2的上传文件。
您可以允许用户使用预签名网址检索特定时间段内的单个文件。
GetPreSignedUrlRequest
为您希望用户下载的文件生成预签名网址。<img>
标记中使用该网址。使用这种技术是安全的:
GetPreSignedUrlRequest
电话的一部分)URL使用散列技术来确保无法修改URL,也不会滥用它来获取其他文件。
如果需要显示访问密钥ID,您可以(a)专门为从S3下载文件创建IAM用户,或者(b)在EC2实例上使用IAM角色生成前签名网址。
参考文献:
答案 1 :(得分:0)
首先,有两种方法可以限制对存储桶内容的访问:
如果您希望其他用户访问该图片(例如为您的网站提供网址),则应将该广告管理系统标记为公开。
请勿在任何地方发布带有您的AWS凭证的网址!