web-dev-qa-db-ja.com

Amazon S3は基本認証を使用したHTTPリクエストをサポートしていますか

Amazon S3アカウントを設定し、バケットを作成し、データをアップロードし、このデータをHTTP GET 基本認証付きを使用して利用できるようにします。

S3データを認証するにはいくつかの方法(クエリ文字列など)があることは知っていますが、認証用の簡単なユーザー名/パスワードスキームを提供できるようにしたいと思います。

これは可能ですか?

46
Blastt

これは、CloudFrontとLambda @ Edgeを使用して可能になりました(2017年7月以降、us-east-1リージョンで利用可能)。

  1. S3バケットを作成する
  2. バケットの前にCloudFrontディストリビューションを設定し、CloudFrontのみが直接アクセスできるようにバケットへのアクセスを制限します
  3. 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

35
Leonid Makarov

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認証

21
yegor256

複数のAWSサービスを階層化することにより、基本的なHTTP認証に近いものを実現できます。

  1. S3静的サイトを作成します。
  2. S3静的サイトを提供するCloudFrontディストリビューションを作成します(バケット名ではなく静的サイトのURLを使用します)
  3. AWS WAFを使用して、正しいhttp Authorizationヘッダーを持つリクエストのみを許可するルールを作成します。これは、Authorizationヘッダーのコンテンツに対するスティングマッチルールになります。
  4. Route53を使用して、カスタムドメインをCloudFrontディストリビューションにルーティングします

これで、正しいユーザー名とパスワードでのみアクセスできる静的サイトができました。

注:このセットアップを使用すると、リクエストが401 Unauthorizedの代わりに403 Forbiddenでブロックされるため、資格情報の入力を求められません。

注: s3バケットの前にCloudFrontディストリビューションを直接作成できますが、デフォルトでサブフォルダーのルートインデックスファイルを使用することはできません。

13
TomDotTom

短い答えはノーで、基本認証を使用していません。しかし、これは基本認証と事実上同じ方法であり、リストされている他のソリューションよりも簡単です。私はそれが安全であると信じていますが、確かにわかりません。

リクエストのヘッダーに一致する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バケットポリシーの例を次に示します(変更:BUCKETNAMEUSERNAMEPASSWORDAWS_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リクエストを使用できます(注意:BUCKETNAMEUSERNAMEPASSWORDAWS_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を使用している場合はユーザーエージェントとリファラーを暗号化する必要があるため、これは安全であると考えていますが、そうでない場合は教えてください。

13
Jordan Stewart

いいえ、これは不可能です。 Amazons認証API に準拠する必要があります

リストされているラッパーの一部を確認してください here

9
willbt

私自身はこの問題の解決策を見つけようとしていました。 これ ここに投稿すると、それらすべてがリストされます。行を引用する:

AmazonのS3バケットに基本HTTP認証を追加するソリューションを探していました。事前署名済みURL(単一オブジェクトのみ)、サードパーティの無料または商用サービス(プライバシーの問題)の使用、EC2/Herokuなどの起動を含むオプションがあります。 ページリダイレクトおよびバケットポリシー (安全ではない)を使用して、プロキシ要求に対するミドルウェア(複雑でサーバーレスではない)を使用します。

バケットポリシーソリューション:私は個人的にこれを試しましたが、完全に安全だと思われます(awsバケットポリシーをバイパスする方法がない限り)。動作するにはs3バケットが必要です。実装が簡単。基本的な考え方:

  1. エントリファイルとシークレットファイルへのパブリックアクセスを許可することを除き、サイト全体へのアクセスを制限します。
  2. エントリファイルsecure.htmlパスワードのユーザー入力を受け入れ、シークレットファイルにリダイレクトする
  3. シークレットファイルthisisasecretは、サイトの実際のコンテンツをホストするメインファイル(index.html)にリダイレクトします。
  4. メインファイルmain.htmlは、同じサイトから発信されたリクエストへのアクセスのみを許可します。
  5. Css、jsファイルなどの他のすべてのコンテンツは、バケットURLからのリクエストの場合にのみ提供されるバケットポリシーによって制限されます。

aws Lambda @ Edgeの使用:このソリューションを操作するには、s3、aws lambda、aws cloudfrontが必要です。基本的な考え方:

  1. secure.htmlを作成します。ここにユーザーから基本的な資格情報を入力するテキストボックスを作成します。このファイルはパブリックにアクセス可能であり、ラムダ関数を呼び出す必要があります。
  2. Cloudfrontを構成するときに、「index.htmlにアクセスする場合は、署名付きURLを使用してアクセスする必要がある」という動作を作成します。
  3. 上記と同じように、バケットポリシーを作成して、OriginがバケットURLである場合にのみjs、cssなどのファイルへのアクセスを許可します。
2
rahuljain1311

私はAdroitLogicから来ました。リンクされた記事については、リクエストを認証するためにクライアントとAmazon S3の間にUltraESBを配置する方法を示しています。必要に応じて、クライアントからの基本認証を受け入れる「プロキシ」サービスを作成し、Amazon S3が期待する方法で認証情報を送信できます。これは簡単な方法で行うことができ、クライアントの複雑さを隠します。

0
Asankha Perera

このやや関連する質問で 私の答えはこちら をご覧ください。

そこでの質問は、重いS3ログイン認証を必要とせずにバケットオブジェクトリストを取得することでした。したがって、あなたの質問から、私の答えは_Http-request with basic username/password authentication_の問い合わせを実際には説明しませんが、バケットをプライベートにして、identity-pool (ID)Amazon Resource Name (ARN)(ユーザー名とパスワードに似ていると考えることができます)。もちろん、(ID)と(ARN)を取得するには、AWSメインページでいくつかの設定作業を行う必要があります ここでの17ステップの回答で説明したように... -また、 GETリクエストの一部ではなく、Amazonが提供するAWSS3フレームワーク内で提供されます。私はそれがあなたの質問にもっと多くの選択肢を与えることを願っています;)

0
iKK