Использование префикса и разделителя aws s3 для разграничения "папок" и "файлов" с общим префиксом


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

Учитывая эти ключи в корзине s3 с именем "my-permtest":

/1/  
/1/a  
/1/2/b  
/1/3/c  

Как я могу правильно использовать префикс и разделитель, чтобы получить объекты, которые не заканчиваются на"/", (т. е.:"файлы").

Конечная цель состоит в том, чтобы применить эти знания к групповой политике IAM, предоставляющей ListBucket и getObject на /1/a, отказывая getObject или ListBucket /1/2/, 1/2/*, 1/3 и 1/3/*

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

В настоящее время я использую вызовы s3api и различные значения параметров префикса и разделителя, чтобы получить представление об их использовании вещи. Я читал и практиковался с этими ресурсами, но работа идет медленно, и помощь была бы очень признательна.

1 2

1 ответ:

Это на самом деле довольно просто, как только вы поймете, что папки не существуют сами по себе. объекты s3 - это пары ключ / значение. ключ-это "filename", представляющий полный путь, содержащий символы"/". значение ключа - это фактическое содержимое файла. Итак, объект s3 с ключом s3: / / my-bucket/1/2/a - это не файл с именем a в подпапке 1 с именем 2. Это объект с ключом, который выглядит как полный путь.

Зная это, и применяя понимание того, что * подстановочный знак может использоваться для сопоставления имен ключей в операторе apply или deny, когда написание политики эффективно отвечает на вопрос. Кроме того, для конкретных действий важно включить операторы allow/deny объекта с узкой областью действия или bucket.

Таким образом, в основном, чтобы разрешить get / put доступ к "папке" /1 / 2, но не к "файлу" 1/2/a, вам нужно разрешить действия списка на s3: / / bucket/1 / 2 и разрешить объекту get / put действия на s3:/ / bucket/1/2/*. Обратите внимание, что это ключ к пониманию важности отделять ваши действия объекта s3 и действия списка корзины s3 в к различным заявлениям внутри вашей политики.

Если вы хотите запретить доступ к s3: / / bucket/1/2/3/*, Вы бы добавили 2 заявления к той же политике. Первого списка отказа в доступе к С3://bucekt/1/2/3 второе отрицание есть доступ к объекту для S3://ведро/1/2/3*.

Теперь, если вы хотите разрешить некоторым людям доступ к s3: / / bucket/1/2/3/а вы окажетесь в затруднительном положении, если попытаетесь использовать эту политику, потому что s3://1/2/3/* было явно отказано. Любая политика, предоставляющая доступ, будет проигнорирована из-за этого явного запрета. Единственным вариантом было бы иметь две политики, которые почти идентичны. Один из них содержит оригинал allow to s3: / / bucket/1/2/3/* и другие, содержащие оригинал плюс запрет на доступ к списку s3: / / bucket/1/2/3/ и объект get / put access for s3: / / bucket/1/2/3/*. Люди без доступа к s3: / / ведро/1/2/3/* был бы в группе с явным отрицанием, и люди с доступ там будет в первой группе, которая просто имеет разрешение.

Это быстро выходит из-под контроля, когда есть много "вложенных папок" с различными группами, имеющими доступ к каждой. Обновление политики каждый раз, когда создается новая вложенная "подпапка", является несостоятельной парадигмой. По этой причине при использовании подхода, основанного на групповой политике IAM для защиты ресурсов s3, вы должны позаботиться о том, чтобы организовать данные в своих корзинах таким образом, чтобы вам не нужно было выполнять такого рода обслуживание.

Смотрите мой связанный ответздесь для подробной информации о том, что я имею в виду, но в основном избегайте создания вложенных папок с произвольными ограничениями того, кто может/не может получить к ним доступ. Вам будет трудно сказать: "Джо может получить доступ к 1/3/5 и 1/3/7, но не к 1/2/4 или 1/2/6. Гораздо легче двигаться./1/ /3/ и /5 / под / нечетным / и двигаться /2/ /4/ и /6 / под /четным/ тогда просто предоставьте ему доступ к /нечетному/*. вам даже не нужно указывать deny to / even/, потому что это неявно.