Что вызывает отказ в доступе при использовании aws cli для загрузки с Amazon S3?


57

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

Что я сделал до сих пор:

  • Создан пользователь my-user (для примера)
  • Сгенерировал ключи доступа для пользователя и поместил их в ~ / .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.

Bucket для копирования из - SourceBucket

Bucket для копирования - DestinationBucket

Исходный идентификатор учетной записи AWS - XXXX – XXXX-XXXX

Исходный пользователь IAM - src – iam-user

Приведенная ниже политика означает - пользователь IAM - XXXX – XXXX-XXXX: src – iam-user имеет привилегии 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использовать ведро «по умолчанию» ...
— Майкл Ю

Если вы используете ключ KMS, отличный от используемого по умолчанию, вам также необходимо передать его: тем не --sse-kms-key-id 0123-abc-etc менее, непонятная часть заключается в том, что для использования своего собственного ключа KMS необходимо иметь разрешение IAM, kms:GenerateDataKeyиначе вам все равно будет отказано в доступе.
— дигарок

Вопрос о загрузке .. вы делаете загрузку на зашифрованный S3, отсюда и требование к ключу.
— Ilhicas

4

Я бы не рекомендовал вариант «Любой аутентифицированный пользователь AWS», упомянутый Джеймсом.

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

т.е. публичное чтение / запись для всех, кто имеет аккаунт aws.


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

1
Ага. Получатель «Аутентифицированный пользователь» в списках ACL S3 означает все учетные записи AWS. Он обеспечивает выполнение подписанных запросов, но не более того. Вот ссылка: ссылка
— Андрей

3

Мне удалось это исправить без необходимости написания политик - в консоли S3 (веб-интерфейс) я выбрал корзину, а на вкладке разрешений - «Любой аутентифицированный пользователь AWS» и выписал все коробки.

ОБНОВЛЕНИЕ: как указано в комментариях «Любой прошедший проверку подлинности пользователь AWS» - это не просто пользователи в вашей учетной записи, это все пользователи, прошедшие проверку подлинности AWS, пожалуйста, используйте с осторожностью


Я полагаю, что это создает политику для вас. Отметив все галочки, вы получите ListBucket и т. Д. И многое другое.
— Джош Ганьон

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

2

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

Уже есть несколько хороших инструкций по настройке MFA с помощью aws cli:

По сути, вам нужно получить адрес вашего устройства MFA и отправить его вместе с кодом вашего устройства, чтобы получить временный токен.


Ты спас мой день, братан!
— shintaroid

Да, это причина! Почему AWS не показал эту причину в выводе?
— tommy.qichang

0

Я просто включил веб-интерфейс и нажал на корзину, затем перешел к разрешениям и затем к политике. Когда я открыл его, я просто нажал «Удалить». Я сделал это, потому что я думаю, что это была конфигурация.

Я вернулся на главную страницу 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.