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

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

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

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

Ответы [ 22 ]

118 голосов
/ 05 августа 2011

Я пробовал это некоторое время и наконец нашел рабочее решение. Вы должны использовать разные «Ресурсы» в зависимости от того, какое действие вы выполняете. Также я включил некоторые пропущенные действия в предыдущий ответ (например, 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": {}
    }
  ]
}

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

28 голосов
/ 07 августа 2013

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

Как объяснил Cloudberryman: «Вы можете перечислить либо все ведра, либо ни одного», поэтому мы должны придумать обходной путь. Справочная информация:

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

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

(1) использовать загадочные имена сегментов, например, * 1009 Идентификаторы GUID *

Преимущество: простота настройки

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

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

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

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

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

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

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

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

Надеюсь, это помогло обработать S3 IAM так, как вам нужно.

22 голосов
/ 21 июня 2015

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

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

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

Полный URL-адрес входа (замените * 1009).* your-alias и имя_контакта ):

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/

19 голосов
/ 08 июля 2011

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

{
    "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": {}
        }
    ]
}
8 голосов
/ 13 июня 2016

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

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

5 голосов
/ 15 июня 2013

Не понимаете, почему не был проверен ответ?

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

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

{
"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": {}
}

Эта политика двух операторов , полученная из , дает только для чтениядоступ к корзине по адресу (arn:aws:s3:::your_bucket_here/) только для чтения , но все еще разрешает операции CRUD для содержимого корзины (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.Если ваш клиент обращается к хранилищу, а не к корзине напрямую, вам необходим доступ к списку корзин в корне.

5 голосов
/ 06 мая 2013

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

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_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
3 голосов
/ 28 марта 2017

Существует простой способ или обходной путь сделать это с помощью AWS Organizations. Организация 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/

Организация На странице моего аккаунта

3 голосов
/ 18 мая 2015

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

{
  "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/*"]
    }
  ]
}
2 голосов
/ 15 июня 2018

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

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

Где BucketName - имя корзины, к которой IAM имеет доступ

...