2016-02-10 27 views
5

Jak powinny wyglądać moje zasady IAM, aby umożliwić użytkownikowi my-user dostęp do wiadra Amazon S3 o nazwie my-bucket?Prosta zasada Amazon IAM dla s3 przy użyciu szyn i spinacza

Obecnie mam następujący polityka przypisany my-user:

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

mam tę politykę z "Sample 1" na poniższym linkiem:

http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket

W moim pliku production.rb, Zaimplementowałem ustawienia konfiguracji, aby poinformować spinacz o użyciu S3:

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => 'my-bucket', 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

Gdy próbuję użyć mojej aplikacji do przesłania zdjęcia, otrzymuję wyjątek od AWS::S3::Errors::AccessDenied.

dziwne, gdybym załadować konsolę szynach i uruchomić następujący kod ręcznie przesłać plik, to działa prawidłowo:

s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) 
bucket = s3.buckets['my-bucket'] 
obj = bucket.objects['new_file'] 
obj.write(Pathname.new('/path/to/file')) 

to poprawnie przesyła plik do mojego S3 wiadra. Jestem zdezorientowany, dlaczego wyraźnie mam pozwolenie na przesłanie pliku w ten sposób, ale kiedy próbuję zrobić to za pomocą spinacza z tymi samymi poświadczeniami, otrzymuję błąd odmowy uprawnień.

Jeszcze bardziej zagmatwany, gdy przypisuję polisę AdministratorAccess do my-user, spinacz jest w stanie pomyślnie przesłać plik.

Każdy pomysł, jak mogę to rozwiązać?

Odpowiedz

8

Rozwiązaniem jest tutaj: https://stackoverflow.com/a/19185045/736864

Kiedy spinacza przesyła plik do S3, ale również próbuje ustawić plik będzie dostępny publicznie, co oznacza, że ​​użytkownik musi mieć dostęp do zestawu uprawnień. Dodanie uprawnienia s3:PutObjectAcl do mojej polityki IAM rozwiązało problem.