在我的网页上使用AWS S3存储桶中的图像链接是否安全?

时间:2016-01-26 14:45:13

标签: security amazon-web-services amazon-s3

我的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中的图像来确认图像在桶中,供用户查看。

2 个答案:

答案 0 :(得分:5)

不要公开桶。如果这样做,那么user1可能会看到user2的上传文件。

您可以允许用户使用预签名网址检索特定时间段内的单个文件。

  1. 将S3存储桶标记为私有。
  2. 使用GetPreSignedUrlRequest为您希望用户下载的文件生成预签名网址。
  3. <img>标记中使用该网址。
  4. 使用这种技术是安全的:

    1. 用户只能在您允许的时间范围内下载文件,直到过期日期(您设置为GetPreSignedUrlRequest电话的一部分)
    2. 您在网址中看到的凭据可能与用于创建网址的凭据相同。但是向用户展示它们是安全的。
    3. 用户无法从存储桶中下载任何其他文件。
    4. URL使用散列技术来确保无法修改URL,也不会滥用它来获取其他文件。

      如果需要显示访问密钥ID,您可以(a)专门为从S3下载文件创建IAM用户,或者(b)在EC2实例上使用IAM角色生成前签名网址。

      参考文献:

答案 1 :(得分:0)

首先,有两种方法可以限制对存储桶内容的访问:

如果您希望其他用户访问该图片(例如为您的网站提供网址),则应将该广告管理系统标记为公开。

请勿在任何地方发布带有您的AWS凭证的网址!