我打算将用户重定向到存储在S3中的敏感资源的预签名网址。这些是在检查用户权限后产生的,并且具有激进的超时(30秒)。但我担心的是,我的客户端计算机上的某些恶意软件是否可能捕获该URL并仍然在URL的过期时间内下载该文件。或者我只是太偏执了?
如果之前已经回答过,请指出我的方向。感谢您的帮助。
答案 0 :(得分:4)
任何在到期前获取URL的人都可以使用它来访问数据。 S3支持限制允许访问数据的IP地址的存储桶策略:
http://docs.aws.amazon.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html
但是在这种情况下,您担心客户端计算机上的恶意软件。所以这没有用。您是否考虑过对数据进行加密,以便只有客户端进程可以对其进行解密?
你仍然容易受到一个不安全/粗心的客户端泄漏数据的影响。
答案 1 :(得分:2)
我找到了这个 - http://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenRuby.html 并尝试了一下。它似乎有效。解释doc中的代码 -
# 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地址或引用者很容易被欺骗。但它比没有任何保护更好。
答案 2 :(得分:0)
在浏览器中,Web Cryptography API可用于加密/解密通过预先签名的S3 url共享的内容,以确保它保持私有。
到目前为止,该API尚处于试验阶段,但supported by every modern browsers。
通过使用此API,可以在浏览器中生成专用/公用密钥对。私钥应存储在本地存储中,而公钥应发送给lambda函数。当我们请求S3内容时,我们必须首先转到lambda函数。 lambda函数使用公共密钥对我们要共享的内容进行加密,将其存储在S3存储桶中,并使用预先签名的URL共享加密的对象。
通过这种方法,即使对象没有预告,但对象中的内容仍是私有的。
未尝试,但Amazon S3服务supports encryption with your own key 。