Amazon S3 是不是支持带有基本身份验证的 HTTP 请求

Posted

技术标签:

【中文标题】Amazon S3 是不是支持带有基本身份验证的 HTTP 请求【英文标题】:Does Amazon S3 support HTTP request with basic authenticationAmazon S3 是否支持带有基本身份验证的 HTTP 请求 【发布时间】:2011-03-06 16:28:56 【问题描述】:

我想设置一个 Amazon S3 帐户,创建一个存储桶,上传一些数据,并且这些数据将可以使用 HTTP GET 基本身份验证

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

这可能吗?

【问题讨论】:

您可以使用s3auth.com,这是一个免费的托管解决方案,可满足您的需求 s3auth 绝对是解决这个问题的方法。 @RaymondKalonji AWS 不是官方的 s3auth 【参考方案1】:

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

    创建 S3 存储桶 在存储桶前面设置 CloudFront 分配,限制对存储桶的访问,以便只有 CloudFront 可以直接访问它 创建一个 Lambda 函数,该函数将模拟与浏览器的基本 HTTP 身份验证握手。将其分配给 CloudFront 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

【讨论】:

应该在Viewer Request上触发吗? 嗨,我添加了带有 lambda 函数和 cloudfront 的 htaccess 身份验证。现在我想删除它。我怎么能? 这可以通过 jeroenvollenbrock 在对该要点的评论中提到的 CloudFront 函数来完成。我们的团队进一步简化了它:gist.github.com/jeroenvollenbrock/…Jeroen 说它更便宜更快,虽然我还没有验证过。【参考方案2】:

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

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

这是一个示例 s3 存储桶策略,它允许通过匹配用户代理和引用者来放置对象和获取对象(注意更改:BUCKETNAMEUSERNAMEPASSWORDAWS_REGIONFILENAME您的详细信息):


    "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"
                
            
        
    ]

要将资源放入存储桶中,您可以使用这样的 curl 请求(注意更改:BUCKETNAMEUSERNAMEPASSWORDAWS_REGIONFILENAME):

curl --user-agent USERNAME --referer PASSWORD --upload-file "FILENAME" --request PUT "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME"

要使用资源,您可以使用以下内容:

curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME

再一次,我相信这是安全的,因为如果你使用 https,useragent 和 referer 应该被加密,但如果不是,请告诉我。

【讨论】:

优秀。这正是我一直在寻找的!我同意它是安全的。 其中一个不安全之处在于它会将您的密码以明文形式存储在您的安全策略中。这通常被认为是不好的做法。 这是一种不安全的方法。所有中间人路由器、集线器等都可以看到凭据。 感谢@liberborn,但 HTTP 标头实际上是用 HTTPS 加密的 ***.com/questions/187655/are-https-headers-encrypted 我的坏@JordanStewart。确实是安全的。感谢您的澄清。【参考方案3】:

您可以自己开发它作为网络应用程序或现有应用程序的一部分。它将使用 HTTP 请求,检索其 URI 组件,将其转换为 S3 对象名称并使用 getObject() 获取其内容(使用可用的 S3 SDK 之一,例如 AWS Java SDK)。

否则,您可以尝试托管解决方案 - s3auth.com(我是开发人员)。这是一个开源项目,你可以在one of its core classes 看到这个机制是如何在内部实现的。 HTTP 请求由服务处理,然后重新转换为 Amazon S3 内部身份验证方案:

此架构图解释了项目的实施方式。 PNG 图片是从 Amazon S3 存储桶maven.s3auth.com 加载的,无法匿名读取。此图片的完整网址是

http://s3auth:s3auth@maven.s3auth.com/texry/packages.png

也请查看这篇文章:Basic HTTP Auth for S3 Buckets

【讨论】:

