Zugriff verweigert, wenn Dateien mithilfe von Paperclip- und IAM-Richtlinien auf Amazon hochgeladen werden

Es ist mir nicht möglich, einen Upload mit Paperclip mithilfe einer S3-IAM-Richtlinie durchzuführen. Ich habe sogar Probleme mit direkten jQuery-Uploads (keine Büroklammer). Mein Szenario ist wie folgt: Ich habe eine Anwendung, die viele Sites haben wird. Jede Site verfügt über einen eigenen Bucket und sollte nur auf ihren eigenen Bucket zugreifen können, auf den keiner anderer Zugriff hat. DasIAM-Beispielrichtlinien Die Dokumentation erklärt genau, was ich unter "Beispiel: Jedem IAM-Benutzer Zugriff auf einen Ordner in einem Bucket gewähren" tun möchte. Ich habe eine IAM-Gruppe für die Anwendung eingerichtet und habe einen Benutzer pro Standort in der Gruppe. Diese IAM-Benutzer gehören zur Gruppe. Die Richtlinien für die Gruppe lauten wie folgt:

{
   "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}/*"
      }
   ]
}

Hier ist meine CORS-Konfiguration auf dem Bucket, für Entwickler wird sie natürlich später gesperrt:

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

Hier sind meine Einstellungen für Büroklammern:

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"

Zuvor arbeitete ich mit Richtlinien direkt im Bucket, was zwar funktionierte, aber nicht so flexibel war, wie ich es brauchte, wenn ich in eine Produktionsumgebung mit vielen "Standorten" wechselte. Soweit ich das beurteilen kann, habe ich die Dokumentation genau befolgt und alles, was ich tue, führt zu "Zugriff verweigert". Zu diesem Zeitpunkt bin ich mir nicht einmal sicher, ob mein Problem mit meiner IAM-Richtlinie oder meiner Paperclip-Konfiguration zusammenhängt.

edit: klärung.

edit 2: ENDLÖSUNG

Hier ist meine endgültige IAM-Richtlinie, basierend aufDieser Beitrag:

{
 "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}/*"]
   }
 ]
}

Und meine aktualisierten Einstellungen für Büroklammern:

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"

Es war wichtig, den Benutzernamen in den Paperclip-Pfad aufzunehmen. Ich ging davon aus, dass Amazon dies aus den Anmeldeinformationen ableiten würde, aber das ist nicht der Fall.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage