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

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

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

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

Ответ 1

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

Ответ 2

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

Как глазурью-пояснитель объяснил: "Вы можете либо перечислить все ведра, либо нет". Поэтому нам нужно приступить к работе. Справочная информация:

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

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

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

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

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

(2) используйте один контейнер с папками, специфичными для клиента

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

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

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

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

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

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

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

Ответ 3

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

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

Чтобы выполнить это, добавьте следующее в свой знак 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/

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Существует отличный способ разрешить пользователям доступ к определенному ведро без знания других ведер. Политика группы, подобная приведенной ниже, позволит пользователям видеть только "ведро a". Единственный улов в том, что пользователь сможет когда-либо получить доступ к ведру, если он подключается к данной конечной точке ведра. Для примера ниже будет 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

Ответ 7

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

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

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

{
"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 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. Если ваш клиент обращается к хранилищу, а не к ведро напрямую, вам нужен доступ к списку ведер в корне.

Ответ 8

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

{
  "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/*"]
    }
  ]
}

Ответ 9

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

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

Ответ 10

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

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

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

Ответ 11

Я нашел это решение:
AWS FLOW:
AWS FLOW

Политика ковша:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

Ответ 12

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

{
  "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 для проверки этого соединения.

Ответ 13

Пока невозможно ограничить действие 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 - ваши ковши для предоставления доступа для чтения и записи.

по теме:

Ответ 14

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

Например: s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}

Ответ 15

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

Эта политика позволяет моему пользователю перечислить, удалить, получить e файлы в определенном ведро 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/*"
        }
    ]
}

Ответ 16

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

{
  "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/*"
        ]
    }
  ]
}

Ответ 17

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

В IAM Group применяется следующая политика, и все пользователи находятся в этой группе. Вам нужно взять aws: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"
            ]
        }
    ]
}

Ответ 18

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

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}

Ответ 19

Нет, в настоящее время невозможно ограничить просмотр пользователями отдельных блоков под root или где-либо еще. У вас есть только эти 3 варианта прямо сейчас.

Я решил попросить клиента явно использовать имя корзины.

Ответ 20

Подобно тому, что другие описали выше:

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

Вот, однако, недостающий кусок. Хотя невозможно получить доступ к корзине через S3-> Home, можно получить доступ только к желаемой корзине по прямой ссылке.

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

Вы можете найти больше информации в следующем посте:

https://aws.amazon.com/premiumsupport/knowledge-center/S3-console-access-certain-bucket/

Ответ 22

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

 {    

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

}
]
}      

Ответ 23

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

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

Ответ 24

  • Создайте пользователя.
  • Нажмите на созданного пользователя в разделе IAM Management Screen.
  • Нажмите на добавить разрешения.
  • нажмите Прикрепить существующие политики напрямую.
  • нажмите на создать политику.
  • выберите json, вставьте ниже json, замените bucket_name на ваше имя bucket.
  • Это позволяет конкретному пользователю просматривать, размещать и получать объекты только этого сегмента.

{

{"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/*"
        ]
    }
]}

}