4

Я очень новичок во всем этом, но смог загрузить аватар/загрузчик изображений для работы в моем приложении Rails. Пользователь может загрузить новый аватар в мой ведро S3, а аватар отобразится в веб-приложении.Написание политики IAM и конфигурации CORS для Amazon S3

С этой целью я должен был предоставить политику «AmazonS3FullAccess» для пользователя. Это кажется чересчур большим, поскольку пользователю из приложения требуется только написать (загрузить его аватар) и прочитать (показать аватар на веб-странице).

Согласны ли вы с тем, что поэтому лучше написать собственную политику, а не использовать AmazonS3FullAccess? Если да, я пробовал код политики (принятый от here) ниже, но это не сработало (403 Запретная ошибка при попытке загрузить изображение аватара). Любые предложения по исправлению этого кода?

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::mybucket"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": ["arn:aws:s3:::mybucket/*"] 
    } 
    ] 
} 

ответ

7

У меня есть белые волосы, пытаясь определить правильную конфигурацию. Вот один, который работает для меня:

{ 
    "Statement": [ 
     { 
      "Sid": "AllowPublicRead", 
      "Action": [ 
       "s3:ListBucket", 
       "s3:GetObject", 
       "s3:PutObject", 
       "s3:PutObjectAcl", 
       "s3:DeleteObject" 
      ], 
      "Effect": "Allow", 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::mybucket" 
      ] 
     } 
    ] 
} 

Эта политика должна быть приложена к надлежащему лицу («Прикрепленный вкладке объект»), который может быть выделенным пользователя. Если вам нужны ключи API/Access, перейдите на вкладку «Учетные записи безопасности» для этого пользователя и создайте некоторые. Это позволяет вам больше контролировать, кто использует эту политику.

Вы также можете отредактировать эту политику, чтобы разрешить анонимный доступ, указав «Принципал»: «*», как предложено @therealprashant в комментариях, см. the docs для получения дополнительной информации.

Но вам также необходимо установить конфигурацию CORS. Откройте S3 console, нажмите на свое ведро, покажите его Свойства (правая панель) и нажмите «Разрешения», вы сможете отредактировать конфигурацию.

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

Добавить столько CORSRule, сколько вам нужно, особенно если вам нужно https.

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

Редактировать

Вот модифицированная версия Я на самом деле, используя в настоящее время.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:AbortMultipartUpload", 
       "s3:ListBucket", 
       "s3:GetObject", 
       "s3:PutObject", 
       "s3:PutObjectAcl", 
       "s3:DeleteObject", 
       "s3:GetObjectVersion" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::mybucket/*", 
       "arn:aws:s3:::mybucket" 
      ] 
     } 
    ] 
} 

Примечание: «основной» может быть опущено (как это сделал я) в IAM политики, которые прикреплены к IAM пользователя, группы или роли. Во время авторизации «принципал» оценивается как объект, к которому привязана политика.

+0

Спасибо Nycen, я попробовал это, но, к сожалению, без succes (все еще 403 запрещено в журналах). Мой домен - https://mydomain.herokuapp.com. Я пробовал в конфигурации CORS: 'https: // mydomain.herokuapp.com',' https: // *. Herokuapp.com', 'http: // mydomain.herokuapp.com',' http: // * .herokuapp.com', но все без успеха при попытке загрузить изображение аватара. В политике я заменил «mybucket» на имя моего ведра. – Nick

+0

Кстати, мне также нужно установить гранта в разделе «Разрешения для ведра»? – Nick

+0

Нет, вам это не нужно. Но вы должны убедиться, что ваша html-форма правильно настроена. Вы можете использовать что-то вроде https://github.com/waynehoover/s3_direct_upload – Nycen