Действие S3 Bucket не распространяется ни на какие ресурсы

124

Я следую инструкциям из этого ответа, чтобы создать следующую политику корзины S3:

{
  "Id": "Policy1495981680273",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1495981517155",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::surplace-audio",
      "Principal": "*"
    }
  ]
}

Я получаю следующую ошибку:

Действие не распространяется ни на какие ресурсы в заявлении

Что мне не хватает в моей политике?

Филип Киркбрайд
источник
1
Я пробовал решение по ссылке: stackoverflow.com/a/36551238/2786039 И теперь оно работает. С уважением
Vuong Нгуен

Ответы:

219

Из документов IAM http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Action

Некоторые сервисы не позволяют указывать действия для отдельных ресурсов; вместо этого любые действия, перечисленные в элементе Action или NotAction, применяются ко всем ресурсам в этой службе. В этих случаях вы используете подстановочный знак * в элементе Resource.

С этой информацией ресурс должен иметь значение, подобное приведенному ниже:

"Resource": "arn:aws:s3:::surplace-audio/*"
Олувафеми Суле
источник
40
Не могу поверить, что это не упоминается в политике корзины и / или генераторе политик!
Carles Alcolea
4
Я использую * и все еще выдает эту ошибку. может кто-нибудь мне помочь?
Иегуда Клинтон
@YehudaClinton, у меня работает. не забудьте добавить оба / *
RMati
74

Простое удаление s3:ListBucketразрешения было недостаточно хорошим решением для меня, и, вероятно, не для многих других.

Если вам нужно s3:ListBucketразрешение, вам нужно просто иметь простую арку ведра (без /*конца), поскольку это разрешение применяется к самому ведру, а не к элементам в ведре.

Как показано ниже, у вас должно быть s3:ListBucketразрешение в виде отдельного утверждения от разрешений, относящихся к элементам внутри корзины, таким как s3:GetObjectи s3:PutObject:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"        
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject", 
        "s3:PutObject"
      ],
      "Principal": {
        "AWS": "[IAM ARN HERE]"
      },
      "Resource": "arn:aws:s3:::my-bucket-name/*"
    }
  ]
}
Люк
источник
Согласовано. Для некоторых действий требуется разрешение ListBucket, прежде чем вы сможете выполнить GetObject, поэтому этот ответ более подробный.
3cheesewheel
2
Это работает для меня и только подчеркивает, сколько работы AWS еще предстоит сделать, чтобы направлять пользователей к выполнению основных задач.
volvox
41

Действие при ошибке не применяется ни к каким ресурсам в инструкции

Просто это означает, что действие (вы написали в политике) не применяется к ресурсу. Я пытался обнародовать свою корзину, чтобы любой мог скачать ее. Я получал ошибку, пока не удалил ("s3: ListBucket") из своего оператора.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket-name/*",
      "Principal": "*"
    }
  ]
}

Поскольку сегмент списка не применяется внутри сегмента, то удаление этой политики действий работало нормально.

Vaseem007
источник
Спасибо, это сработало для меня, удалив "s3: ListBucket".
Пол Уотсон
14

Просто столкнулся с этой проблемой и нашел более короткое решение для тех, кто хочет, чтобы ListBucket и GetObject были в одной политике.

{
  "Id": "Policyxxxx961",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmtxxxxx4365",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
          "arn:aws:s3:::bucket-name",
          "arn:aws:s3:::bucket-name/*"
      ],
      "Principal": "*"
    }
  ]
}
Алекс Спенс
источник
Неправильно - Principalэто недопустимо для грамматики политики S3.
azec-pdx
Ни одно из вышеперечисленных решений у меня не сработало, принципал либо недействителен, либо мне будет отказано в доступе.
Даниэль
Это правильно, в этом случае ресурс должен быть массивом и включать эти 2 строки ... Проголосуйте.
Assil 06
4

Я также столкнулся с аналогичной проблемой при создании ведра

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949"
            ]
        }
    ]
}

Я изменил приведенный выше код на

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mrt9949/*"
            ]
        }
    ]
}

добавьте / * к имени вашего ведра, это решит проблему

Вот мое имя ведра mrt9949

Рави Тежа Муребойна
источник
Спасибо! Потратил много времени на поиски этого
Jack_Hardy
4

В моем случае решение этой ошибки было попыткой удалить некоторые из действий, которые я применял. Некоторые из них не имеют отношения к этому ресурсу или не могут работать с ним. В этом случае это не позволит мне включить их:

GetBucketAcl ListBucket ListBucketMultipartUploads

Иегуда Клинтон
источник
ListBucket меня достал! Спасибо за это
Quad64Bit
Для меня сработало только при сохранении getObjet
LittleTiger
0

Вы должны проверить шаблон arn, определенный в теге Resource для Policy-

"Ресурс": "arn: aws: s3 ::: s3mybucketname / *"

Добавление «/ *» в конце поможет решить проблему, если вы столкнетесь с ней даже после того, как ваша политика общего доступа разблокирована для вашего сегмента.

Пинаки
источник
0
  • Перейдите на Amazon S3 в своем экземпляре.
  • Перейдите в Permissions -> вкладку Public Access.
  • Выберите «Изменить» и снимите флажок «Блокировать весь общий доступ и сохранить».
  • Вы увидите тег «Public» на вкладке «Разрешение» и в списке управления доступом.
Чатура Девинда
источник
0

Вы также можете настроить ListBuckets для каждой папки, например

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1521238702575",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::buckets.email/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "[red]"
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringEquals": {
                    "s3:delimiter": "/",
                    "s3:prefix": [
                        "",
                        "domain.co",
                        "domain.co/user"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1586754972129",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::buckets.email",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "domain.co/user/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::596322993031:user/[red]"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::buckets.email/domain.co/user/*"
        }
    ]
}

Эти правила используются вместе с SES для получения электронной почты, но позволяют внешнему пользователю просматривать файлы, помещенные в корзину SES. Я выполнил инструкции отсюда: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

Кроме того, вы должны указать префикс в виде domain.co/user/косой черты WITH в конце при использовании SDK, иначе вы получите отказ в доступе. надеюсь, что это поможет кому-нибудь

Zavr
источник