2013-11-16 6 views
5

Я создаю сайт, на котором пользователи могут загружать файлы непосредственно на amazon s3. Я временно подписываю URL-адрес с моим секретным ключом, который предоставляет пользователю временный доступ PUT к моему сайту. Это возможно через конфигурацию CORS.Настройка S3 Bucket Policies

Теперь, когда файлы там, я хочу, чтобы никто не читал их, кроме меня. В текущей политике ведра я запрещаю всем читать объекты , включая меня, администратора. Что плохого. Какая политика ковша поможет мне здесь?

Вот мой рабочий CORS.

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
     <AllowedOrigin>http://url.com</AllowedOrigin> 
     <AllowedMethod>PUT</AllowedMethod> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

UPDATE: Работает с этой политикой:

{ 
     "Version": "2008-10-17", 
     "Statement": [ 
      { 
       "Sid": "AllowPublicRead", 
       "Effect": "Deny", 
          "NotPrincipal": { 
           "AWS":"arn:aws:iam::123456789012:user/Bob" 
          } 
       "Action": "s3:GetObject", 
       "Resource": "arn:aws:s3:::<bucket>/*" 
      } 
     ] 
    } 

ответ

4

Ok мы создали IAM пользователя с полным разрешения на S3, мы используем этот пользователь подписывать временную политику, чтобы разрешить загрузку. Политика пользователя для пользователя (Вы можете дополнительно ограничить этот пользователь, чтобы разрешить доступ только к одному ведру, или даже дальше, чтобы позволить пользователю только положить разрешения на ведре):

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "s3:*", 
     "Resource": "*" 
    } 
    ] 
} 

Затем мы создаем временную политику чтобы позволить загружать в наши useruploads ведро

{ "expiration": "2013-11-20T12:00:00.000Z", 
    "conditions": [ 
    {"bucket": "useruploadtest"}, 
    ["starts-with", "$key", "russ"], 
    {"acl": "public-read"}, 
    {"success_action_redirect": "http://localhost/successful_upload.html"}, 
    ["starts-with", "$Content-Type", "image/"], 
    ] 
} 

затем войдите в формате base64 политику нашего секретного ключа (этот код ниже приведен пример создания подписи с cryptojs никогда не ставил свой секретный ключ в стороне клиента кода)

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha1.js"> </script> 
    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script> 
    <script> 
    var hash = CryptoJS.HmacSHA1("eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTAxVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJ1c2VydXBsb2FkdGVzdCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJydXNzIl0sIA0KICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIn0sIA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL2xvY2FsaG9zdC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLA0KICBdDQp9", "YourSecretKeyHere"); 
    var base64 = CryptoJS.enc.Base64.stringify(hash); 
    console.log(base64); 
    </script> 

Затем вы можете использовать подписанную политику, разрешающую временную Загрузить

<form action="http://useruploadtest.s3.amazonaws.com" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="acl" value="public-read" /> 
    <input type="hidden" name="success_action_redirect" value="http://localhost/successful_upload.html" /> 
    <input type="hidden" name="AWSAccessKeyId" value="AKIAJM3U7AMGF6J6YYWQ" /> 
    <input type="hidden" name="Policy" value="eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTAxVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJ1c2VydXBsb2FkdGVzdCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJydXNzIl0sIA0KICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIn0sIA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL2xvY2FsaG9zdC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLA0KICBdDQp9" /> 
    <input type="hidden" name="Signature" value="Db4K65tz/WJtjAUUCWRn5MXdAJ4=" /> 


    Key to upload: <input type="input" name="key" value="test.jpg" /><br /> 
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br /> 
    File: <input type="file" name="file" /> <br /> 

    <input type="submit" name="submit" value="Upload to Amazon S3" /> 
    </form> 

До тех пор, как ведро в нашем случае «useruploadtest» позволяет доступ на чтение из другого IAM пользователя, который мы используем в нашем приложении для чтения файлов и обрабатывать их все это работает.

Надеюсь, что это поможет

+0

Я создал дополнительного пользователя, как вы сказали, и приложил предоставленную вами политику пользователя. Все еще получаю 403 при загрузке. Я подписываю URL с новыми ключами доступа. Когда я удаляю политику, я могу загрузить (странно ...). Нужно ли дополнительно указывать политику ведра и указать надлежащих грантополучателей? –

+0

Выяснение того, как грантополучатели относятся к пользователям IAM, а также о том, как политики пользователя IAM работают с политиками в ведрах, и как указать правильные политики ведра - это PITA –

+0

lol, да, это может быть. Возможно, возникла проблема с ARN в мой пост, попробуйте bucketname без/(я думаю, что работает только для папок в bucket soz), поэтому в моем примере это будет arn: aws: s3 ::: useruploads * – rabs