it-roy-ru.com

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

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

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

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

98
Alex

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

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

116
rogercampos

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

25
Andreas Stankewitz

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

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

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

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

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

URL полного входа (замените your-alias и bucket-name):

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

Политика IAM (замените bucket-name):

{
    "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 -я/

13
BFar

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

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

6
user6133521

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

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

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

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

6
Donal Lafferty

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

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

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

3
Shaik Ismail

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

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

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

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

2
codeplay

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

Связанные с:

1
kenorb

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

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

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

1
Ishan Tomar

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

Следующая политика применяется к 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"
            ]
        }
    ]
}
0
Andrii Starikov

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

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

0
foggy_glasses

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

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

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

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

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

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

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

 {    

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

}
]
}      
0
s. tait

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

Например: 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"
}
0
Lam