在S3上发送“安全”财务报表

时间:2012-01-20 00:08:55

标签: python security amazon-s3

我需要向个人提供财务报表,我正在使用S3。到目前为止,我正在做的是使用public-read创建文件Key并创建一个唯一的uuid.uuid4()

这是否可以接受,或者我怎么能让这更安全?不能选择为每个人发送身份验证密钥。

3 个答案:

答案 0 :(得分:7)

您是否考虑过为S3上的文件生成过期网址。

from boto.s3.connection import S3Connection

conn = S3Connection(AWS_ACCESS_KEY_ID,
                    AWS_SECRET_ACCESS_KEY, is_secure=False)

# The generated temp_url remains valid for 60 seconds in this case
temp_url = conn.generate_url(60, 'GET', bucket=bucket_name, 
                             key=file_name, force_http=True)

答案 1 :(得分:3)

如果您已经拥有用户身份验证和登录系统,则可以通过分发链接到您的网站的PDF链接来大大提高安全性,然后重定向到使用{{3创建的S3网址(又名“临时网址”)。

让我们假设你有以下内容:

  • financial-statements包含您的PDF的S3存储桶。存储桶和所有pdf都标记为authenticated-read
  • financial-statement-reader S3用户拥有自己的访问密钥ABCDEFGaccesskeyid
  • 网址https://example.org/u/12345/statements/2011-04。这是您控制的网站上的页面,除非客户通过您的网站的身份验证系统进行身份验证,否则无法访问该页面。

这是如何工作的:

  1. 创建财务报表pdf并上传到s3:https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf目前只有经过S3身份验证的用户才能下载pdf,而不是您的客户。
  2. 将网址https://example.org/u/12345/statements/2011-04作为“2011年4月财务报表”网址提供给您的客户。
  3. 客户获取此网址并在必要时对您的网站进行身份验证。
  4. 您使用访问密钥12345_2011-04.pdfABCDEFGaccesskeyid创建查询字符串请求身份验证URL,并在将来30秒内设置到期时间。您最终得到的链接如下所示:https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620& Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
  5. 您使用HTTP 307(临时重定向),Cache-control: private,max-age=30Location: https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620& Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
  6. 回复客户的GET请求
  7. 客户直接从S3下载PDF。如果某人恶意窃取此网址,他们只能在30秒内下载客户的声明,之后网址就会变得无用。

答案 2 :(得分:1)

尽管版本4 UUID应该包含随机数据,但我不想依赖Python uuid.uuid4()使用的RNG安全随机的事实。 Python文档没有提到随机性的质量,所以我担心你最终可能会出现可猜测的UUID。

我不是加密专家,所以我不会建议一个特定的替代方案,但我会建议使用一些旨在生成加密quailty随机数据的东西,并将其转换为可用作S3的东西key(我不确定S3密钥数据的要求是什么,但我猜它们应该是类似文件名的。)

说实话,除了一个不可饶恕的名字之外没有任何安全感仍然让我感觉不好。正如Ian Clelland在评论中所暗示的那样,这些名字的无意泄漏似乎很容易。