Bla*_*stt 50 amazon-s3 amazon-web-services
我想设置一个Amazon S3帐户,创建一个存储桶,上传一些数据,并且使用HTTP GET 和基本身份验证可以获得这些数据.
我知道有几种方法可以对S3数据进行身份验证(查询字符串等),但我希望能够为身份验证提供简单的用户名/密码方案.
这可能吗?
Leo*_*rov 39
现在可以使用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
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)
Tom*_*Tom 14
通过分层多个AWS服务,您可以实现接近基本HTTP授权的功能.
您现在应该拥有一个只能使用正确的用户名和密码访问的静态站点.
注意:使用此设置,系统不会提示您输入凭据,因为请求被403 Forbidden而不是401 Unauthorized阻止.
注意:您可以直接在s3存储桶前创建CloudFront分配,但是您将无法在子文件夹中默认为根索引文件.
Jor*_*art 14
简短的回答是否定,不使用基本身份验证.但是这里有一种方法与基本身份验证有效,这比列出的其他解决方案容易.我相信这是安全的,但我不确定.
您可以在s3存储桶上设置与请求标头匹配的条件.作为一个例子,你可以使用useragent和referer标题作为基本身份验证中的用户名和密码.通常,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,但请告诉我,如果不是.
到目前为止,这在 AWS 上已经变得相对简单。基本上需要做三件事:
就是这样,没有其他特别的花里胡哨的东西。这是我所做的:
首先,转到 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 分配并执行以下操作:
.s3.amazonaws.com不包含该单词。website应该就是这样。如果运气好的话,只需几分钟(我知道实际上更多),尤其是一旦全部设置完毕,就不会增加复杂性。
| 归档时间: |
|
| 查看次数: |
47047 次 |
| 最近记录: |