10

Nie mogę przesłać pracy z Paperclip przy użyciu zasad S3 IAM. Mam nawet problemy z bezpośrednim przesyłaniem jQuery (bez spinacza). Mój scenariusz jest następujący: mam aplikację, która będzie mieć wiele stron. Każda strona będzie miała swój własny zasobnik i powinna mieć dostęp tylko do własnego kubła, nikogo innego. Dokumentacja IAM Example Policies wyjaśnia dokładnie, co chcę zrobić w "Przykład: Pozwól każdemu użytkownikowi IAM uzyskać dostęp do folderu w wiadrze". Mam skonfigurowaną grupę IAM dla aplikacji i mam jednego użytkownika na witrynę w grupie. Ci użytkownicy IAM należą do grupy. Polityka na grupy przedstawia się następująco:Odmowa dostępu przy wysyłaniu plików do Amazon przy użyciu zasad Paperclip i 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}/*" 
     } 
    ] 
} 

Oto moja konfiguracja CORS na wiadrze, na dev oczywiście, to dostanie zablokowana później:

<?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> 

Oto moje ustawienia Paperclip:

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" 

byłem poprzednio pracujący z politykami bezpośrednio na wiadrze, które zadziałało, ale nie był tak elastyczny, jak trzeba go mieć, kiedy przenieść się do środowiska produkcyjnego z wielu „stron”. O ile mogę powiedzieć, śledziłem dokładnie dokumentację, ale wszystko, co robię, skutkuje "Odmowa dostępu". W tym momencie nie jestem nawet pewien, czy mój problem dotyczy polityki IAM czy konfiguracji Paperclip.

edytuj: wyjaśnienia.

edit 2: ostateczne rozwiązanie

Tutaj opiera moja ostateczna polityka IAM na 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}/*"] 
    } 
] 
} 

i mój aktualizowane ustawienia spinacza:

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" 

Ważne było aby uwzględnić nazwa użytkownika w ścieżce Paperclip. Zakładałem, że Amazon wyciągnie to z poświadczeń, ale tak nie jest.

Odpowiedz

15

Ponieważ próbujesz ustawić uprawnienia dla przesyłanych obiektów, musisz także dać użytkownikom IAM uprawnienie s3:PutObjectAcl.

+0

Zrobiłem aktualizację uprawnień do "Akcja": "s3: *" tylko po to, aby przetestować. Działa, jeśli zaktualizuję także "Zasób": "arn: aws: s3 ::: my-app/*". W chwili, gdy wstawiam $ {aws: username}, otrzymuję ponownie odmowę dostępu. Dzięki za podpowiedź, jednak na pewno dodam to do uprawnień. edit: W rzeczywistości wygląda na to, że mój zasób to coś innego niż źródło zasobu, którego nie mogę przesłać. –

+0

Twoja polityka użytkownika IAM wydaje się być poprawna, ponieważ używasz poprawnej "wersji" w zasadach. Jak nazywa się Twój użytkownik i jaka jest ścieżka S3, którą próbujesz przesłać? ('$ {aws: nazwa użytkownika}' tłumaczy się na [przyjazną nazwę] (http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html#Identifiers_FriendlyNames) dla tego użytkownika). Z twojego przykładu ścieżka wydaje się być 'background_images', ale czy twój użytkownik IAM również nazywa się' background_images'? – dcro

+0

Użytkownik to aplikacja localhost-estimator, a grupa to aplikacja do szacowania. Zastanawiam się, ile [tego artykułu] (http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an- Amazon-S3-bucke) dotyczy mojej sytuacji. –

Powiązane problemy