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

Security 在我的网页上使用AWS S3存储桶中的图像链接安全吗?,security,amazon-web-services,amazon-s3,Security,Amazon Web Services,Amazon S3,我的AWS S3存储桶中有一个图像。将AWS URL放置在标签中,将此图像包含在我的网站中是否安全?URL包含参数,如“Amz签名”、“Amz凭据”和“Amz安全令牌”。这些参数是否会被恶意用于访问我S3存储桶中的其他文件 以下是一个示例URL: https://s3.amazonaws.com/MyBucketName/FileName.jpg?X-Amz-Date=20160126T141139Z&X-Amz-Expires=300&X-Amz-Algorithm=AWS4-

我的AWS S3存储桶中有一个图像。将AWS URL放置在
标签中,将此图像包含在我的网站中是否安全?URL包含参数,如“Amz签名”、“Amz凭据”和“Amz安全令牌”。这些参数是否会被恶意用于访问我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
或者,我可以使用AWS SDK从我的C#代码生成过期URL。类似于:

var expiryUrlRequest = new GetPreSignedUrlRequest
{
    BucketName = WebConfigurationManager.AppSettings["AWSBucketName"],
    Key = fileName,
    Expires = DateTime.Now.AddHours(3)
};
这将生成一个以“AWSAccessKeyId”作为参数的URL

在我的网页中使用这些URL是否安全?在我的网站上使用它们会有什么风险

非常感谢您抽出时间。如果您需要更多信息或我不清楚,请告诉我


编辑:为了进一步了解我的应用程序,用户正在将一个文件上载到S3存储桶。我使用SignalR在我的网页上显示S3中的图像以供用户查看,从而确认图像是否在存储桶中。

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

  • Private-用户需要AWS凭据才能访问该文件(与您的答案中所示的方式相同)
  • Public-每个人都可以访问bucket()的内容
如果您希望其他用户访问该图像(例如,通过为您的网站提供URL),则应将该存储桶标记为public


不要在任何地方发布带有AWS凭据的url!!!

不要将存储桶公开。如果这样做,则user1可能会看到user2上载的文件

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

  • 将S3存储桶标记为private
  • 使用
    GetPreSignedUrlRequest
    为您希望用户下载的文件生成预签名URL
  • 标记中使用该URL
  • 使用此技术是安全的:

  • 用户只能在您允许的时间范围内下载文件,直到过期日期(您将其设置为
    GetPreSignedUrlRequest
    调用的一部分)
  • 您在URL中看到的凭据可能与用于创建URL的凭据相同。但是可以安全地向用户显示这些凭据
  • 用户无法从bucket下载任何其他文件
  • URL使用哈希技术来确保URL不能被修改,也不能被滥用来获取其他文件

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

    参考资料:


    很高兴知道,感谢您伸出援助之手。我不希望用户能够访问存储桶中的其他文件。您认为如果我将文件公开,加密文件名足以确保用户无法访问存储桶中的其他文件吗?我将研究显示该图像的其他方式,因为这听起来可能是一种安全措施风险。不幸的是,如果bucket是公共的,则意味着其中的所有文件也是公共的。您可能有一个临时公共bucket来处理显示功能,然后将图像移动到其他私有bucket(但图像显然会)停止对用户可见。或者,您可以指定一个IP地址的白名单来访问您的bucket,但请记住,在bucket上指定的策略将应用于其所有内容。只需澄清一点:当生成一个以“AWSAccessKeyId”为参数的URL时(这称为预签名URL)包含的密钥是随机生成的临时访问密钥。例如,预签名的url可以安全地用于共享文件,并且不会授予您对整个存储桶的访问权限。请参阅Matt Houser的回答谢谢您的提示。但是,当我使用
    GetPreSignedUrlRequest
    时,它会返回带有
    AWSAccessKeyId=
    签名的url=参数。向用户提供此信息安全吗?这是预签名URL的工作方式,AWSAccessKeyId是临时的,签名是确保URL无法修改的方式。你可以肯定地这样做。是的,我做了几次,但使用的是python boto3包。我不是c#dev,但如果你有相同的访问权限s密钥作为在AWS中为您的IAM用户生成的密钥,那么在您的生成中肯定有错误(url中生成的临时访问密钥通常以“ASIAI”开头,而经典访问密钥以“akai”开头)。实际上,我只是仔细检查了一下(我使用两种不同的方式生成我的url),并且使用boto3实际上使用了我真正的IAM访问密钥。但是,由于这是一个专门从S3下载的IAM用户,并且您无法获得我的密钥,因此这仍然是安全的,并且您使用的方法正确。我确认您可以使用此方法。URL中的凭据可能与用于生成临时URL的访问密钥相同。但是,在仅包括访问密钥部分并且仍然安全。如果这仍然是一个问题,那么(正如Tom提到的),您可以创建一个专用于从S3下载的IAM凭据。我将更新我的答案以反映所有这些。