Amazon S3アカウントを設定し、バケットを作成し、データをアップロードし、このデータをHTTP GET 基本認証付きを使用して利用できるようにします。
S3データを認証するにはいくつかの方法(クエリ文字列など)があることは知っていますが、認証用の簡単なユーザー名/パスワードスキームを提供できるようにしたいと思います。
これは可能ですか?
これは、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
Webアプリとして、または既存のアプリケーションの一部として、自分で開発できます。 HTTPリクエストを消費し、URIコンポーネントを取得し、それをS3オブジェクト名に変換し、 getObject() を使用してそのコンテンツを取得します(利用可能なS3 SDKのいずれか、たとえば AWS Java SDK )。
それ以外の場合は、ホスト型ソリューションを試すことができます- s3auth.com (私は開発者です)。これはオープンソースプロジェクトであり、このメカニズムが内部的にどのように実装されているかは、 コアクラスの1つ で確認できます。 HTTPリクエストはサービスによって処理され、Amazon S3内部認証スキームに再変換されます。
このアーキテクチャ図は、プロジェクトの実装方法を説明しています。 PNG画像は、Amazon S3バケットmaven.s3auth.com
からロードされますが、匿名では読み取りできません。この画像の完全なURLは
http://s3auth:[email protected]/texry/packages.png
この記事も確認してください: S3バケットの基本HTTP認証
複数のAWSサービスを階層化することにより、基本的なHTTP認証に近いものを実現できます。
これで、正しいユーザー名とパスワードでのみアクセスできる静的サイトができました。
注:このセットアップを使用すると、リクエストが401 Unauthorizedの代わりに403 Forbiddenでブロックされるため、資格情報の入力を求められません。
注: s3バケットの前にCloudFrontディストリビューションを直接作成できますが、デフォルトでサブフォルダーのルートインデックスファイルを使用することはできません。
短い答えはノーで、基本認証を使用していません。しかし、これは基本認証と事実上同じ方法であり、リストされている他のソリューションよりも簡単です。私はそれが安全であると信じていますが、確かにわかりません。
リクエストのヘッダーに一致するs3バケットに条件を設定できます。例として、useragent
およびreferer
ヘッダーを基本認証のユーザー名とパスワードに相当するものとして使用できます。通常、useragentはブラウザとOS(Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0)
など)であり、リファラーは前のWebページです。
オブジェクトを配置し、useragentとリファラーを照合してオブジェクトを取得できるs3バケットポリシーの例を次に示します(変更: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"
}
}
}
]
}
バケットにリソースを配置するには、次のようなcurlリクエストを使用できます(注意: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"
リソースを使用するには、次のようなものを使用できます。
curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME
繰り返しになりますが、httpsを使用している場合はユーザーエージェントとリファラーを暗号化する必要があるため、これは安全であると考えていますが、そうでない場合は教えてください。
いいえ、これは不可能です。 Amazons認証API に準拠する必要があります
リストされているラッパーの一部を確認してください here 。
私自身はこの問題の解決策を見つけようとしていました。 これ ここに投稿すると、それらすべてがリストされます。行を引用する:
AmazonのS3バケットに基本HTTP認証を追加するソリューションを探していました。事前署名済みURL(単一オブジェクトのみ)、サードパーティの無料または商用サービス(プライバシーの問題)の使用、EC2/Herokuなどの起動を含むオプションがあります。 ページリダイレクトおよびバケットポリシー (安全ではない)を使用して、プロキシ要求に対するミドルウェア(複雑でサーバーレスではない)を使用します。
バケットポリシーソリューション:私は個人的にこれを試しましたが、完全に安全だと思われます(awsバケットポリシーをバイパスする方法がない限り)。動作するにはs3バケットが必要です。実装が簡単。基本的な考え方:
aws Lambda @ Edgeの使用:このソリューションを操作するには、s3、aws lambda、aws cloudfrontが必要です。基本的な考え方:
私はAdroitLogicから来ました。リンクされた記事については、リクエストを認証するためにクライアントとAmazon S3の間にUltraESBを配置する方法を示しています。必要に応じて、クライアントからの基本認証を受け入れる「プロキシ」サービスを作成し、Amazon S3が期待する方法で認証情報を送信できます。これは簡単な方法で行うことができ、クライアントの複雑さを隠します。
このやや関連する質問で 私の答えはこちら をご覧ください。
そこでの質問は、重いS3ログイン認証を必要とせずにバケットオブジェクトリストを取得することでした。したがって、あなたの質問から、私の答えは_Http-request with basic username/password authentication
_の問い合わせを実際には説明しませんが、バケットをプライベートにして、identity-pool (ID)
とAmazon Resource Name (ARN)
(ユーザー名とパスワードに似ていると考えることができます)。もちろん、(ID)と(ARN)を取得するには、AWSメインページでいくつかの設定作業を行う必要があります ここでの17ステップの回答で説明したように... -また、 GETリクエストの一部ではなく、Amazonが提供するAWSS3フレームワーク内で提供されます。私はそれがあなたの質問にもっと多くの選択肢を与えることを願っています;)