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

Bla*_*stt 50 amazon-s3 amazon-web-services

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

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

这可能吗?

Leo*_*rov 39

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

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


yeg*_*256 21

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

否则,您可以尝试托管解决方案 - s3auth.com(我是开发人员).它是一个开源项目,你可以看到这个机制是如何在其核心类之一内部实现的.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
Run Code Online (Sandbox Code Playgroud)

另请参阅本文:S3 Buckets的基本HTTP身份验证


Tom*_*Tom 14

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

  1. 创建一个s3静态站点.
  2. 创建CloudFront分配以服务s3静态站点(使用静态站点URL而不是桶名称)
  3. 使用AWS WAF创建一个规则,该规则仅允许具有正确http授权标头的请求.这将是Authorization标头内容的sting匹配规则.
  4. 使用Route53将自定义域路由到CloudFront分配

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

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

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

  • 建议为请求添加标头?Chrome插件或其他一些? (2认同)

Jor*_*art 14

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

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

下面是一个例子S3存储策略,允许把对象,并且由用户代理匹配获取对象和referer(注变化:BUCKETNAME,USERNAME,PASSWORD,AWS_REGION,和FILENAME您详细说明):

{
    "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"
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

为了把资源桶中,你可以使用这样的卷曲请求(注变化:BUCKETNAME,USERNAME,PASSWORD,AWS_REGION,和FILENAME):

curl --user-agent USERNAME --referer PASSWORD --upload-file "FILENAME" --request PUT "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME"
Run Code Online (Sandbox Code Playgroud)

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

curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢@liberborn,但HTTP标头实际上是用HTTPS加密的 /sf/ask/13135881/ (8认同)
  • 这样做的一个不安全因素是它将您的密码以明文形式存储在您的安全策略中。这通常被认为是不好的做法。 (2认同)

小智 9

不,这是不可能的.您必须符合Amazons Authentication API

看看这里列出的一些包装.


hen*_*eck 9

到目前为止,这在 AWS 上已经变得相对简单。基本上需要做三件事:

  1. 创建一个 CloudFront 函数以将基本身份验证添加到请求中。
  2. 在几个地方正确配置 CloudFront 发行版的起源。
  3. 激活CloudFront功能。

就是这样,没有其他特别的花里胡哨的东西。这是我所做的:

首先,转到 CloudFront,然后单击左侧的“函数”,使用您选择的名称创建一个新函数(不需要区域等),然后添加以下内容作为该函数的代码:

function handler(event) {
  var user = "myuser";
  var pass = "mypassword";
  var requiredAuth = "Basic " + `${user}:${pass}`.toString('base64');

  var authHeader = event.request.headers.authorization;

  if (authHeader && authHeader.value === requiredAuth) {
    return event.request;
  } else {
    return {
      statusCode: 401,
      statusDescription: "Unauthorized",
      headers: {
        "www-authenticate": { value: 'Basic realm="Application"' },
      },
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以直接在 UI 上进行测试,假设它可以工作,并假设您已经自定义了用户名和密码,则发布该功能。

接下来,打开您的 CloudFront 分配并执行以下操作:

  1. 确保源中的 S3 存储桶配置为 REST 端点而不是网站端点,即它必须以 结尾且主机名中.s3.amazonaws.com不包含该单词。website
  2. 另外,在 Origin 设置中的“S3 存储桶访问”下,选择“是使用 OAI(存储桶只能限制对 CloudFront 的访问)”。在下面的设置中,单击“创建 OAI”以创建一个新的 OAI(除非您已有 OAI 并且知道自己在做什么)。并选择“是,更新存储桶策略”以允许 AWS 向您的 OAI 添加必要的权限。
  3. 最后,打开 CloudFront 发行版的行为并滚动到底部。在“函数关联”下,对于“查看者请求”,选择“CloudFront 函数”,然后选择您新创建的 CloudFront 函数。保存您的更改。

应该就是这样。如果运气好的话,只需几分钟(我知道实际上更多),尤其是一旦全部设置完毕,就不会增加复杂性。


归档时间:

查看次数:

47047 次

最近记录:

6 年,3 月 前