我计划将用户重定向到存储在 S3 中的敏感资源的预签名 URL。这些是在检查用户权限后生成的,并且具有激进的超时(30 秒)。但是,我担心的是,我的客户端计算机上存在的某些恶意软件是否有可能捕获 url 并在 URL 的过期时间内仍然下载文件。还是我太偏执了?
如果之前已经回答过这个问题,请指出我的方向。感谢你的帮助。
任何在到期前获得 URL 的人都可以使用它来访问数据。S3 支持限制允许访问数据的 IP 地址的存储桶策略:
http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html
但是在这种情况下,您担心客户端计算机上的恶意软件。所以这无济于事。您是否考虑过加密数据以便只有客户端进程才能解密它?
您仍然容易受到不安全/粗心的客户端以某种方式泄露数据的影响。
我找到了这个 - http://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenRuby.html 并试了一下。它似乎有效。解释文档中的代码 -
# Start a session with restricted permissions.
sts = AWS::STS.new()
policy = AWS::STS::Policy.new
policy.allow(
:actions => ["s3:ListBucket"],
:resources => "arn:aws:s3:::#{bucket_name}"
).condition.add(:like, :referer, "domain.com")
session = sts.new_federated_session(
'User1',
:policy => policy,
:duration => 2*60*60)
因此,我们创建的策略可以具有客户端下载的原始 IP 地址或/并且可能是设置为我的应用程序域的 aws:Referer 字段。我认为这至少为您的资源提供了一层障碍。我明白了,IP 地址或引用者很容易被欺骗。但总比没有任何保护要好。
在浏览器中,Web Cryptography API可用于加密/解密通过预签名 S3 url 共享的内容,以确保其保持私密性。
截至今天,该 API 处于实验阶段,但已被所有现代浏览器支持。
通过使用此 API,可以在浏览器中生成私钥/公钥对。私钥应存储在本地存储中,公钥应发送到 lambda 函数。当我们请求 S3 内容时,我们必须先去 lambda 函数。lambda 函数使用公钥加密我们想要共享的内容,将其存储在 S3 存储桶中,并使用预签名 URL 共享加密对象。
通过这种方法,对象中的内容仍然是私有的,即使某个未预授权的人拥有预签名的 URL。
没有尝试过,但 Amazon S3 服务支持使用您自己的密钥进行加密。