2015-10-22 6 views
9

Wir möchten einige Daten in S3 speichern und nur EC2-Instanzen oder einem bestimmten Benutzer mit einer bestimmten IAM-Rolle erlauben, auf sie zuzugreifen. Leider haben wir einige Probleme damit.Wie beschränke ich den Zugriff auf S3-Bucket für bestimmte IAM-Rolle?

Wir setzten eine Politik auf dem heißen Stein wie diese

{ 
"Version": "2012-10-17", 
"Id": "SamplePolicy", 
"Statement": [ 

    { 
     "Sid": "Stmt1331136294179", 
     "Effect": "Deny", 
     "NotPrincipal": { 
      "AWS": [ 
       "arn:aws:iam::our-account-number:user/the-user", 

       "arn:aws:iam::our-account-number:role/the-role" 
      ] 
     }, 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::the-bucket/*" 
    }, 
     { 
     "Sid": "Stmt1331136364169", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": [ 
       "arn:aws:iam::our-account-number:user/the-user", 
       "arn:aws:iam::our-account-number:role/the-role" 
      ] 
     }, 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::the-bucket/*" 
    } 

]} 

Wenn wir den Eimer (mit Boto) Zugang mit Benutzer ippen es funktioniert gut, von einem lokalen Rechner oder einer EC2-Instanz.

Aber wenn wir den Eimer von Boto Zugang bekommen wir

ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied

ich bestätigt habe, dass die Instanz die korrekte IAM Rolle

curl http://169.254.169.254/latest/meta-data/iam/info/ 
{ 
    "Code" : "Success", 
    "LastUpdated" : "2015-10-22T09:09:31Z", 
    "InstanceProfileArn" : "our-account-number:instance-profile/the-role", 
    "InstanceProfileId" : "instance-rpofile-id" 
} 

Ich habe auch die Politik zu entfernen versucht, aus dem Eimer, der es tatsächlich wieder zugänglich macht. Irgendwelche Ideen, wie man damit umgeht?

Das Beispiel, das ich hier geteilt habe, ist eine vereinfachte Version, die ich für das Debugging gemacht habe. In der Produktion müssen wir das Objekt zwingen, mit KMS verschlüsselt zu werden und eine Zugangsrichtlinie für den Schlüssel zu haben. Wir mögen diese Lösung sehr und ziehen es vor, sie zu behalten, wenn wir können.

Dank

+0

Können Sie Ihre Rolle Politik zeigen? –

+0

'code { "Version": "2012.10.17", "Statement": [{ "Effect": "Erlauben", "Aktion": "s3: *", "Ressource": "*" } ] } ' –

Antwort

5

Ein Fehler mit diesem, die ich oft gemacht habe beinhaltet Ihre ARN

Für einige Berechtigungen Sie es auf den heißen Stein müssen sich (no/*) ... und einige müssen Sie auf Es ist Inhalt.

ich versuchen würde zu verwenden, was Sie im Moment haben, sind nur beide, so etwas wie ...

"Resource": ["arn:aws:s3:::the-bucket/*", "arn:aws:s3:::the-bucket"] 
3

Die hier Problem ist, dass für NotPrincipal Sie die spezifische Sitzungsrolle zur Verfügung stellen müssen. Wenn Sie InstanceProfiles (oder Lambda) verwenden, ist diese Sitzungsrolle leider dynamisch. AWS unterstützt keine Platzhalter im Prinzipalfeld, daher ist es grundsätzlich nicht möglich, NotPrincipal mit einem InstanceProfile zu verwenden.

Siehe AWS Support Antwort hier, die es als eine bekannte Einschränkung anerkennt: https://forums.aws.amazon.com/message.jspa?messageID=740656#740656