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

use*_*227 5 security amazon-s3 amazon-web-services

我的AWS S3存储桶中有一个映像.通过将AWS URL放在<img>标记中,将此图像包含在我的网站中是否安全?该URL包括诸如"Amz-Signature","Amz-Credential"和"amz-security-token"之类的参数.这些参数可以被恶意用于访问我的S3存储桶中的其他文件吗?

这是一个示例URL:

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
Run Code Online (Sandbox Code Playgroud)

或者,我可以使用AWS SDK从我的C#代码生成到期URL.就像是:

var expiryUrlRequest = new GetPreSignedUrlRequest
{
    BucketName = WebConfigurationManager.AppSettings["AWSBucketName"],
    Key = fileName,
    Expires = DateTime.Now.AddHours(3)
};
Run Code Online (Sandbox Code Playgroud)

这会产生一个以"AWSAccessKeyId"作为参数的URL.

这些网址中的任何一个都可以安全地在我的网页中使用吗?在我的网站上使用它们会涉及哪些风险?

非常感谢您的宝贵时间.如果您需要其他信息或我不清楚,请告诉我.

编辑:为了进一步了解我的应用程序,用户正在将文件上传到S3存储桶.我正在使用SignalR通过在我的网页上显示来自S3的图像来确认图像在桶中,供用户查看.

Mat*_*ser 5

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

您可以允许用户使用预签名URL在特定时间段内检索单个文件.

  1. 将S3存储桶标记为私有.
  2. 使用GetPreSignedUrlRequest生成你想要的用户下载文件的预标识的URL.
  3. 在您的<img>代码中使用该网址.

使用这种技术是安全的:

  1. 用户只能在您允许的时间范围内下载文件,直到过期日期(您将其设置为GetPreSignedUrlRequest呼叫的一部分)
  2. 您在URL中看到的凭据可能与用于创建URL的凭据相同.但是向用户展示它们是安全的.
  3. 用户无法从存储桶中下载任何其他文件.

URL使用散列技术来确保URL不能被修改,也不能滥用它来获取其他文件.

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

参考文献:

  • 这是预先签名的URL工作方式,AWSAccessKeyId是临时的,签名是确保URL无法修改的方法.你绝对可以使用它 (2认同)
  • 实际上我只是双重检查(我使用2种不同的方式来生成我的网址),并且使用boto3实际上使用我真正的IAM访问密钥.但由于这是一个专门从S3下载的IAM用户,并且您无法获取我的密钥,因此这仍然是安全的,并且您使用的是正确的方法.我确认你可以坚持下去 (2认同)
  • URL中的凭据可以与用于生成临时URL的访问密钥相同.但是,仅包括访问密钥部分并且仍然是安全的.如果这仍然是一个问题,那么(如Tom提到的那样),您可以创建专用于从S3下载的IAM凭证.我会更新我的答案以反映所有这些. (2认同)