我有一个 Django 应用程序,需要访问 AWS S3 存储桶中的文件。我们目前正在使用django-storages成功完成此操作,其中文件可以通过url
方法下载(代码here)。
该方法的关键是boto提供的generate_url()
方法:
return self.connection.generate_url(self.querystring_expire,
method='GET', bucket=self.bucket.name, key=self._encode_name(name),
headers=headers,
query_auth=self.querystring_auth, force_http=not self.secure_urls,
response_headers=response_headers)
但是,此方法返回一个带有签名和到期的网址,打开该文件到世界 60分钟(或指定的时间段;我认为60分钟是默认值)。
例如:对位于generate_url()
的文件运行s3://my-bucket/myfile.txt
将返回网址:
https://s3.amazonaws.com/my-bucket/myfile.txt?
X-Amz-Date=20150710T161246Z
&X-Amz-Expires=300
&X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Signature=<SIGNATURE>
&X-Amz-Credential=<CREDENTIAL>
&X-Amz-SignedHeaders=Host
&x-amz-security-token=<SECURITY_TOKEN>
当点击时,按预期下载文件。问题是,在通过访问此URL“打开”文件后,“无符号”URL(https://s3.amazonaws.com/my-bucket/myfile.txt
)也会打开60分钟 - 无需签名和其他查询字符串参数。
是否有办法在每次访问文件时都要求签名?似乎应该有。即使我将到期时间更改为1秒,也可以在1秒内向全世界开放网址。
我正在使用敏感信息,并且需要符合某些安全标准等,因此让我的文件向世界开放一秒钟就是禁忌。
是否有人知道如何为每次下载都需要签名的文件生成AWS S3网址?
我一直在探索使用代理服务器,但这些似乎是他们做同样的事情,只是明显地隐藏了最终用户的网址。示例here和here。但是文件仍然可以访问(没有签名)给世界(如果有人 - 或机器人 - 能够猜出S3网址。不太可能,我知道,但仍然不允许)。
理想情况下,我想找到一个Python / Django包,它以100%安全的方式处理文件,可以通过url提供。