Що спричинює відмову в доступі під час використання Aws cli для завантаження з Amazon S3?


57

Я дійсно махаю навколо AWS, намагаючись зрозуміти, чого мені тут не вистачає. Я хотів би зробити так, щоб користувач IAM міг завантажувати файли з відра S3 - не лише роблячи ці файли повністю загальнодоступними, - але мені доступ заборонено. Якщо хтось зможе помітити те, що немає, я буду приголомшений.

Що я робив до цього часу:

  • Створив користувача під назвою мій користувач (заради прикладу)
  • Створено ключі доступу для користувача та помістіть їх у ~ / .aws на екземплярі EC2
  • Створив політику ковша, на яку я сподівався, що надає доступ моєму користувачеві
  • Пробіг команду aws s3 cp --profile my-user s3://my-bucket/thing.zip .

Політика щодо відра:

{
  "Id": "Policy1384791162970",
  "Statement": [
    {
      "Sid": "Stmt1384791151633",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/my-user"
      }
    }
  ]
}

Результат, A client error (AccessDenied) occurred: Access Deniedхоча я можу завантажити, використовуючи ту саму команду та клавіші доступу за замовчуванням (root account?).

Я також спробував додати політику користувача. Хоча я не знаю, чому це потрібно, я думав, що це не зашкодить, тому я приєднав це до свого користувача.

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

Ті ж результати.

Відповіді:


39

Я теж боровся з цим, але я знайшов відповідь тут https://stackoverflow.com/a/17162973/1750869, який допоміг вирішити цю проблему для мене. Відновлення відповіді нижче.


Ви не повинні відкривати дозволи для всіх. Використовуйте наведені нижче політики Bucket щодо джерела та місця призначення для копіювання з відра в один обліковий запис до іншого за допомогою користувача IAM

Відро для копіювання з - SourceBucket

Відро для копіювання в - DestinationBucket

Джерело ідентифікатора акаунта AWS - XXXX – XXXX-XXXX

Джерело IAM User - src – iam-user

Нижченаведена політика означає - користувач IAM - XXXX – XXXX-XXXX: src – iam-користувач має s3: ListBucket і s3: привілеї GetObject на SourceBucket / * і s3: ListBucket і s3: привілеї PutObject на DestinationBucket / *

У SourceBucket політика повинна виглядати так:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::SourceBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:GetObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: SourceBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

На DestinationBucket політикою має бути:

