Boto 403 AccessDenied Exception с учетными данными пользователя IAM, работает в Cyberduck и веб-консоли AWS

Я нашел много вопросов по этому поводу в stackoverflow, но ни один из них не решил мою проблему. После большого количества поисковых запросов я столкнулся с исключением AccessDenied:

<Error>
<Code>AccessDenied</Code>
</Message><RequestId>ADF9C0DE6C86DF4F</RequestId>
<HostId>JwQLkNB0LuJvh0jwrsJe9wazxLsd+hrZ2qwvjCvmXYd2A/ckCrsotRMHm</HostId>
</Error>

Вот мои документы политики для пользователя и группы:

Пользовательская политика:

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

Групповая политика:

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

Создал пользователя с именем пользователя - testuser затем получил access_key и secret_access_key для этого пользователя IAM. Теперь я могу получить доступ к mybucket и его подпапке с помощью веб-консоли aws и Cyberduck.

Но всякий раз, когда я пытаюсь получить доступ с помощью boto, получаю исключение AccessDenied (ошибка 403).

Код Бото:

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

Даже я столкнулся с той же проблемой, когда пытался использовать boto-rsync.

Какие-либо предложения ??


person xrage    schedule 17.12.2013    source источник
comment
Моя проблема, я думаю, связана с этим, но я использую EB (AWS Elastic Beanstalk CLI). У меня отлично работает развертывание через консоль AWS, но без использования инструмента, я получаю ошибки S3 403 на create_application_version. Все бото-тесты проходят, поэтому я думаю, что это проблема самого CLI. Работает только на 1 системе, использующей те же кредиты, попытался переместить ее, и она сломалась.   -  person radtek    schedule 02.01.2015


Ответы (1)


Ошибка 403 означает, что доступ запрещен, поэтому возникла проблема с аутентификацией. Для анализа вызова API и ответа можно использовать следующую строку:

boto.set_stream_logger('boto')

некоторые моменты, которые я заметил:

  • групповые и пользовательские правила в порядке, с удаленным начальным пробелом перед "mybucket"
  • имя первого каталога "Разработка" вместо "один"
  • «Без проверки» означает прямой доступ к файлу.

Следующий код работает нормально:

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

Но я новичок в IAM, и кажется, что «С проверкой» сначала пытается прочитать «/ mybucket /», но это отклонено с помощью пользовательской политики ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment.

отредактировано для комментария "для доступа ко всем ключам внутри разработки" попробуйте следующее::

list = bucket.list("Development/",delimiter="/")
for key in list:
    print key.name
person andpei    schedule 18.12.2013
comment
Спасибо за попытку. Вы правы в том, что Bucket.get_key('Development/two/three.png') работает, но я пытаюсь получить доступ ко всем ключам внутри разработки с помощью Bucket.get_all_keys(). - person xrage; 18.12.2013
comment
Попробуйте это: Bucket.get_all_keys(delimiter=/,prefix=Development/) - person andpei; 18.12.2013