2013-04-12 5 views
11

Ich baue eine App, die Amazon Security Token Service verwendet, um temporäre Benutzer für den Zugriff auf ein Unterverzeichnis auf einem S3-Bucket erstellen. Die Benutzer werden von einem IAM-Benutzer erstellt, der über vollständigen Lese-/Schreibzugriff auf den Bucket verfügt (sowie über die zum Erstellen von Benutzern erforderlichen Berechtigungen).Amazon Prefix-basierte S3-Richtlinie funktioniert nicht (AWS, IAM, STS, Ruby)

Ich habe die Erstellung von Benutzern perfekt funktioniert zusammen mit Ablauf der Sitzung und mehr, aber ich habe Probleme, die richtige Politik an Ort und Stelle für eine Präfix-basierte Auflistung von Schlüsseln zu ermöglichen. Die Berechtigungen, die ich der Endbenutzer haben wollen, sind:

  1. lesen Objekte, die in einem gewissen definierten Präfix sind
  2. schreiben Objekte dem gleichen definierten Präfix
  3. Liste alle Objekte, die in dem definierten Präfix residieren

Ich habe es geschafft lesen und schreiben arbeiten, aber irgendwie egal, was ich versuche, der Listenzugriff funktioniert nicht richtig. Hier ist der Ruby-Code, den ich verwendet wurde, als ich am nächsten war:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/*") 
end 

Wenn ich mich erinnere, das mir erlaubt, Lesen und Schreiben zu tun, aber nicht auflistet. Da ich noch in der Entwicklung bin habe ich den Code dies geändert:

AWS::STS::Policy.new do |policy| 
    # FIXME: This is way too permissive, but it's not working to be more specific. 
    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
) 
end 

Das funktioniert 100% in Ordnung mit dem offensichtlichen Problem, das nichts mit einem Präfix beschränkt ist, die Benutzer erlauben würde, die Arbeit der andere zu verprügeln.

Was mache ich falsch in meiner Politik?

Antwort

7

Sie könnten diesen Artikel von Interesse finden, da er speziell das Erstellen einer Richtlinie zum Einschränken von Benutzern auf ein Präfix in einem S3-Bucket beschreibt.

Credential Management for Mobile Applications

Sie werden höchstwahrscheinlich brauchen nur auf die zweite Richtlinie zu verweisen.

{ 
     "Statement": 
     [ 
      { 
       "Effect":"Allow", 
       "Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"], 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__/__USERNAME__/*" 
      }, 
      { 
       "Effect":"Allow", 
       "Action":"s3:ListBucket", 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__", 
       "Condition":{"StringLike":{"s3:prefix":"__USERNAME__/"}} 
      }, 
      { 
       "Effect":"Deny", 
       "Action":["sts:*", "iam:*", "sdb:*"], 
       "Resource":"*" 
      } 
     ] 
} 

Mit den ersten zwei Aussagen zu sein, was Sie am meisten interessiert sein würden.

hoffte, das hilft.

7

Um auf Bob zu erweitern Kinney referenced article and fragments (+1), würde Ich mag zu erklären, was ich die wahrscheinliche Ursache des Problems betrachten, die eigentlich nicht mit dem AWS Security Token Service (STS) verwandt ist, sondern beinhaltet ein paar Feinheiten mit Amazon S3 IAM policies begegnet häufig allgemein:

die Example Policies for Amazon S3 Abdeckung verschiedene Anwendungsfälle ähnlich oder Zusammenhang mit Ihnen - speziell auf Ihre Anwendungsfälle enthalten offenbar Beispiel 2: eine Gruppe erlaubt einen freigegebenen Ordner in Amazon S3 zu haben - Sie effektiv, dass in dem ersten umgesetzt haben Richtlinie des ersten Fragments bereits (modulo GetObjectVersion, DeleteObjectVersion, die nur relevant sind, wennverwendet wird).

Was jetzt noch fehlt, ist ListBucket - bitte folgende Feinheiten beachten:

Viele Anwendungsfälle wie das Ihre daher zwei verschiedene politische Fragmente erfordern getrennt, das Objekt zu adressieren und die Eimer bezogene Operationen, entsprechend werden Sie wahrscheinlich brauchen etwas wie folgt aus:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:ListBucket"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/") 
end 
Verwandte Themen