我需要向个人提供财务报表,我正在使用S3。到目前为止,我正在做的是使用public-read
创建文件Key
并创建一个唯一的uuid.uuid4()
。
这是否可以接受,或者我怎么能让这更安全?不能选择为每个人发送身份验证密钥。
答案 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
。这是您控制的网站上的页面,除非客户通过您的网站的身份验证系统进行身份验证,否则无法访问该页面。这是如何工作的:
https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf
目前只有经过S3身份验证的用户才能下载pdf,而不是您的客户。https://example.org/u/12345/statements/2011-04
作为“2011年4月财务报表”网址提供给您的客户。12345_2011-04.pdf
为ABCDEFGaccesskeyid
创建查询字符串请求身份验证URL,并在将来30秒内设置到期时间。您最终得到的链接如下所示:https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620&
Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
Cache-control: private,max-age=30
和Location: https://financial-statements.s3.amazonaws.com/12345_2011-04.pdf?AWSAccessKeyId=ABCDEFGaccesskeyid&expires=1175139620&
Signature=rucSbH0yNEcP9oM2XNlouVI3BH4%3D
答案 2 :(得分:1)
尽管版本4 UUID应该包含随机数据,但我不想依赖Python uuid.uuid4()
使用的RNG安全随机的事实。 Python文档没有提到随机性的质量,所以我担心你最终可能会出现可猜测的UUID。
我不是加密专家,所以我不会建议一个特定的替代方案,但我会建议使用一些旨在生成加密quailty随机数据的东西,并将其转换为可用作S3的东西key(我不确定S3密钥数据的要求是什么,但我猜它们应该是类似文件名的。)
说实话,除了一个不可饶恕的名字之外没有任何安全感仍然让我感觉不好。正如Ian Clelland在评论中所暗示的那样,这些名字的无意泄漏似乎很容易。