这正是我一直在寻找的!说明最近得到澄清,设置非常简单。 为了澄清你答案的最后一点,资源的标准 URL 将是 http://maven.s3auth.com/texry/packages.png,但一旦经过身份验证,它就会变成 http://s3auth:s3auth@maven.s3auth.com/texry/packages.png,对吗? 什么是“标准网址”? :) 可以下载文档的网址是http://s3auth:s3auth@maven.s3auth.com/texry/packages.png,其中包含认证信息 @yegor256 我确实尝试在我的帐户中实施,但我无法配置。所以你能帮我提供分步教程或其他东西吗?????? s3auth 将文件从 S3 流式传输给您。它不会将文件存储在本地或内存中,而是流式传输【参考方案4】:

通过对多个 AWS 服务进行分层,您可以获得接近基本 HTTP 授权的功能。

    创建一个 s3 静态站点。 创建 CloudFront 分配以提供 s3 静态站点(使用静态站点 url 而不是存储桶名称) 使用 AWS WAF 创建一个规则,该规则只允许具有正确 http Authorization 标头的请求。这将是 Authorization 标头内容的字符串匹配规则。 使用 Route53 将自定义域路由到 CloudFront 分配

您现在应该有一个静态站点,只能使用正确的用户名和密码访问。

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

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

【讨论】:

向请求添加标头的建议? Chrome 插件之类的?【参考方案5】:

不,这是不可能的。 你必须符合Amazons Authentication API

查看here 列出的一些包装器。

【讨论】:

我不认为那篇文章声称您可以在 S3 中使用基本身份验证。 另见aws.amazon.com/s3/faqs/…【参考方案6】:

我自己也在尝试解决这个问题。 This 此处的帖子已将它们全部列出。引用行:

几个月来,我一直在寻找一种将基本 HTTP 身份验证添加到 Amazon 上的 S3 存储桶的解决方案。有一些选项涉及预签名 URL(仅限单个对象)、使用第 3 方免费或商业服务(隐私问题)、启动 EC2/Heroku/等。使用中间件代理请求(复杂且非无服务器),使用 page redirects and bucket policies(不安全)。

存储桶策略解决方案: 我已经亲自尝试过,这对我来说似乎非常安全(除非您有办法绕过 aws 存储桶策略)。它只需要 s3 存储桶即可运行。实施简单。基本思路:

    限制对整个站点的访问,但允许公共访问条目文件和机密文件除外。 条目文件 secure.html 接受用户输入的密码并重定向到机密文件 秘密文件 thisisasecret 重定向到承载网站真实内容的主文件 (index.html) 主文件main.html,只允许访问来自同一站点的请求。 所有其他内容(如 css、js 文件)都将受到存储桶策略的限制,如果请求来自您的存储桶 URL,则允许它们提供服务。

使用 aws Lambda@Edge: 此解决方案需要 s3、aws lambda 和 aws cloudfront 才能运行。基本思路:

    创建一个secure.html。创建文本框以在此处输入用户的基本凭据。此文件应可公开访问,并应调用 lambda 函数。 在配置 cloudfront 时,会创建一个行为,即“如果您想访问 index.html,则需要通过签名 URL 进行访问”。 就像上面一样,创建一个存储桶策略,仅当源是您的存储桶 URL 时才允许访问 js、css 等文件。

【讨论】:

我喜欢你的想法【参考方案7】:

我来自 AdroitLogic。关于链接的文章,它展示了如何在您的客户端和 Amazon S3 之间放置 UltraESB 以验证您的请求。如果需要,它可以创建一个“代理”服务,该服务将接受来自您的客户端的基本身份验证,并以 Amazon S3 期望的方式发送凭证。这可以通过简单的方式完成,并且会为您的客户隐藏任何复杂性。

【讨论】:

【参考方案8】:

在这个有点相关的问题中查看my answer here。

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

【讨论】:

以上是关于Amazon S3 是不是支持带有基本身份验证的 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

带有 SSH 身份验证的 WinSCP 到 S3

数据中心的 Amazon S3 替代方案?

为啥没有准备好 Amazon S3 身份验证处理程序?

带有 facebook 身份验证的 Amazon cognito 身份管理

Spring Cloud AWS 是不是支持使用 Amazon S3 Buckets 大于 256 的 Amazon SNS 消息负载?

S3 Transfer Manager 示例显示错误:不支持未经身份验证的访问