Назад | Перейти на главную страницу

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

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

Что я уже сделал:

Политика ведра:

{
  "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 (в моем случае это было недопустимое имя корзины)