Як дозволити користувачу завантажувати файли у відро 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

Розробляючи правила IAM від Amazon для 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
За словами Sid , це необов'язковий ідентифікатор, який ви надаєте для заяви про політику , яка повинна бути унікальною в межах політики . Зважаючи на те, що він працює добре (але дивіться нижче), я схильний видаляти його тут для стислості та при версіонізації політик, але не турбуюся, коли, наприклад, автоматично генеруйте політику - проте, відповідно до наступних приміток : Деякі служби AWS (наприклад, Amazon SQS або Amazon SNS) може знадобитися цей елемент [...] .
Steffen Opel

3
ОП каже, що вони хочуть "дозволити користувачу завантажувати файли у відро, але не перезаписувати чи видаляти", але ця політика надає PutObject, що дозволяє переосмислювати об'єкти, ні? Я думаю, що немає способу відокремити це.
Xiong Chiamiov

2
@XiongChiamiov - дія S3 «ПутьОб’єкт» насправді передбачає перезапис, просто як S3 працює за замовчуванням. Якщо вам потрібен захист від випадкового видалення, ви, можливо, захочете переглянути версію Використання версії для збереження, отримання та відновлення кожної версії кожного об’єкта, що зберігається у вашому відрі Amazon S3. - це дозволяє легко відновитись як від ненавмисних дій користувача, так і відмов програми .
Steffen Opel

4
Так, версія версія дає вам можливість відновити перезаписані об'єкти (але ви повинні виявити, що вони були, а потім перейти до цього). У будь-якому разі, -1 тому, що це не дає точної відповіді на питання.
Xiong Chiamiov
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.