Как разрешить пользователю загружать файлы в корзину S3, но не перезаписывать или удалять?


19

У меня есть следующая политика IAM для пользователя

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1395161912000",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Sid": "list",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

Цель состоит в том, чтобы позволить пользователю загружать файлы в корзину, но не перезаписывать или удалять. Это для резервного копирования. Я начал с ListBucketи PutObject, но добавил, *поскольку это не сработало. Даже не *позволяет пользователю загружать файлы, просто получая Access Denied.

Когда я пытаюсь имитатор, он возвращается Denied - Implicitly denied (no matching statements found).на ListBucket, что кажется странным , так как я неявно допускал , что.

Я пробовал и Cyberduck, и 3Hub в качестве клиентов S3.

Есть идеи, что случилось?

Ответы:


25

При разработке политик Amazon IAM для Amazon S3 необходимо учитывать разницу между операциями над службой (например, ListAllMyBuckets ), операциями над корзинами (например, ListBucket ) и операциями над объектами (например, GetObject ).

В частности, Resourceспецификация вашей политики должна учитывать соответствующие целевые объекты в соответствии со следующими шаблонами (см., Например, различные примеры политик для Amazon S3 ):

  • Операции по обслуживанию - arn:aws:s3:::*
  • Операции с ведрами - arn:aws:s3:::<bucket>
  • Операции над объектами - arn:aws:s3:::<bucket>/<object>

Решение

Вы сталкиваетесь Access Denied, потому что вы указали ресурс уровня сегмента, для PutObjectкоторого требуется спецификация ресурса уровня объекта, например, arn:aws:s3:::<bucket>/*- следующая политика должна охватывать ваш пример использования:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucketname/*"
      ]
    }
  ]
}

1
Удивительно, что работал безупречно. Спасибо! Так sidне требуется?
Знаркус

1
По словам Сид , это необязательный идентификатор, который вы предоставляете для заявления политики , который должен быть уникальным в политике . Поскольку кажется, что он работает нормально без (но см. Ниже), я склонен удалить его здесь для краткости и при настройке политик, но не беспокоюсь, например, при автоматической генерации политик - однако, в соответствии с последующим примечанием : некоторые сервисы AWS (например, Amazon SQS или Amazon SNS) может потребоваться этот элемент [...] .
Штеффен Опель

3
ОП говорит, что они хотят "позволить пользователю загружать файлы в корзину, но не перезаписывать или удалять", но эта политика предоставляет PutObject, что позволяет переопределять объекты, нет? Я думаю, что нет никакого способа отделить это.
Сюн Чямов

2
@XiongChiamiov - действие S3 «PutObject» действительно предполагает перезапись, просто S3 работает по умолчанию. Если вам нужна защита от случайного удаления, вы можете обратиться к разделу Использование версий для сохранения, извлечения и восстановления каждой версии каждого объекта, хранящегося в вашей корзине Amazon S3. - это позволяет легко восстанавливаться как от непреднамеренных действий пользователя, так и от сбоев приложения .
Штеффен Опель

4
Да, управление версиями дает вам возможность восстановить объекты, которые были перезаписаны (но вы должны обнаружить, что они были, а затем пойти и сделать это). В любом случае, -1, потому что он не дает точного ответа на вопрос.
Сюн Чямов
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.