0

ログインしているユーザーのみが S3 上のプライベートで安全なファイルにアクセスできるようにするためのヒントを誰かに教えてもらえないか、またはビジネス ロジックがそれらにアクセスできるようにしたい場合に尋ねたかっただけです。これがシナリオです...

オンザフライで PDF 請求書を生成して S3 バケットにアップロードする請求詳細を入力するための PHP Web アプリケーション。(実際には、常に生成してアップロードするとは限りません。ユーザーが印刷またはダウンロードしたい場合にのみ、コードは pdf を生成し、それを S3 にアップロードし、それに応じて URL またはファイルを取得します)

これで、S3 バケットのファイルへの URL を知っている人なら誰でもファイルにアクセスできるようになりました。ログインしていない人でも秘密の質問に答えた後にのみファイルを取得できるように、ファイルへのアクセスを制限したかったのです。

ここでの唯一の答えは、短時間有効な署名付き URL を生成することですか、それとも他の可能性も検討していますか? また、署名付き URL を S3 から直接生成できますか、それともクラウドフロント経由で行う必要がありますか?

さらに調査する方向性を提案してください...ありがとう!

4

2 に答える 2

0

これは役立つかもしれませんか?Amazon CloudFront プライベート コンテンツ

コンテンツを「プライベート」に保つために、ユーザーの資格情報が検証され、有効であることを確認するために、 VPCをセットアップする必要があると思います。

于 2013-02-07T19:08:20.883 に答える
0

この投稿 https://css-tricks.com/snippets/php/generate-expiring-amazon-s3-link/ が役立ちます。コメントも忘れずにチェックしてください。

*** 編集

期限切れの Amazon S3 リンクを生成する

Amazon S3 のファイルを公開する必要はありません (デフォルトでは公開されていません)。ただし、プライベート ファイルへのアクセスを許可する特別なキーを生成できます。これらのキーは URL を介して渡され、期限切れにすることができます。

<?php

    if( !function_exists( 'el_crypto_hmacSHA1' ) ) {
        function el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
                if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
                $key = str_pad($key, $blocksize, chr(0x00));
                $ipad = str_repeat(chr(0x36), $blocksize);
                $opad = str_repeat(chr(0x5c), $blocksize);
                $hmac = pack( 'H*', sha1(
                ($key ^ $opad) . pack( 'H*', sha1(
                    ($キー ^ $ipad) . $データ
                )))
            ));
                base64_encode($hmac) を返します。
        }
    }

    if(!function_exists('el_s3_getTemporaryLink')){

        function el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
            // 有効期限を計算する
            $expires = time() + intval(floatval($expires) * 60);
            // パスを修正します。エンコードしてサニタイズする
            $path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
            // 署名のパスはバケットで始まります
            $signpath = '/'. $bucket .'/'. $パス;
            // 署名する S3 フレンドリ文字列
            $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
            // ハッシュを計算する
            $signature = el_crypto_hmacSHA1($secretKey, $signsz);
            // URL を貼り付ける ...
            $url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
            // ... クエリ文字列に ...
            $qs = http_build_query($pieces = 配列(
                'AWSAccessKeyId' => $accessKey,
                'Expires' => $expires,
                'Signature' => $signature,
            ));
            // ...そして URL を返します!
            $url.'?'.$qs を返します。
        }
    }

使用法

<?php

    echo el_s3_getTemporaryLink('your-access-key', 'your-secret-key', 'bucket-name', '/path/to/file.mov');
于 2013-11-29T05:23:37.953 に答える