Подтвердить что ты не робот

Амазонка с префиксом S3 не работает (AWS, IAM, STS, Ruby)

Я создаю приложение, использующее Amazon Security Token Service для создания временных пользователей для доступа к подкаталогу в ведре S3. Пользователи создаются пользователем IAM, который имеет полный доступ для чтения/записи к ведру (а также разрешения, необходимые для создания пользователей).

У меня есть создание пользователей, которые отлично работают вместе с истечением срока действия сеанса и более, но у меня возникают проблемы с правильной политикой, позволяющей использовать список ключей, основанный на префиксах. Разрешения, которые я хочу, чтобы конечный пользователь имел:

  • Чтение объектов, которые находятся в определенном префиксе
  • Запись объектов в один и тот же определенный префикс
  • Список всех объектов, которые находятся в определенном префиксе

Мне удалось читать и писать, но как-то независимо от того, что я пытаюсь получить доступ к списку, работает неправильно. Вот код Ruby, который я использовал, когда был ближе:

AWS::STS::Policy.new do |policy|
  policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"],
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*"
  )

  policy.allow(
    actions: ["s3:*"],
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
  ).where(:s3_prefix).like("#{folder_path}/*")
end

Если я помню, это позволило мне читать и писать, но не перечислять. Поскольку я все еще в разработке, я изменил код на это:

AWS::STS::Policy.new do |policy|
  # FIXME: This is way too permissive, but it not working to be more specific.
  policy.allow(
    actions: ["s3:*"],
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
  )
end

Это работает на 100% с очевидной проблемой, что ничто не ограничено префиксом, который позволит пользователям сжиматься друг с другом.

Что я делаю неправильно в своей политике?

4b9b3361

Ответ 1

Чтобы развернуть статью и фрагменты, написанные на Bob Kinney (+1), я хотел бы объяснить, что я считаю вероятной причиной вашей проблемы, что на самом деле не связанный с использованием службы маркеров безопасности AWS (STS), но включает в себя несколько тонкостей, часто встречающихся с Политика Amazon S3 IAM в целом:

Примеры политик для Amazon S3 охватывают различные варианты использования, похожие или связанные с вашими - в частности ваши примеры использования, по-видимому, включают пример 2: разрешить группе, чтобы иметь общую папку в Amazon S3 - вы эффективно реализовали это в первой политике первого фрагмента уже (modulo GetObjectVersion, DeleteObjectVersion, которые применимы только при использовании Версии объектов).

Теперь отсутствует ListBucket - обратите внимание на следующие тонкости:

  • Это относится к "Операции на ковшиках" , то есть операции, которые вы можете выполнять на Amazon S3 ведра, тогда как, например, GetObject относится к Операции над объектами, т.е. операции, которые вы можете выполнить на объектах Amazon S3 (кроме того, Операции в службе, в настоящее время только ListAllMyBuckets, который, скорее всего, не применим к вашему прецеденту).
  • Параметр prefix Ограничивает ответ на клавиши, начинающиеся с указанного префикса. Вы можете использовать префиксы для разделения ведра на разные наборы ключей способом, похожим на то, как файловая система использует папки. Это означает, что префикс не может содержать подстановочные знаки, или, скорее, * просто рассматривается как часть имени, см. Какие символы разрешены в ведре или имени объекта?.

Для многих случаев, подобных вашим, требуется два разных фрагмента политики для отдельного адреса объекта и операций, связанных с ведром, поэтому вам, вероятно, понадобится следующее:

AWS::STS::Policy.new do |policy|
  policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"],
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*"
  )

  policy.allow(
    actions: ["s3:ListBucket"],
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
  ).where(:s3_prefix).like("#{folder_path}/")
end

Ответ 2

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

Управление учетными данными для мобильных приложений

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

{ 
        "Statement":
        [
            {
              "Effect":"Allow",
              "Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"],
              "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__/__USERNAME__/*"
            },
            {
              "Effect":"Allow",
              "Action":"s3:ListBucket",
              "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__",
              "Condition":{"StringLike":{"s3:prefix":"__USERNAME__/"}}
            },
            {
              "Effect":"Deny",
              "Action":["sts:*", "iam:*", "sdb:*"],
              "Resource":"*"
            }
        ]
}

С первым 2 заявлениями, которые вас больше всего интересуют.

Надеюсь, что это поможет.