Что вызывает отказ в доступе при использовании 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

Sergio
источник
1
Боже мой, ты мой герой. Мне просто не хватало разрешения ListBucket на уровне корзины. Я до сих пор не знаю, зачем мне нужен контейнер, чтобы извлечь из него объект, но ничего страшного. Может быть, это всего лишь причуда использования команды aws?
Джош Ганьон
Да, это довольно странно. Можно подумать, что для проверки работоспособности будет достаточно иметь одну политику s3: * (какой бы небезопасной она ни была).
Серхио
fml, 2 дня потрачены впустую для этого разрешения ListBucket. хороший улов
чакке
Потратил много времени .. Это был нужный ответ. ListBucket - имя сегмента, GetObject - имя сегмента / *
rsmoorthy
12

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

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
zjor
источник
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 (в моем случае это было неверное имя корзины)

Юнуса
источник