Политика AWS S3 IAM для ограничения одной вложенной папки

#amazon-web-services #amazon-s3 #permissions #amazon-iam

#amazon-web-services #amazon-s3 #разрешения #amazon-iam

Вопрос:

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

Текущая политика IAM JSON, которая ограничивается папкой верхнего уровня:

 {
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObjectTagging"
        ],
        "Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*"
    }]
}
  

Предлагаемая политика IAM JSON, которая, как я ожидал, будет дополнительно ограничивать putObject только в указанной папке, но, похоже, это не позволяет загружать какие-либо объекты?:

 {
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObjectTagging"
        ],
        "Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*",
        "Condition": {
            "StringEquals": {
                "s3:prefix": [
                    "",
                    "[MY_FOLDER]/"
                ],
                "s3:delimiter": [
                    "/"
                ]
            }
        }
    }]
}
  

Ожидаемые результаты

  • РАЗРЕШИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].csv
  • РАЗРЕШИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].parquet
  • РАЗРЕШИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
  • ЗАПРЕТИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MYFOLDER2]/[MY_FILE].txt
  • ЗАПРЕТИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MY_FILE].txt
  • ЗАПРЕТИТЬ arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[…N папок]/[MY_FILE].txt

Комментарии:

1. Если вы разрешаете загрузку с определенным префиксом, например users/gbeaven/* , вы не можете запретить загрузку в «папки» под этим, например users/gbeaven/dogs/snoopy.png , по крайней мере, не используя политики IAM или корзины.

2. @jarmod Как бы вы выполнили то, что я пытаюсь сделать тогда? Я не чувствую, что это должно быть так сложно. У меня есть код, который зависит от первой «папки» ключа. Если пользователь случайно загрузит более одного ключа, код будет удален. С учетом сказанного представляется разумным обрабатывать проверку с помощью политики IAM вместо кода.

3. Вы не можете сделать это в политике корзины IAM или S3 afaik, поэтому, если вы дадите пользователю IAM fred разрешение на загрузку users/fred/* , тогда fred сможет создать что-либо ниже этого. Все, что вы можете сделать, это отреагировать на это, например, запустив лямбда-функцию, которая перемещает файлы или удаляет их, или что-то еще. Другой вариант, который у вас есть, вместо предоставления этим пользователям неограниченного доступа к префиксу S3, — это предоставить им предварительно подписанные URL-адреса. Затем вы диктуете ключи, на которые они могут загружать (но это может быть непрактично, если ваши пользователи не взаимодействуют с S3 через приложение, которым вы управляете).

4. Возможно, стоит понять, почему вы не хотите разрешать своим пользователям создавать свои собственные «подпапки» и управлять собственной иерархией файлов под выделенным им префиксом? Почему это проблема для вашего варианта использования?

5. Потому что в нашем случае пользователю не нужны вложенные папки. Ожидается, что пользователь загрузит файлы в корзину для загрузки данных в «свою» папку, после чего запускается лямбда-скрипт и классифицирует / помещает данные в наш каталог данных. Если пользователь всегда размещает в правильном месте, мне не нужно обрабатывать какие-либо ошибки пользователя в коде. Если пользователь случайно загружает несколько папок глубоко, не имея возможности ограничить доступ до 1 подпапки и выдает пользователю ошибку «доступ запрещен», файл загрузится автоматически, но будет обработан кодом. Просто кажется интуитивно понятным, что это может быть обработано политикой IAM.

Ответ №1:

В Amazon S3 нет «папок», как в файловой системе. То, что вы видите как папки, на самом деле является просто префиксом к имени файла. Как работает Amazon S3, вы можете ограничить доступ к определенным префиксам, но не можете ограничить создание дополнительных префиксов под ними.

Однако вы можете реализовать свои требования, используя события Amazon S3 и лямбда-функцию. Процесс может выглядеть следующим образом:

1. Пользователь сохраняет файл в Amazon S3

2. Amazon S3 отправляет уведомление о событии, содержащее метаданные, включая ключ объекта (который представляет имя файла), включая префиксы (которые представляют папки).

3. Лямбда-функция, запускаемая событием S3 и обрабатывающая метаданные с помощью:

  • проверка имени файла на наличие последующих косых черт ( / ) после разрешенного префикса (который указывает на «вложенную папку»)
  • удаление созданного файла, если он содержит последующие косые черты

Комментарии:

1. Правильно, это то, что я сейчас делаю, но это «молча» обрабатывает загруженные файлы, даже если они загружены неправильно через CLI. Да, я мог бы настроить оповещения SNS, но это похоже на пластырь на пластыре.. Для меня не имеет смысла, что политики будут обрабатывать только префиксы..

2. Если вам не хватает определенных функций, пожалуйста, используйте функцию обратной связи в консоли управления AWS (на каждой странице в правом нижнем углу), чтобы отправлять запросы функций сервисным группам. 90% функций AWS основаны на реальных запросах клиентов. Кто знает, может быть, есть способ реализовать то, что вам нужно.