10

Я не могу загрузить загрузку с помощью Paperclip с использованием политики SAM IAM. У меня даже проблемы с прямыми загрузками jQuery (нет скрепки). Мой сценарий выглядит следующим образом: у меня есть приложение, на котором будет много сайтов. Каждый сайт будет иметь свое собственное ведро и должен иметь доступ только к собственному ковшу, никому другому. Документация IAM Example Policies объясняет, что именно я хочу сделать в разделе «Пример: разрешить каждому пользователю IAM доступ к папке в ведре». У меня есть группа IAM, настроенная для приложения, и у меня есть один пользователь на сайт в группе. Эти пользователи IAM принадлежат к группе. Политика группы выглядит следующим образом:Доступ Отказано при загрузке файлов в Amazon с использованием политик Paperclip и IAM

{ 
    "Version":"2012-10-17", 
    "Statement":[{ 
     "Effect":"Allow", 
     "Action":[ 
      "s3:PutObject", 
      "s3:GetObject", 
      "s3:GetObjectVersion", 
      "s3:DeleteObject", 
      "s3:DeleteObjectVersion" 
     ], 
     "Resource":"arn:aws:s3:::my-app/${aws:username}/*" 
     } 
    ] 
} 

Вот моя конфигурация CORS на ведре, для разработчика, конечно, она будет заблокирована вниз позже:

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

Вот мои настройки Скрепка:

has_attached_file :background_image, 
        storage: :s3, 
        s3_credentials: { 
        access_key_id: "xxx", 
        secret_access_key: "xxx" 
        }, 
        bucket: "my-app", 
        s3_permissions: "public-read", 
        path: "/background_images/:id/:filename" 

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

Редактировать: уточнение.

редактировать 2: окончательное решение

Вот мой последний IAM политика, основанная на this article:

{ 
"Version":"2012-10-17", 
"Statement": [ 
    { 
    "Sid": "AllowUserToSeeBucketListInTheConsole", 
    "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], 
    "Effect": "Allow", 
    "Resource": ["arn:aws:s3:::*"] 
    }, 
    { 
    "Sid": "AllowRootAndHomeListingOfCompanyBucket", 
    "Action": ["s3:ListBucket"], 
    "Effect": "Allow", 
    "Resource": ["arn:aws:s3:::my-app"], 
    "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}} 
    }, 
    { 
    "Sid": "AllowListingOfUserFolder", 
    "Action": ["s3:ListBucket"], 
    "Effect": "Allow", 
    "Resource": ["arn:aws:s3:::estimator-app"], 
    "Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}} 
    }, 
    { 
    "Sid": "AllowAllS3ActionsInUserFolder", 
    "Effect": "Allow", 
    "Action": ["s3:*"], 
    "Resource": ["arn:aws:s3:::my-app/home/${aws:username}/*"] 
    } 
] 
} 

И мои обновленные параметры PAPERCLIP:

has_attached_file :background_image, 
        storage: :s3, 
        s3_credentials: { 
         access_key_id: "xxx", 
         secret_access_key: "xxx" 
        }, 
        bucket: "estimator-app", 
        s3_permissions: "public-read", 
        path: "/home/my_s3_username/background_images/:id/:filename" 

Это было важно, чтобы включить имя пользователя в пути к папке. Я предполагал, что Amazon выведет это из учетных данных, но это не так.

ответ

15

Поскольку вы пытаетесь установить разрешения на объекты, которые вы загружаете, вам также необходимо предоставить вашим пользователям IAM разрешение s3:PutObjectAcl.

+0

Я действительно обновил разрешения для «Action»: «s3: *», чтобы проверить. Он работает, если я также обновляюсь до «Resource»: «arn: aws: s3 ::: my-app/*». В тот момент, когда я ввел $ {aws: username}, я снова получаю Access Denied. Спасибо за подсказку, хотя, я обязательно поставлю это в разрешениях. edit: На самом деле это появляется, если мой ресурс - это не что иное, как корень ведра, который я не могу загрузить. –

+0

Ваша политика пользователя IAM кажется правильной, потому что вы уже используете правильную «версию» в политике. Как ваш пользователь на самом деле назван и каков путь S3, к которому вы пытаетесь загрузить? ('$ {aws: username}" переводит на [дружественное имя] (http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html#Identifiers_FriendlyNames) для этого пользователя). В вашем примере путь выглядит как «background_images», но ваш пользователь IAM также называется «background_images»? – dcro

+0

Пользователь является localhost-оценочным приложением, а группа - оценочным приложением. Интересно, сколько [этой статьи] (http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an- Amazon-S3-bucke) относится к моей ситуации. –