我想设置一个Amazon S3帐户,创建一个存储桶,上传一些数据,并且这些数据将通过HTTP GET 和基本身份验证提供。
我知道有几种方法可以对S3数据进行身份验证(查询字符串等),但我希望能够提供一个简单的用户名/密码方案进行身份验证。
这可能吗?
答案 0 :(得分:32)
现在可以使用CloudFront和Lambda @ Edge(自2017年7月起在us-east-1地区推出)。
Viewer Request
行为。这里是Lambda函数: https://gist.github.com/lmakarov/e5984ec16a76548ff2b278c06027f1a4
这是一篇有更多细节的文章: https://medium.com/@lmakarov/serverless-password-protecting-a-static-website-in-an-aws-s3-bucket-bfaaa01b8666
答案 1 :(得分:21)
您可以将其自行开发为Web应用程序或现有应用程序的一部分。它将使用HTTP请求,检索其URI组件,将其转换为S3对象名称,并使用getObject()获取其内容(使用可用的S3 SDK之一,例如AWS Java SDK)。
否则,您可以尝试托管解决方案 - s3auth.com(我是开发人员)。它是一个开源项目,你可以看到这个机制是如何在one of its core classes内部实现的。 HTTP请求由服务处理,然后重新转换为Amazon S3内部身份验证方案:
http://s3auth:s3auth@maven.s3auth.com/texry/packages.png
此体系结构图说明了项目的实施方式。 PNG图片是从Amazon S3存储桶maven.s3auth.com
加载的,不能匿名读取。此图片的完整网址是
http://s3auth:s3auth@maven.s3auth.com/texry/packages.png
答案 2 :(得分:13)
通过分层多个AWS服务,您可以实现接近基本HTTP授权的功能。
您现在应该拥有一个只能使用正确的用户名和密码访问的静态站点。
注意:使用此设置,系统不会提示您输入凭据,因为请求被 403 Forbidden 而不是 401 Unauthorized 阻止
注意:您可以直接在s3存储桶前创建CloudFront分配,但是您无法在子文件夹中默认使用根索引文件。
答案 3 :(得分:11)
简短的回答是否定,不使用基本身份验证。但是这里有一种方法与基本身份验证有效,这比列出的其他解决方案容易。我相信这是安全的,但我不确定。
您可以在s3存储桶上设置与请求标头匹配的条件。作为示例,您可以使用useragent
和referer
标头作为基本身份验证中与用户名和密码等效的内容。通常,useragent是浏览器和操作系统(如Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0)
,而引用者是以前的网页。
这是一个示例s3存储桶策略,它允许放置对象,并通过匹配useragent和referer获取对象(注意更改:BUCKETNAME
,USERNAME
,PASSWORD
,{{1 }}和AWS_REGION
到您的详细信息):
FILENAME
要将资源放入存储分区,您可以使用这样的curl请求(请注意更改:{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-username-and-password-access",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::BUCKETNAME/*",
"Condition": {
"StringEquals": {
"aws:UserAgent": "USERNAME",
"aws:Referer": "PASSWORD"
}
}
}
]
}
,BUCKETNAME
,USERNAME
,PASSWORD
和{{1 }}):
AWS_REGION
要使用资源,您可以使用以下内容:
FILENAME
再一次,我相信这是安全的,因为如果您使用https,则应该加密useragent和referer,但请告诉我它是否是。
答案 4 :(得分:9)
不,这是不可能的。 您必须符合Amazons Authentication API
查看列出here的一些包装器。
答案 5 :(得分:2)
我自己正试图找到解决这个问题的方法。 This这里的帖子列出了所有内容。引用这些行:
我一直在寻找能够在Amazon上为S3存储桶添加基本HTTP身份验证的解决方案。有些选项涉及预先签名的URL(仅限单个对象),使用第三方免费或商业服务(隐私问题),启动EC2 / Heroku /等。使用page redirects and bucket policies(不安全)使用中间件代理请求(复杂而非无服务器)。
广告投放管理政策解决方案 我亲自试过这个,对我来说似乎非常安全(除非你有办法绕过aws桶策略)。它只需要s3桶即可运行。易于实施。基本理念:
使用aws Lambda @ Edge:此解决方案需要s3,aws lambda和aws cloudfront才能运行。基本理念:
答案 6 :(得分:0)
我来自AdroitLogic。关于链接文章,它显示了如何在您的客户端和Amazon S3之间放置UltraESB来验证您的请求。如果需要,它可以创建一个“代理”服务,该服务将接受来自客户端的基本身份验证,并以Amazon S3期望的方式发送凭据。这可以以微不足道的方式完成,并且会为您的客户隐藏任何复杂性。
答案 7 :(得分:0)
在这个有点相关的问题中查看my answer here。
有一个问题是需要一个桶对象LIST而不需要大量的S3登录验证。因此,从您的问题来看,我的答案并没有真正解释您对Http-request with basic username/password authentication
的查询 - 而是提供了将存储桶设为私有并仍然可以通过identity-pool (ID)
和Amazon Resource Name (ARN)
检索其数据的可能性(你可以考虑类似用户名和密码)。当然,要获得(ID)和(ARN),您必须在AWS主页as described in my 17-step answer here...中进行一些设置工作 - 而且,它不是GET请求的一部分,而是在AWSS3中给出亚马逊提供的框架。我希望,它仍然为您的问题提供更多选择;)