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

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

У меня есть следующая политика 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.

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

При крафте 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/*"
      ]
    }
  ]
}