{
"Id": "Policy1357935677554",
"Statement": [
    {
        "Sid": "Stmt1357935647218",
        "Action": [
            "s3:ListBucket"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
    },
    {
        "Sid": "Stmt1357935676138",
        "Action": ["s3:PutObject"],
        "Effect": "Allow",
        "Resource": "arn:aws:s3::: DestinationBucket/*",
        "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
   }
]
}

команда, яку потрібно запустити, - це s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1


1
О мій боже, ти мій герой. Мені просто не вистачало дозволу ListBucket на рівні відра. Я досі не знаю, навіщо мені брати відро для того, щоб копіювати з нього об’єкт, але це нормально. Можливо, це лише химерність використання команди aws?
Джош Ганьон

Так, це досить дивно. Ви можете подумати, що єдиної політики s3: * (як би не було безпечно) було б достатньо для перевірки правильності.
Серхіо

fml, витрачено 2 дні на цей дозвіл ListBucket. хороший улов
чакке

Провели багато часу .. Це була потрібна відповідь. ListBucket - ім'я відра, GetObject - ім'я відра / *
rsmoorthy

12

Коли я зіткнувся з тією ж проблемою, виявилося, що AWS вимагає включення шифрування на стороні сервера. Отже, наступна команда для мене успішно працювала:

aws s3 cp test.txt s3://my-s3-bucket --sse AES256

3
Дякую! У моєму випадку було --sse aws:kmsвикористовувати відро "за замовчуванням" ...
Michael Yoo

Якщо ви використовуєте ключ KMS, який не використовується за замовчуванням, вам також потрібно пройти: --sse-kms-key-id 0123-abc-etc Однак, частина, яка незрозуміла, полягає в тому, щоб використовувати власний ключ KMS, ви повинні мати дозвіл IAM, kms:GenerateDataKeyінакше вам буде відмовлено у доступі.
digarok

Питання стосується завантаження .. Ви робите завантаження на зашифрований S3, звідси і вимога до ключа.
Ілхікас

4

Я б не рекомендував "будь-який аутентифікований користувач AWS", згаданий Джеймсом.

Це додає ACL на рівні відра, який дозволяє будь-якому обліковому запису AWS (не лише вашим користувачам IAM) перелічувати / видаляти / змінювати-acls для цього відра.

тобто публічне читання / запис для всіх, хто має обліковий запис Aws.


Ви перевірили це? У мене склалося враження, що обліковий запис AWS насправді означає будь-яку організацію, яка має організацію - наприклад, користувача, екземпляр EC2, роль IAM, але не когось із іншого облікового запису. Я можу помилятися, і я відредагую свій внесок і швидко проведу аудиторську перевірку, якщо це так. Дякую.
Джеймс Данмор

1
Так. Отриманий грант "Автентифікований користувач" в S3 ACL означає всі акаунти AWS. Він виконує підписані запити, але нічого більше. Ось довідка: посилання
Андрій

3

Мені вдалося це виправити без необхідності писати поліси - з консолі S3 (web ui) я вибрав відро і на вкладці дозволів вибрав "Будь-який аутентифікований користувач AWS" і видав усі прапорці.

ОНОВЛЕННЯ: як зазначено в коментарях "Будь-який аутентифікований користувач AWS" - це не лише користувачі у вашому обліковому записі, це все користувачі, які мають автентифікацію AWS, будь ласка, використовуйте з обережністю


Я думаю, що це створює політику для вас. Якщо позначити всі вікна, ви отримаєте ListBucket тощо та багато іншого.
Джош Ганьон

Я впевнений, що це так - я просто знаю, що написання політики може бути біль, ці галочки можуть дати вам трохи більше, але хороший швидкий виправлення
Джеймс Данмор

2

Навіть якщо ваші політики IAM налаштовані правильно, ви все одно можете отримати помилку, наприклад, An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Deniedчерез вимоги MFA (Multi-Factor Authentication) на своїх облікових даних. Вони можуть заставити вас під охороною, оскільки якщо ви вже увійшли в консоль AWS, виявиться, що ваші облікові дані працюють нормально, а повідомлення про відмову в дозволі від aws cli не особливо корисне.

Уже є кілька хороших інструкцій щодо того, як налаштувати MFA за допомогою aws cli:

По суті, вам потрібно отримати адресу свого пристрою МЗС та надіслати його з кодом з вашого пристрою, щоб отримати тимчасовий маркер.


Ти врятував мій денний брате!
shintaroid

Яс, це причина! Чому AWS не показав цієї причини у висновку?
tommy.qichang

0

Я просто перейшов на webUI і натиснув на відро, потім перейшов до дозволів, а потім перейшов до політики. Коли я відкрив його, я просто натиснув видалити. Я зробив це для того, що я думаю, це була і конфігурація.

Я повернувся на головну сторінку s3, потім натиснув на відро і спробував його видалити, і воно спрацювало.

навіть коли я це робив за допомогою aws-cli

$ aws s3 rb s3://bucket-name --force  

У всякому разі, це те, що працювало для мене. Політика щодо дозволів не дозволяє вам видаляти відро.


0

Як тільки я отримав цю помилку, просто спробувавши запустити:

aws s3 cp s3://[bucketName]/[fileName] .

у папці, де у мене не було дозволів. Це нерозумно, але переконайтеся, що ви власник папки, в якій ви перебуваєте, перш ніж рухатися далі!


0

Проблема виникає, коли ви вставляєте недійсні імена ресурсів чи об'єктів. У мене була та сама проблема з boto3 (у моєму випадку це було недійсне ім'я відра)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.