Boto 403 AccessDenied Exception con credenciales de usuario de IAM, Funciona en Cyberduck y la consola web de AWS

He encontrado muchas preguntas con respecto a esto en stackoverflow pero ninguno resolvió mi problema. Después de mucho Google todavía me enfrento a AccessDenied Exception:


AccessDenied
ADF9C0DE6C86DF4F
JwQLkNB0LuJvh0jwrsJe9wazxLsd+hrZ2qwvjCvmXYd2A/ckCrsotRMHm

Aquí están mis documentos de políticas para usuario y grupo:

Política del usuario:

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

Política de grupo:

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

Creado un usuario con nombre de usuario - testuser luego obtuve access_key y secret_access_key para este usuario de IAM. Ahora puedo acceder a mybucket y su subcarpeta usando la consola web y el cyberduck.

Pero cada vez que intento acceder usando boto, obtengo AccessDenied Exception (Error 403).

Código de Boto:

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

Incluso me enfrenté al mismo problema cuando estaba tratando de usar boto-rsync.

Alguna sugerencia ??

0
Mi problema, creo, está relacionado con esto, pero estoy usando EB (AWS Elastic Beanstalk CLI). Funciona bien para implementar a través de AWS Console pero no para usar la herramienta, obtengo errores S3 403 en create_application_version. Todas las pruebas de boto pasan, así que creo que es un problema con la CLI. Funciona solo en 1 sistema que utiliza los mismos creds, intentó moverlo y se rompió.
agregado el autor radtek, fuente

1 Respuestas

El error 403 significa acceso denegado, por lo que existe un problema de autenticación. Para analizar la llamada API y la respuesta, puede usar la siguiente línea:

boto.set_stream_logger('boto')

algunos puntos que he notado:

  • las Reglas de grupo y de usuario están correctas, con espacio inicial adelantado delante de "mybucket"
  • el primer nombre de directorio es "Desarrollo" en lugar de "uno"
  • "Sin validar" significa acceder directamente al archivo

El siguiente código funciona bien:

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

Pero soy nuevo en IAM, y parece que "Con Validate" primero intenta leer "/ mybucket /" pero se rechaza a través de la Política de usuario ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment.

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

list = bucket.list("Development/",delimiter="/")
for key in list:
    print key.name
0
agregado
Gracias por probar. Tienes razón en que bucket.get_key ('Desarrollo/dos/tres.png') funciona, pero estoy intentando acceder a todas las claves dentro de Desarrollo usando "bucket.get_all_keys ()".
agregado el autor xrage, fuente
Pruebe esto: bucket.get_all_keys (delimiter = "/", prefix = "Development /")
agregado el autor andpei, fuente