Существует ли политика S3 для ограничения доступа только для просмотра / доступа к одному ведру?

У меня есть простой ковш, который выглядит как images.mysite.com на моем S3 и других ведрах, содержащих резервные копии и т. Д.

Я хочу, чтобы конкретный пользователь мог получить доступ к images.mysite.com для загрузки изображений. Однако я НЕ хочу, чтобы он видел какие-то другие ведра; даже если они существуют.

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

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

Следующая политика IAM работает для меня сейчас:

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::itnighq", "Condition": {} }, { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectVersionAcl" ], "Resource": "arn:aws:s3:::itnighq/*", "Condition": {} }, { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*", "Condition": {} } ] } 

Действия в отношении ведра и объектов, относящихся к объектам, должны иметь разные значения arn.

Наш прецедент: Предоставьте резервное пространство для клиентов нашего облачного приложения, к которым клиенты могут напрямую обращаться, используя общие инструменты S3. Конечно, ни один клиент не должен видеть, что другие клиенты имеют.

Как выяснил туманный человек, «вы можете либо перечислить все ведра, либо нет», поэтому нам нужно придумать работу. Задний план:

Предоставление прав ListAllMyBuckets пользователю необходимо, чтобы консоль AWS S3 или S3Fox подключались без сообщения об ошибке. Но ListAllMyBuckets перечисляет все ведра, аспекты распределенных ресурсов (фактически, работает только arn: … ::: *). Это серьезная ошибка, если вы спросите меня. Btw. отказ ListBucket для всех ковшей не помешает им быть перечисленными, поскольку ListBucket предоставляет права на перечисление содержимого ведра.

Есть три возможности, которые я рассматривал как работу. Я выбрал последний.

(1) использовать имена криптовальных ведер, например GUID

Преимущество: легко настроить

Недостаток: трудно управлять, особенно для клиента. (представьте, чтобы найти конкретный GUID среди тысяч других.) Также показывает количество ковшей = количество клиентов, использующих службу резервного копирования.

(2) использовать один ведро с конкретными папками клиента

Таким образом, Amazon предлагает своим примерам S3 / IAM предоставить пространство для доступа только определенным пользователям или группам пользователей. См. Пример: Правила использования IAM в AWS

Преимущество: довольно легко настроить, идет с идеями AWS

Недостаток: заставляет публиковать все ведра, поэтому клиент может найти свое «домашнее» ведро. Учет AWS обеспечивает статистику использования ведра, но не использования папок, что затрудняет расчет стоимости клиентом.

(3) не предоставляют права доступа для ListAllMyBuckets

Преимущество: вы получаете то, что хотите: клиенты не могут видеть ведра других клиентов

Недостаток: клиент не может видеть свое ведро. S3Browser поставляется с хорошим сообщением «не могу» и просит ввести имя ведра. S3Fox выдает сообщение об ошибке при подключении к корню, но допускает прямую навигацию к ведерке клиента, если имя ведра известно. Консоль Amazon S3 не работает вообще.

Надеюсь, это помогло справиться с S3 IAM по мере необходимости.

Попробуйте эту политику. также учитывайте, что нет способа разрешить пользователю перечислить только выбранный ковш. Вы можете либо перечислить все ведра, либо нет.

 { "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectAcl", "s3:PutObjectAcl", "s3:ListBucket", "s3:GetBucketAcl", "s3:PutBucketAcl", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::your_bucket_here/*", "Condition": {} }, { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*", "Condition": {} } ] } 

Невозможно предоставить доступ к консоли S3 без предоставления разрешения ListAllMyBuckets .

В моем случае (и, возможно, ваш, будущий читатель) приемлемой альтернативой является redirect пользователей при входе непосредственно в ведро, которое вы хотели бы видеть.

Для этого добавьте следующее к знаку IAM в url: /s3/?bucket=bucket-name

Полный URL входа (замените свой псевдоним и имя ведра ):

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

Политика IAM (заменить имя ведра ):

 { "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "arn:aws:s3:::*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] } 

Для получения дополнительной информации о том, как создавать специальные разрешения для пользователей, читайте этот блог: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam /

Я интерпретирую этот вопрос так: «Могу ли я разрешить доступ к одному ведру, где любые другие ведра не будут доступны и, следовательно, невидимы». Потому что, показывая имя ведра, которому не был предоставлен доступ, все равно приравнивается к утечке информации.

И правильный ответ – нет. Требуемое разрешение – ListAllMyBuckets, которое позволит пользователю видеть ВСЕ ведра. Если оставить это разрешение, консоль будет недоступна.

Существует отличный способ разрешить пользователям доступ к определенному ведро без знания других ведер. Политика группы, подобная приведенной ниже, позволит пользователям видеть только «ведро a». Единственный улов в том, что пользователь сможет когда-либо получить доступ к ведру, если он подключается к данной конечной точке ведра. Для примера ниже будет bucket-a.s3.amazonaws.com. В ведро также может быть допущен «Аутентифицированные пользователи».

 { "Statement": [ { "Sid": "", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::bucket-a" ] }, { "Sid": "", "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::bucket-a/*" ] } ] } 

Этот метод был протестирован с Cyberduck на Mac OS / X и с использованием пакета s3cmd

 ./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat ion=ap-southeast-2 

Смутно, почему ответ не был проверен?

Давайте разберем каждое заявление политики из вышеперечисленных решений:

Это заявление политики относится к содержимому ведра, но не к самому баку. Вероятно, это не тот вопрос, о котором спросили, потому что вы не можете видеть, что находится в ведре.

 { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectAcl", "s3:PutObjectAcl", "s3:ListBucket", "s3:GetBucketAcl", "s3:PutBucketAcl", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::your_bucket_here/*", "Condition": {} } 

Эта две политики операторов, полученные на основе readonly доступа к ведро в ( arn:aws:s3:::your_bucket_here/ ) только для чтения , но все же позволяют CRUD ops на содержимом ковша ( arn:aws:s3:::your_bucket_here/* ).

 { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::your_bucket_here", "Condition": {} }, { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectAclVersion" ], "Resource": "arn:aws:s3:::your_bucket_here/*", "Condition": {} } 

Однако политика включает приведенное ниже заявление, которое позволяет пользователю видеть все ведра в конечной точке. Вероятно, это не тот вопрос, о котором идет речь.

 { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*", "Condition": {} } 

Тем не менее, это очень полезно, если вы используете клиента, который просматривает хранилище S3. Если ваш клиент обращается к хранилищу, а не к ведру напрямую, вам нужен доступ к списку ведер в корне.

Вероятно, самый простой вариант использования:

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

Существует простой способ или обходное решение для этого, используя организации AWS. Организация AWS позволяет вам иметь несколько учетных записей пользователей. У вашей основной учетной записи может быть несколько учетных записей AWS (Sub) и какие сервисы (s3 / EC2 / *) добавляются в зависимости от того, какие учетные записи AWS будут отображаться только в этих ресурсах.

Пожалуйста, обратитесь к https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/.

Организация на странице моей учетной записи

Мне удалось добиться следующих результатов. Предположим, что перечисление других ковшей получило сообщение «Отказано в доступе». Но я все еще мог видеть ведро, которое я хотел, если бы я связался с именем ведра, установленным как путь.

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::test" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::test"] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": ["arn:aws:s3:::test/*"] } ] } 

Я использовал Cyberduck для проверки этого соединения.

Хотя невозможно ограничить действие s3:ListAllMyBuckets конкретными s3:ListAllMyBuckets , так как для обходного пути вы можете отправить им URL-адрес Консоли для определенного ведра, например

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

Источник: ограничивающий список кодов S3 из консоли S3

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

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::my-bucket-1", "arn:aws:s3:::my-bucket-2" ] }, { "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectVersionAcl" ], "Resource": [ "arn:aws:s3:::my-bucket-1/*", "arn:aws:s3:::my-bucket-2/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" } ] } 

Где my-bucket-1 и my-bucket-2 – ваши ведра, чтобы дать доступ на чтение и запись.

Связанный:

  • Написание политик IAM: предоставление доступа к ведро Amazon S3
  • Ограничить список ковшей для конкретного пользователя
  • Как предоставить пользователю доступ только к определенному ведру в AWS S3?
  • Указание ресурсов в политике и разрешениях, связанных с ведровыми операциями

Как было хорошо сказано выше, перечисление только одного ведра на консоли невозможно. Но если доступ к веществу S3 привязан к IAM, IAM может получить прямой доступ к ведру, если доступен URL-адрес для ведра. S3 bucket url будет выглядеть так:

https://s3.console.aws.amazon.com/s3/buckets/BucketName

Где BucketName – это имя ведра. IAM имеет доступ к

Решение для меня работало. Я хотел, чтобы политика предоставляла доступ определенному пользователю my_iam_user к определенному ведро my-s3-bucket .

Эта политика позволяет моему пользователю перечислить, удалить, получить файлы e put в определенном ведро s3.

 { "Version": "2012-10-17", "Statement": [ { "Sid": "ListBucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/my_iam_user" }, "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::my-s3-bucket" }, { "Sid": "AddDeleteFiles", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/my_iam_user" }, "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::my-s3-bucket/*" } ] } 

Я просто добавляю подобную потребность, решая это:

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:Put*", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-bucket-name", "arn:aws:s3:::my-bucket-name/*" ] } ] } 

Я использую следующие вещи, чтобы скрыть содержимое ведра от других пользователей. Это не только помогает скрыть другие ведра (не используйте ListAllMyBuckets), но также папки в том же ведре, когда вы делаете один ковш, но хотите иметь подпапки, в которых назначаются соответствующие разрешения для IAM User / subfolder.

Следующая политика применяется к IAM Group, и все пользователи находятся в этой группе. Вам нужно взять aws:userid и сделать подпапку с тем же именем в ведре.

UserID может быть взят: aws iam get-user --user-name "user_name_for_folder_access":

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::bucket_name/${aws:userid}/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket_name" ] } ] } 

Добавьте предложение Deny для ведра (ов), к которому вы не хотите получать доступ. Помните, что они все еще могут быть перечислены, но вы не сможете получить доступ к содержимому внутри них.

 {
     «Версия»: «2012-10-17»,
     "Утверждение": [
         {
             «Эффект»: «Разрешить»,
             «Действие»: «s3: *»,
             «Ресурс»: «*»
         },
         {
             «Эффект»: «Отклонить»,
             «Действие»: «s3: *»,
             «Ресурс»: [
                 "ARN: AWS: s3 ::: ковшового имя",
                 "ARN: AWS: s3 ковшового имя ::: / *"
             ]
         }
     ]
 }

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

  { "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectAcl", "s3:PutObjectAcl", "s3:ListBucket", "s3:GetBucketAcl", "s3:PutBucketAcl", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::mybucketname/*", "Condition": {} }, { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*", "Condition": {} }, { "Effect": "Deny", "Action": [ "s3:DeleteBucket", "s3:DeleteBucketPolicy", "s3:DeleteBucketWebsite", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::mybucketname/*", "Condition": {} } ] } 

Хорошее простое решение, с которым мы столкнулись, – заблокировать пользователя для входа в корневой каталог. Поэтому они должны войти в систему с удаленным путём, установленным в нужную папку.

  { "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::folder-name*", "Condition": {} } ] } 
  • Создайте пользователя.
  • Нажмите на созданного пользователя в окне «Управление IAM».
  • Нажмите «Добавить разрешения».
  • нажмите «Привязать существующие политики напрямую».
  • нажмите кнопку «Создать политику».
  • выберите json, вставьте под json вместо bucket_name имя вашего ведра.
  • Это позволяет конкретному пользователю просматривать, размещать и получать объекты только этого ведра.

{

 {"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::bucket_name" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::bucket_name/*" ] } ]} 

}

Interesting Posts

UITableview с более чем одной пользовательской ячейкой с Swift

Бесплатная программа для синхронизации папки с FTP?

Как получить имя classа из объекта C ++?

Общая информация AssemblyInfo для единообразного управления версиями в решении

Программно запускать событие onmouseover в JavaScript

Почему я не могу ссылаться на System.ComponentModel.DataAnnotations?

Каков конечный почтовый индекс и регулярное выражение zip?

Инструмент для сравнения 2 двоичных файлов в Windows

Каков наилучший способ сделать математику с фиксированной запятой?

Объединение нескольких заданий MapReduce в Hadoop

Объявления переменных в файлах заголовков – статические или нет?

Практическое использование для «внутреннего» ключевого слова в C #

Как я могу использовать JQuery для публикации данных JSON?

Попытка настроить домашний сервер, но не в состоянии настроить IP-пересылку

Для каждого цикла с элементами управления и представления формы (Html.BeginForm) в MVC 4

Давайте будем гением компьютера.