Amazon Docsで 特定のWebサイトからのみS3バケットへのアクセスを設定する について読みました。そして私は引用します:
S3バケットexamplebucketに保存されている写真やビデオへのリンクを含むドメイン名(www.example.comまたはexample.com)のWebサイトがあるとします。デフォルトでは、すべてのS3リソースはプライベートなので、リソースを作成したAWSアカウントのみがそれらにアクセスできます。 Webサイトからこれらのオブジェクトへの読み取りアクセスを許可するには、aws:refererキーを使用して、特定のWebページから取得リクエストを送信する必要があるという条件でs3:GetObject権限を許可するバケットポリシーを追加できます。
これはまさに私の要求です。
しかし、これはセキュリティの観点から私には説得力があるようには見えません。私のウェブサイトを開いたままブラウザからJavaScriptを実行してこれらのオブジェクトにアクセスしたり、他の方法でこれを壊すことはできませんか?
一般に、これらのファイルにWebサイトを使用してアクセスする以外の方法でアクセスできないことを保証できますか?
追伸:本当にセキュリティの専門家ではなく、私は直感的に安全ではないと感じたため、絶対に確認しようとしています。侵入者が何らかの方法でバケットに保存されているファイル(絶対キー名)のリストを取得したと想定しています。
あなたの直感は最も重要な点で正しいです。これは、意味のある意味では「安全」ではありません。
しかし、それを打ち負かす方法は、あなたが想像しているものとまったく同じではありません。
Webページのリンクをクリックするか、ブラウザがページに埋め込まれた画像をロードすると、ブラウザはWebサーバーに接続してリクエストを送信します。リクエストには、HTTPヘッダー Referer:
と呼ばれるものを含む が含まれます。常に存在するわけではありませんが(この回答の範囲外である可能性があるさまざまな理由により)、付随する値は、リンクがクリックされたとき、または画像が表示されたときに、同じブラウザタブに表示されていたページのURLです。ロードされました。
S3でこのようなポリシーを作成すると、ブラウザから送信されたこの値と文字列を照合することでアクセス制御が実装され、セキュリティの観点からの値はほとんどありません。
したがって、ページが開いているときに別のタブでJavascriptを実行することは、特に問題ではありません。懸念されるのは、偽造されたReferer:
ヘッダーを使用してリクエストを作成する悪意のあるユーザーです。curl
(curl -v http://example-bucket.s3.amazonaws.com/secret-image.jpg -H 'Referer: http://example.com/good-guy.html'
)などのテストツールやブラウザプラグインを使用すると簡単に実行できます。バケットには、「ああ、あなたはexample.comのGood Guyページにいます。ここに、あなたが要求した秘密の画像ファイルがあります。」と書かれています。
このような明らかな制限がある場合、このメカニズムは実際に何に役立つのでしょうか。
コンテンツを保護しない。
ただし、コンテンツへのホットリンクが広まり、第三者のサイトにアセットへのリンクが埋め込まれるのを防ぐことは有用であり、これは帯域幅の盗難に相当します。私はかつて、ギフトカードの写真を表示するページを作成者がグーグルで検索した詐欺サイトに遭遇しました。彼は私のサイトの1つでそのような画像を見つけましたが、ダウンロードしませんでした...彼は私の画像へのリンクを彼の詐欺的なHTMLに埋め込みました。リファラーを拒否する構成は、そのような煩わしさを大幅に軽減します...しかし、それは他にはほとんど適していません。
S3を使用すると、署名付きURLをオンザフライで生成し(サイトが動的である場合)、それらをHTMLに埋め込むことができます。 URLが有効である期間を指定するため、これはおそらく最も効果的なソリューションであり、これらのURLは計算の実行不可能性の点で改ざんされません。 CloudFrontをS3と組み合わせて使用すると、レンダリングする各ページの個々のリンクに署名する必要はなく、HTTPSを使用してHTTPS経由で配信される非常に有効期限の短いオブジェクトの個々の署名付きURLに署名する必要はありません。参照ページポリシーとは異なり、アクセス制御の効果的なメカニズムです。