Amazon S3是否支持基本身份验证的HTTP请求

时间:2010-06-22 07:24:34

标签: amazon-web-services amazon-s3

我想设置一个Amazon S3帐户,创建一个存储桶,上传一些数据,并且这些数据将通过HTTP GET 和基本身份验证提供。

我知道有几种方法可以对S3数据进行身份验证(查询字符串等),但我希望能够提供一个简单的用户名/密码方案进行身份验证。

这可能吗?

8 个答案:

答案 0 :(得分:32)

现在可以使用CloudFront和Lambda @ Edge(自2017年7月起在us-east-1地区推出)。

  1. 创建S3存储桶
  2. 在存储桶前面设置CloudFront分配,限制对存储桶的访问,以便只有CloudFront可以直接访问它
  3. 创建一个Lambda函数,它将模拟与浏览器的Basic HTTP Auth握手。将其分配给CloudFront Viewer Request行为。
  4. 这里是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

还请查看本文:Basic HTTP Auth for S3 Buckets

答案 2 :(得分:13)

通过分层多个AWS服务,您可以实现接近基本HTTP授权的功能。

  1. 创建一个s3静态站点。
  2. 创建CloudFront分配以服务s3静态站点(使用静态站点URL而不是桶名称)
  3. 使用AWS WAF创建一个规则,该规则仅允许具有正确http授权标头的请求。这将是授权标题内容的一个刺激匹配规则。
  4. 使用Route53将自定义域路由到CloudFront分配
  5. 您现在应该拥有一个只能使用正确的用户名和密码访问的静态站点。

    注意:使用此设置,系统不会提示您输入凭据,因为请求被 403 Forbidden 而不是 401 Unauthorized 阻止

    注意:您可以直接在s3存储桶前创建CloudFront分配,但是您无法在子文件夹中默认使用根索引文件。

答案 3 :(得分:11)

简短的回答是否定,不使用基本身份验证。但是这里有一种方法与基本身份验证有效,这比列出的其他解决方案容易。我相信这是安全的,但我不确定。

您可以在s3存储桶上设置与请求标头匹配的条件。作为示例,您可以使用useragentreferer标头作为基本身份验证中与用户名和密码等效的内容。通常,useragent是浏览器和操作系统(如Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0),而引用者是以前的网页。

这是一个示例s3存储桶策略,它允许放置对象,并通过匹配useragent和referer获取对象(注意更改:BUCKETNAMEUSERNAMEPASSWORD,{{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" } } } ] } BUCKETNAMEUSERNAMEPASSWORD和{{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桶即可运行。易于实施。基本理念:

  1. 限制对整个站点的访问,但允许公众访问Entry File和Secret File。
  2. 条目文件 secure.html ,接受密码的用户输入并重定向到秘密文件
  3. 秘密文件 thisisasecret 重定向到承载网站真实内容的主文件(index.html)
  4. 主文件 main.html ,仅允许访问来自同一网站的请求。
  5. 所有其他内容(如css,js文件)都会受到一个存储桶策略的限制,如果请求来自您的存储区URL,则会允许它们提供服务。
  6. 使用aws Lambda @ Edge:此解决方案需要s3,aws lambda和aws cloudfront才能运行。基本理念:

    1. 创建 secure.html 。创建文本框以在此处输入用户的基本凭据。该文件应该是公共可访问的,应该调用lambda函数。
    2. 配置cloudfront时,会创建一个行为,其中显示“如果您想要访问index.html,则需要通过签名网址执行此操作”。
    3. 就像上面一样,创建一个存储桶策略,只有当origin是您的存储区URL时才允许访问js,css等文件。

答案 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中给出亚马逊提供的框架。我希望,它仍然为您的问题提供更多选择;)