我想为我的s3水桶提供预定的网址,并提供有效期限。 .net sdk很好地生成了这些网址,但看着它们让我有点担心:
https://s3.amazonaws.com/upload_youtipit/myfile?AWSAccessKeyId=**MYACCESSKEY**&Expires=1317924047&response-content-disposition=attachment;filename=feedback.jpg&response-content-type=image/jpeg&Signature=podKJSrNeFel6%2B0aOneb342H5GA%3D
为什么需要将我的(公共)AWSAccessKey放入Url?这不应该保密吗?我知道这不是秘密,但我仍然觉得在公开场合暴露它感觉不舒服。
有多少人拥有我的公钥,可以猜测/强行使用我的私钥?
答案 0 :(得分:31)
访问密钥ID不是秘密,不需要保护。
事实上,如果您希望他们访问S3对象,您可以将随机URL提供给随机的陌生人。他们可以看到该URL中的访问密钥,但无法对您未授权的任何内容执行任何操作。
参考:http://docs.amazonwebservices.com/AWSSecurityCredentials/1.0/AboutAWSCredentials.html#AccessKeys
答案 1 :(得分:10)
我同意接受的答案,但有一种简单的方法可以做你想做的事。
您需要使用Amazon IAM来创建只能读取文件的用户(这并不重要,但它们至少需要只读取您正在处理的存储桶)。然后使用THAT用户AWS ID和secret生成下载链接。
这不会打开你的整个桶,因为看到这个人需要这个IAM读者的AWSID的整个桶。用户,加上他们的密钥。您仍然需要构建时间限制的URL。
您可以使用IAM控制台在几分钟内创建这样的用户。您只有一次机会获得密钥 - 在您创建用户时(或者如果您旋转其密钥)。
应该这样做。此AWSID无权访问任何内容,并且未与您链接。
一般情况下,亚马逊现在建议不要使用您的主要AWSID以及任何内容。您在IAM中创建具有权限的用户,然后使用这些代码。这允许很多安全灵活性。您可以在IAM控制台中通过简单操作关闭只读用户。
答案 2 :(得分:2)
您的私钥是对某些未知参数的单向计算,它甚至可能不使用公钥本身作为算法的一部分。知道你的AWSAccessKeyId应该对强制你的私钥的复杂性没有任何影响。
https确保有人可以告诉您的连接(如果他们正在嗅探网络流量),它是在您的IP和端口443上的s3.amazonaws.com的IP之间。即使您正在连接到亚马逊必须从分配给它们的已知ip地址范围推断出来(无论如何这可能是众所周知的)
在地址栏中获取AWSAccessKeyId的唯一方法是在屏幕上实际看到它,在您的计算机上安装一些键盘记录器或特洛伊木马程序或MIM(中间人)亚马逊的SSL证书,这是即使有人可以访问所需的上游网络节点,也会非常困难。
莱昂
答案 3 :(得分:0)
如果您担心安全性更高,可以使用AWS Security Token Service
(AWS STS)。
临时安全凭据的工作方式与IAM用户可以使用的长期访问密钥凭据几乎相同,但有以下区别:
临时安全证书是短期的。可以将它们配置为持续几分钟到几小时的时间。凭证过期后,AWS不再识别它们或允许使用它们发出的API请求进行任何类型的访问。
临时安全凭证不与用户一起存储,而是动态生成并在请求时提供给用户。当(或什至之前)临时安全凭证过期时,用户可以请求新凭证,只要请求它们的用户仍然具有这样做的权限即可。
参考:https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html