Я действительно копаюсь в AWS, пытаясь понять, чего мне здесь не хватает. Я хотел бы сделать так, чтобы пользователь IAM мог загружать файлы из корзины S3 - не просто делая файлы полностью общедоступными - но мне отказывают в доступе. Если кто-нибудь сможет заметить, что случилось, я буду в восторге.
Что я уже сделал:
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?).
Я также пробовал добавить политику пользователя. Хотя я не знаю, зачем это было нужно, я подумал, что это не повредит, поэтому я прикрепил это к my-user.
{
"Statement": [
{
"Sid": "Stmt1384889624746",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Те же результаты.
Я тоже боролся с этим, но я нашел ответ здесь https://stackoverflow.com/a/17162973/1750869 это помогло мне решить эту проблему. Репост ответа ниже.
Необязательно открывать разрешения для всех. Используйте приведенные ниже политики сегмента для источника и назначения для копирования из сегмента в одной учетной записи в другую с помощью пользователя IAM.
Сегмент для копирования - SourceBucket
Сегмент для копирования - 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
Когда я столкнулся с той же проблемой, оказалось, что AWS требует включения шифрования на стороне сервера. Итак, у меня успешно сработала следующая команда:
aws s3 cp test.txt s3://my-s3-bucket --sse AES256
Я бы не рекомендовал вариант «Любой аутентифицированный пользователь AWS», упомянутый Джеймсом.
При этом добавляется ACL на уровне сегмента, который позволяет любой учетной записи AWS (а не только вашим пользователям IAM) перечислять / удалять / изменять ACL для этого сегмента.
т.е. общедоступное чтение / запись для всех, у кого есть учетная запись aws.
Мне удалось исправить это без необходимости писать политики - в консоли S3 (веб-интерфейс) я выбрал сегмент, а на вкладке разрешений выбрал «Any Authenticated AWS User» и поставил галочки во всех полях.
ОБНОВИТЬ: как указано в комментариях, «Любой аутентифицированный пользователь AWS» - это не только пользователи в вашей учетной записи, это все пользователи, прошедшие аутентификацию AWS, пожалуйста, используйте с осторожностью
Даже если ваши политики IAM настроены правильно, вы все равно можете получить сообщение об ошибке, например An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied
из-за требований MFA (многофакторной аутентификации) к вашим учетным данным. Это может застать вас врасплох, потому что, если вы уже вошли в консоль AWS, окажется, что ваши учетные данные работают нормально, а сообщение об ошибке «Отказано в разрешении» от aws cli не особенно полезно.
Уже есть несколько хороших инструкций по настройке MFA с помощью aws cli:
По сути, вам нужно получить адрес вашего устройства MFA и отправить его с кодом с вашего устройства, чтобы получить временный токен.
Я просто зашел в веб-интерфейс и щелкнул по корзине, затем перешел к разрешениям, а затем перешел к политике. Когда я открыл его, я просто нажал удалить. Я сделал это, потому что думаю, это тоже была конфигурация.
Я вернулся на главную страницу s3, затем щелкнул ведро и попытался удалить его, и это сработало.
даже когда я сделал это с помощью aws-cli, используя
$ aws s3 rb s3://bucket-name --force
Во всяком случае, это то, что у меня сработало. Политика разрешений не дает вам удалить корзину.
Как только я получил эту ошибку, просто попытавшись запустить:
aws s3 cp s3://[bucketName]/[fileName] .
в папке, где у меня не было разрешений. Это глупо, но прежде чем двигаться дальше, убедитесь, что вы являетесь владельцем папки, в которой находитесь!
Проблема возникает, когда вы вставляете недопустимые имена ресурсов или объектов. У меня была такая же проблема с boto3 (в моем случае это было недопустимое имя корзины)