1. ホーム
  2. javascript

[解決済み] Amazon S3のクライアントブラウザからの直接ファイルアップロード - 秘密鍵の開示

2022-05-04 06:08:01

質問

私は、クライアントマシンからREST API経由でAmazon S3に直接ファイルをアップロードする実装を、サーバーサイドのコードを一切使用せず、JavaScriptだけで行っています。すべてうまくいっていますが、1つだけ心配なことがあります...

Amazon S3 REST APIにリクエストを送信するとき、リクエストに署名する必要があり、署名を Authentication ヘッダを作成します。署名を作成するには、私の秘密鍵を使用しなければなりません。しかし、すべてのことはクライアント側で行われるので、秘密鍵は(たとえソースを難読化/暗号化したとしても)ページのソースから簡単に明らかにすることができます。

どうすればいいのでしょうか?また、全く問題ないのでしょうか?特定のCORS OriginからのREST APIコールに限定して、PUTとPOSTメソッドのみ、あるいはS3と特定のバケットにのみキーをリンクさせることができるかもしれません?もしかしたら、他の認証方法があるかもしれませんね?

サーバーレスソリューションは理想的ですが、サーバーサイドの処理を含むことも検討できます。

どのように解決しますか?

あなたが欲しいのは、Browser-Based Uploads Using POSTだと思います。

基本的に、サーバーサイドのコードは必要ですが、それは署名されたポリシーを生成するだけです。クライアント側のコードに署名されたポリシーがあれば、データをサーバーを経由せずに直接S3へPOSTでアップロードすることができます。

以下は公式ドキュメントのリンクです。

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html

コード例 http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html

署名されたポリシーは、以下のような形でhtmlに記載されます。

<html>
  <head>
    ...
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ...
  </head>
  <body>
  ...
  <form action="http://johnsmith.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    Key to upload: <input type="input" name="key" value="user/eric/" /><br />
    <input type="hidden" name="acl" value="public-read" />
    <input type="hidden" name="success_action_redirect" value="http://johnsmith.s3.amazonaws.com/successful_upload.html" />
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br />
    <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" />
    Tags for File: <input type="input" name="x-amz-meta-tag" value="" /><br />
    <input type="hidden" name="AWSAccessKeyId" value="AKIAIOSFODNN7EXAMPLE" />
    <input type="hidden" name="Policy" value="POLICY" />
    <input type="hidden" name="Signature" value="SIGNATURE" />
    File: <input type="file" name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit" value="Upload to Amazon S3" />
  </form>
  ...
</html>

FORMアクションがファイルを送信していることに注意してください。 を直接S3へ - サーバー経由ではなく

ユーザがファイルをアップロードするたびに POLICYSIGNATURE をサーバーにインストールします。ユーザーのブラウザにページを返します。その後、ユーザーはあなたのサーバーを経由せずに、直接S3にファイルをアップロードすることができます。

ポリシーに署名するとき、通常、数分後にポリシーが失効するようにします。これにより、ユーザーはアップロードする前にあなたのサーバーと話をすることを強制されます。これにより、必要に応じてアップロードを監視し、制限することができます。

あなたのサーバーに出入りするデータは、署名されたURLだけです。あなたの秘密鍵はサーバー上で秘密にされたままです。