Я получаю промежуточное ПО на стороне клиента, но как мне защитить ресурсы пользователей на S3? - PullRequest
0 голосов
/ 07 октября 2018

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

Как я могу защитить ресурсы на S3, чтобы пользователь могтолько удалить свои ресурсы, а не ресурсы любого другого пользователя?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Возможно, вы могли бы сделать это с помощью списка контроля доступа Amazon S3 (ACL).ACL позволяют вам управлять доступом к корзинам и объектам.Каждый сегмент и объект имеют ACL, связанный с ним как подресурс.Он определяет, к каким учетным записям или группам AWS предоставляется доступ, и тип доступа.Когда к ресурсу поступает запрос, Amazon S3 проверяет соответствующий ACL, чтобы убедиться, что запрашивающая сторона имеет необходимые разрешения на доступ.

Когда вы создаете корзину или объект, Amazon S3 создает ACL по умолчанию, который предоставляетвладелец ресурса полностью контролирует ресурс.

API Amazon S3 позволяют вам устанавливать ACL при создании корзины или объекта.S3 также предоставляет API для установки ACL на существующую корзину или объект.Доступны следующие методы API:

  • Установка ACL с использованием заголовков запроса. Когда вы отправляете запрос на создание ресурса (корзины или объекта), вы устанавливаете ACL с использованием заголовков запроса.Используя эти заголовки, вы можете либо указать постоянный ACL, либо явно указать гранты (явно указав грантополучателя и разрешения).
  • Задать ACL с помощью тела запроса. Когда вы отправляете запрос на установку ACL для существующего ресурса, выможно установить ACL либо в заголовке запроса, либо в теле.

Пример ACL:

<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Owner>
    <ID>Owner-canonical-user-ID</ID>
    <DisplayName>display-name</DisplayName>
  </Owner>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID>Owner-canonical-user-ID</ID>
        <DisplayName>display-name</DisplayName>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>

    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID>user1-canonical-user-ID</ID>
        <DisplayName>display-name</DisplayName>
      </Grantee>
      <Permission>WRITE</Permission>
    </Grant>

    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID>user2-canonical-user-ID</ID>
        <DisplayName>display-name</DisplayName>
      </Grantee>
      <Permission>READ</Permission>
    </Grant>

    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
        <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> 
      </Grantee>
      <Permission>READ</Permission>
    </Grant>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
        <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI>
      </Grantee>
      <Permission>WRITE</Permission>
    </Grant>

  </AccessControlList>
</AccessControlPolicy>

Ссылка: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

0 голосов
/ 17 января 2019

Мне не нужна ситуация, когда пользователь случайно или злонамеренно удаляет ресурсы других пользователей

Когда вы настраиваете S3 Bucket, вы настраиваете разрешения, которые есть у любого человека.ваши ресурсы ведра.Если я не ошибаюсь, по умолчанию все рассматривается как «личное».

Вам также необходимо настроить пользователя IAM и предоставить ему доступ (через Политика ) разрешить ему читать, а также записывать данные в ваше ведро.Если вы делаете это правильно, только этот user может сделать важную вещь: написать.Вся эта «запись» ресурса (создание / обновление / удаление) должна выполняться на вашем сервере от имени этого «пользователя IAM» с ключом пользователя / секретными учетными данными.

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

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


В ответ на эту другую проблему:

Как я могу защитить ресурсы на S3, чтобы пользователь мог удалять только свои ресурсы, а не ресурсы любого другого пользователя?

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

Возможно, ваш вопрос идет в этом направлении:

Что если пользователь тролляхочет изменить чужую фотографию профиля, если у системы есть конечная точка, которая выглядит следующим образом? :

POST /users/{id}/update-photo

В этом случае вы можете позволить злоумышленнику (скажем, пользователь id равно 10) чтобы иметь доступ к чужому ресурсу:

/**
* he/she could do this:
*/
POST /users/23/update-photo  // <-- id=23
/**
* instead of:
*/
POST /users/10/update-photo  // <-- id=10

Как этого избежать?с проверкой подлинности и «маскировкой маршрута».

/**
* Instead of this:
*/
POST /users/23/update-photo // <-- user id=23
/**
* Try this kind of endpoint:
*/
POST /profile/update-photo // <-- note that we disabled the ability to specify a user id

Как распознать пользователя?В случае API через токен, в случае веб-вызова через сеанс.В этом примере для идентификации пользователя вы делаете что-то вроде этого:

public function updatePhoto(Request $request)
{
    $user = auth()->user(); // <-- now we ensure the user is id=10

    // the rest of the code..
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...