Boto 403 AccessDenied-Ausnahme mit IAM-Benutzeranmeldeinformationen, Funktioniert in Cyberduck und der AWS-Webkonsole

Ich habe viele Fragen dazu auf Stackoverflow gefunden, aber keines hat mein Problem gelöst. Nach vielen googeln sehe ich noch AccessDenied Exception:


AccessDenied
ADF9C0DE6C86DF4F
JwQLkNB0LuJvh0jwrsJe9wazxLsd+hrZ2qwvjCvmXYd2A/ckCrsotRMHm

Hier sind meine Richtlinien für Benutzer und Gruppen:

Benutzerrichtlinie:

{
"Statement":[
  {
     "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest",
     "Action":"s3:*",
     "Effect":"Allow",
     "Resource":["arn:aws:s3::: mybucket", "arn:aws:s3:::mybucket/*"],
     "Condition":{
        "StringLike":{"s3:prefix":["Development/*"]
        }
     }
  },
  {
    "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", 
    "Action":"s3:*",
    "Effect":"Allow",
    "Resource":["arn:aws:s3::: mybucket/Development/*"]
  },
  {
     "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment",
     "Action": ["s3:ListBucket"],
     "Effect": "Deny",
     "Resource": ["arn:aws:s3::: mybucket", "arn:aws:s3::: mybucket/*"],
     "Condition":{  "StringNotLike": {"s3:prefix":["Development/*"] },
                    "Null"         : {"s3:prefix":false }
      }
  }
]
}

Gruppenrichtlinie:

{
"Statement": [
{
  "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
  "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3:::*"]
},
{
  "Sid": "AllowRootLevelListingOfCompanyBucket",
  "Action": ["s3:ListBucket"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3::: mybucket", "arn:aws:s3::: mybucket/*"],
  "Condition":{
      "StringEquals":{"s3:prefix":[""]}
   }
},
{
  "Sid": "RequireFolderStyleList",
  "Action": ["s3:ListBucket"],
  "Effect": "Deny",
  "Resource": ["arn:aws:s3:::*"],
  "Condition":{
      "StringNotEquals":{"s3:delimiter":"/"}
   }
 },
{
  "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup",
  "Action": ["s3:*"],
  "Effect": "Deny",
  "Resource":["arn:aws:s3:::mybucket/Private/*"]
},
{
  "Sid": "DenyListBucketOnPrivateFolder",
  "Action": ["s3:ListBucket"],
  "Effect": "Deny",
  "Resource": ["arn:aws:s3:::*"],
  "Condition":{
      "StringLike":{"s3:prefix":["Private/"]}
   }
}
]
}

Erstellte einen Benutzer mit dem Benutzernamen testuser dann erhalten access_key und secret_access_key für diesen IAM-Benutzer. Jetzt kann ich mybucket und seinen Unterordner mit aws web console und cyberduck aufrufen.

Aber immer, wenn ich versuche, mit Boto zuzugreifen, bekomme AccessDenied Exception (Error 403).

Boto-Code:

<!-- language: python -->
from boto.s3.connection import S3Connection
connect = S3Connection('_______________________','_____________________')
# Without Validate
bucket = conn.get_bucket('mybucket', validate=False) #here got bucket object
bucket.get_key('one/two/three.png') # AccessDenied


#With Validate
bucket = conn.get_bucket('mybucket') #AccessDenied

Sogar ich hatte das gleiche Problem, als ich versuchte, Boto-rsync zu verwenden.

Irgendwelche Vorschläge ??

0
Mein Problem ist meiner Meinung nach damit verbunden, aber ich verwende EB (AWS Elastic Beanstalk CLI). Funktioniert gut für mich über AWS-Konsole zu implementieren, aber nicht mit dem Tool, ich bekomme S3 403 Errors auf create_application_version. Alle Boto-Tests bestehen, also denke ich, es ist ein Problem mit der CLI selbst. Arbeitet nur an 1 System mit den gleichen Krediten, versuchte es zu verschieben und es brach.
hinzugefügt der Autor radtek, Quelle

1 Antworten

Fehler 403 bedeutet Zugriff verweigert, sodass ein Authentifizierungsproblem vorliegt. Um den API-Aufruf und die Antwort zu analysieren, kann man die folgende Zeile verwenden:

boto.set_stream_logger('boto')

einige Punkte, die ich bemerkt habe:

  • Die Gruppen- und Benutzerregeln sind in Ordnung, wobei führender Platz vor "mybucket"
  • entfernt ist
  • Der erste Verzeichnisname lautet "Entwicklung" anstelle von "eins"
  • "Ohne Validierung" bedeutet Datei direkt zugreifen

Der folgende Code funktioniert einwandfrei:

import boto
conn = boto.connect_s3("id","secret")
bucket = conn.get_bucket('mybucket', validate=False)
bucket.get_key('Development/two/three.png')
# 

Aber ich bin neu in IAM, und es scheint "With Validate" versucht zuerst "/ mybucket /" zu lesen, aber es wird über die Benutzerrichtlinie ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment verweigert.

edited to comment "to access all keys inside Development" try this::

list = bucket.list("Development/",delimiter="/")
for key in list:
    print key.name
0
hinzugefügt
Danke für den Versuch. Sie haben Recht, dass bucket.get_key ('Development/two/three.png') das funktioniert, aber ich versuche auf alle Schlüssel innerhalb der Entwicklung mit "bucket.get_all_keys ()" zuzugreifen.
hinzugefügt der Autor xrage, Quelle
Versuchen Sie Folgendes: bucket.get_all_keys (delimiter = "/", prefix = "Entwicklung /")
hinzugefügt der Autor andpei, Quelle