Basic HTTP Auth for S3 Buckets

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Amazon S3是一个简单而非常有用的二进制对象(也称为“文件”)存储服务。要使用它,您需要在其中创建一个具有唯一名称的“存储桶”,并上传您的对象。

之后,AWS通过他们的RESTful API保证您的对象可供下载。

几年前,AWS推出了一个名为静态网站托管的S3功能。

通过静态网站托管,您只需打开该功能,存储桶中的所有对象就可以通过公共HTTP访问。这对于托管静态内容(如图像、JavaScript文件、视频和音频内容)非常方便。

在使用托管时,您需要更改DNS中的CNAME记录,使其指向www.example.com.aws.amazon.com。更改DNS条目后,您的静态网站将像通常一样在www.example.com上可用。

然而,在使用Amazon S3时,无法保护您的网站,因为内容是纯静态的。这意味着您无法在前端拥有登录页面。通过该服务,您可以将对象设置为完全公开,以便任何人都可以在线查看它们,或者为它们分配访问权限,但仅限通过RESTful API连接的用户。

然而,我对该服务的使用情况稍微复杂一些。我希望将我的静态内容作为S3对象进行托管。但是,我希望只有少数人可以使用他们的Web浏览器访问内容。

HTTP协议提供了一个很好的“基本访问认证”功能,不需要任何额外的网页。

当HTTP请求到达服务器时,它不会传送内容,而是回复一个401状态响应。这个响应的字面意思是“我不知道你是谁,请进行身份验证”。

浏览器显示其本机的登录界面,并提示输入用户名和密码。输入登录凭据后,它们会被连接起来,经过Base64编码,并添加到下一个请求的“Authorization”HTTP头部中。

现在,浏览器尝试再次获取相同的网页。但是,这次的HTTP请求包含一个头部:

以上仅为示例。在该示例中,Base64 编码部分表示 joe:secret,其中 joe 是用户名,secret 是用户输入的密码。

这一次,服务器具备认证信息,能够判断该用户是否已经通过认证(即其密码与服务器记录匹配),以及是否有权限访问请求的网页。

由于亚马逊不提供此功能,我决定创建一个简单的网络服务s3auth.com,它位于我的亚马逊 S3 存储桶之前,并实现了基于 HTTP 的身份验证和授权机制。

不过,我并没有将我的对象设为公开,而是将我的 CNAME 记录指向 relay.s3auth.com。Web 浏览器发送的 HTTP 请求会到达我的服务器,连接到亚马逊 S3,并从中检索我的对象,并通过 HTTP 响应将它们返回。

服务器使用一个特殊的文件 .htpasswd 实现身份验证和授权,该文件位于我的存储桶的根目录下。.htpasswd 文件的格式与 Apache HTTP Server 使用的格式完全相同,即每行一个用户。每行包含一个用户名和他的密码的哈希版本。

我将这个软件开源主要是为了向我的用户保证服务器不会在任何地方存储他们的私人数据,而只作为一个传递服务。因此,该软件位于 GitHub

为了保护隐私和方便使用,我只使用 OAuth2 作为用户帐户验证方式。这意味着我不知道我的用户是谁。我没有他们的姓名或电子邮件,只有他们在 Facebook、Google Plus 或 GitHub 上的帐户号码。当然,我可以通过这些号码找到他们的姓名,但这些信息本来就是公开的。

服务器使用 Java6 实现。为了托管,我使用了一个单独的 Amazon EC2 m1.small Ubuntu 服务器。这些天,服务器似乎正常工作且稳定。

除了身份验证和授权之外,s3auth.com服务器可以渲染页面列表,就像Apache HTTP服务器一样。如果您的存储桶中有一系列的对象,但是缺少index.html文件,亚马逊S3会返回一个”页面未找到”的结果。相反,我的服务器会显示存储桶中的对象列表,当没有index.html文件时,可以向上或向下导航到一个文件夹。

当您的存储桶启用了版本控制功能时,您可以在浏览器中列出任何对象的所有版本。只需在URL的末尾添加?all-versions来显示列表。然后,点击一个版本让s3auth.com检索和渲染它。

我创建这项服务主要是为了自己,但显然我不是唯一一个遇到上述问题的人。目前,s3auth.com 托管了超过300个域名,并且每小时传输超过10Mb的数据。

附注:本文解释了如何将s3auth.com用作您的Maven存储库的前端:如何在Amazon S3中设置私有Maven存储库。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 17:06

sixnines availability badge   GitHub stars